import type { LinksFunction, LoaderArgs } from "@remix-run/node"; import { Main } from "~/components/Main"; import type { SendouRouteHandle } from "~/utils/remix"; import { navIconUrl, userPage, USER_SEARCH_PAGE } from "~/utils/urls"; import styles from "~/styles/u.css"; import { Input } from "~/components/Input"; import { SearchIcon } from "~/components/icons/Search"; import { db } from "~/db"; import { Link, useLoaderData, useSearchParams } from "@remix-run/react"; import { useDebounce } from "react-use"; import * as React from "react"; import { Avatar } from "~/components/Avatar"; import { discordFullName } from "~/utils/strings"; import { useTranslation } from "~/hooks/useTranslation"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; }; export const handle: SendouRouteHandle = { i18n: ["user"], breadcrumb: () => ({ imgPath: navIconUrl("u"), href: USER_SEARCH_PAGE, type: "IMAGE", }), }; export const loader = ({ request }: LoaderArgs) => { const url = new URL(request.url); const input = url.searchParams.get("q"); if (!input) return null; return { users: db.users.search(input), input }; }; export default function UserSearchPage() { const [searchParams, setSearchParams] = useSearchParams(); const [inputValue, setInputValue] = React.useState( searchParams.get("q") ?? "" ); useDebounce( () => { if (!inputValue) return; setSearchParams({ q: inputValue }); }, 1500, [inputValue] ); return (
} value={inputValue} onChange={(e) => setInputValue(e.target.value)} />
); } function UsersList() { const { t } = useTranslation(["user"]); const data = useLoaderData(); if (!data) { return
{t("user:search.info")}
; } if (data.users.length === 0) { return (
{t("user:search.noResults", { query: data.input })}
); } return ( ); }