"use client"; import { flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import { RefreshCw, Users } from "lucide-react"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useMemo, useState } from "react"; import { errorToast } from "../../../../components"; import { SectionHeader } from "../../../../components/typography"; import { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "../../../../shadcnui"; import { showToast } from "../../../../utils/toast"; import { WaitlistInterface } from "../../data/WaitlistInterface"; import { WaitlistService } from "../../data/WaitlistService"; import { useWaitlistTableStructure } from "../../hooks/useWaitlistTableStructure"; export function WaitlistList() { const t = useTranslations(); const [entries, setEntries] = useState([]); const [total, setTotal] = useState(0); const [isLoading, setIsLoading] = useState(true); const [statusFilter, setStatusFilter] = useState("all"); const loadEntries = useCallback(async () => { setIsLoading(true); try { const result = await WaitlistService.findMany({ status: statusFilter === "all" ? undefined : statusFilter, fetchAll: true, }); setEntries(result); setTotal(result.length); } catch (error) { errorToast({ error }); } finally { setIsLoading(false); } }, [statusFilter]); useEffect(() => { loadEntries(); }, [loadEntries]); const handleInvite = async (entry: WaitlistInterface) => { try { await WaitlistService.invite(entry.id); showToast(t("waitlist.admin.invite_sent", { email: entry.email })); loadEntries(); } catch (error) { errorToast({ error }); } }; const columns = useWaitlistTableStructure({ onInvite: handleInvite }); const statusItems = useMemo( () => ({ all: t("waitlist.admin.all_statuses"), pending: t("waitlist.admin.status.pending"), confirmed: t("waitlist.admin.status.confirmed"), invited: t("waitlist.admin.status.invited"), registered: t("waitlist.admin.status.registered"), }), [t], ); const table = useReactTable({ data: entries, columns, getCoreRowModel: getCoreRowModel(), }); return (
{/* Header */}
{t("waitlist.admin.title")} ({t("waitlist.admin.entries_count", { count: total })})
{/* Status Filter */} {/* Refresh Button */}
{/* Table */}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ))} ))} {isLoading ? ( {t("waitlist.admin.loading")} ) : entries.length === 0 ? ( {t("waitlist.admin.empty")} ) : ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) )}
); }