import { keepPreviousData, useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect, useState } from "react"; import { adminApproveWaitlist, getAdminWaitlist } from "~/fns/admin"; import { useAction } from "~/hooks/use-action"; import { Button } from "~/ui/Button"; import { ErrorBanner } from "~/ui/Callout"; import { EmptyState } from "~/ui/EmptyState"; import { compactInputClass } from "~/ui/Field"; import { RelativeTime } from "~/ui/RelativeTime"; const STATUSES = [ { value: "all", label: "Everyone" }, { value: "waiting", label: "Waiting" }, { value: "invited", label: "Invited" }, { value: "approved", label: "Approved" }, ] as const; type Status = (typeof STATUSES)[number]["value"]; const SEARCH_DEBOUNCE_MS = 250; export const WAITLIST_KEY = ["admin", "waitlist"] as const; /** The waitlist in line order, searchable by email and filterable by status, with "Let in" per person. */ export function WaitlistTable() { const [search, setSearch] = useState(""); const [query, setQuery] = useState(""); const [status, setStatus] = useState("all"); const [page, setPage] = useState(1); const queryClient = useQueryClient(); const approve = useAction(adminApproveWaitlist); useEffect(() => { const timer = setTimeout(() => { setQuery(search.trim()); setPage(1); }, SEARCH_DEBOUNCE_MS); return () => clearTimeout(timer); }, [search]); const list = useQuery({ queryKey: [...WAITLIST_KEY, query, status, page], queryFn: () => getAdminWaitlist({ data: { query, status, page } }), placeholderData: keepPreviousData, }); const data = list.data; const pages = data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1; async function letIn(id: number) { if (await approve.run({ data: { id } })) await queryClient.invalidateQueries({ queryKey: WAITLIST_KEY }); } return (
setSearch(event.target.value)} /> {data && {data.total} matching}
{data && data.rows.length === 0 ? ( ) : (
    {data?.rows.map((row) => (
  1. {row.email} {row.expiresAt ? ( <> {row.approved ? "approved" : "invited"}, expires ) : ( <> joined )} {!row.approved && ( )}
  2. ))}
)} {pages > 1 && (
Page {page} of {pages}
)}
); }