"use client"; import { ColumnDef } from "@tanstack/react-table"; import { Send } from "lucide-react"; import { useTranslations } from "next-intl"; import { Badge, Button } from "../../../shadcnui"; import { WaitlistInterface, WaitlistStatus } from "../data/WaitlistInterface"; interface UseWaitlistTableStructureProps { onInvite: (entry: WaitlistInterface) => void; } /** * Parse questionnaire JSON string safely */ function parseQuestionnaire(questionnaire: string | undefined): Record | null { if (!questionnaire) return null; try { return JSON.parse(questionnaire); } catch { return null; } } export function useWaitlistTableStructure({ onInvite, }: UseWaitlistTableStructureProps): ColumnDef[] { const t = useTranslations(); const getStatusBadge = (status: WaitlistStatus) => { const variants: Record = { pending: { variant: "secondary" }, confirmed: { variant: "default" }, invited: { variant: "outline" }, registered: { variant: "default" }, }; const config = variants[status]; return {t(`waitlist.admin.status.${status}`)}; }; return [ { accessorKey: "email", header: t("waitlist.admin.columns.email"), cell: ({ row }) => {row.original.email}, }, { accessorKey: "status", header: t("waitlist.admin.columns.status"), cell: ({ row }) => getStatusBadge(row.original.status), }, { accessorKey: "createdAt", header: t("waitlist.admin.columns.submitted"), cell: ({ row }) => { if (!row.original.createdAt) return "-"; return new Date(row.original.createdAt).toLocaleDateString(); }, }, { accessorKey: "questionnaire", header: t("waitlist.admin.columns.questionnaire"), cell: ({ row }) => { // IMPORTANT: Parse JSON string from backend const questionnaire = parseQuestionnaire(row.original.questionnaire); if (!questionnaire || Object.keys(questionnaire).length === 0) { return -; } return (
{t("waitlist.admin.questionnaire.view_answers")}
{Object.entries(questionnaire).map(([key, value]) => (
{key}:{" "} {Array.isArray(value) ? value.join(", ") : String(value)}
))}
); }, }, { id: "actions", header: t("waitlist.admin.columns.actions"), cell: ({ row }) => { const entry = row.original; if (entry.status === "confirmed") { return ( ); } if (entry.status === "invited" && entry.invitedAt) { return ( {t("waitlist.admin.actions.invited_on", { date: new Date(entry.invitedAt).toLocaleDateString() })} ); } if (entry.status === "registered") { return {t("waitlist.admin.actions.registered")}; } return ( {t("waitlist.admin.actions.awaiting_confirmation")} ); }, }, ]; }