130 lines · 4.6 KB
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<Status>("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],