"use client"; import { Pencil, Trash2 } from "lucide-react"; import { useTranslations } from "next-intl"; import { deleteEvent } from "@/actions/events"; import { useConfirmDialog } from "@/components/admin/confirm-dialog"; import { DataTable } from "@/components/admin/data-table"; import Link from "@/components/link"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { useServerAction } from "@/hooks/use-server-action"; import type { DataTableColumn, PaginatedResult } from "@/types/common"; interface EventRow { id: number; title: string; typeName: string; typeColor: string; startsAt: Date; endsAt: Date | null; status: string; hostUserId: number; } const statusVariants: Record< string, "default" | "secondary" | "outline" | "destructive" > = { published: "default", draft: "secondary", cancelled: "destructive", completed: "outline", }; interface EventsTableProps { data: PaginatedResult; } export function EventsTable({ data }: EventsTableProps) { const t = useTranslations("pages.admin.events"); const { run, isPending } = useServerAction(); const { confirm, dialog: confirmDialog } = useConfirmDialog(); const statusLabel: Record = { published: t("statusPublished"), draft: t("statusDraft"), cancelled: t("statusCancelled"), completed: t("statusCompleted"), }; async function handleDelete(row: EventRow) { const ok = await confirm({ title: "Delete event", description: `Delete "${row.title}"? This cannot be undone.`, confirmLabel: "Delete", cancelLabel: "Cancel", }); if (!ok) return; run(() => deleteEvent({ id: row.id }), { successMessage: "Event deleted!", errorMessage: "Failed to delete event.", }); } const columns: DataTableColumn[] = [ { key: "id", label: t("colId"), sortable: true }, { key: "title", label: t("colTitle"), sortable: true, render: (value) => {String(value)}, }, { key: "typeName", label: t("colType"), sortable: false, render: (_, row) => ( {row.typeName} ), }, { key: "startsAt", label: t("colStarts"), sortable: true, render: (value) => ( {new Date(value as unknown as string).toLocaleString()} ), }, { key: "status", label: t("colStatus"), sortable: true, render: (value) => { const key = String(value); return ( {statusLabel[key] ?? key} ); }, }, { key: "actions", label: t("colActions"), render: (_, row) => (
), }, ]; return ( <> {confirmDialog} ); }