"use client"; import { useState, useCallback, useTransition } from "react"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { Plus, Search } from "lucide-react"; import { toast } from "sonner"; import { useDataTable } from "@/hooks/use-data-table"; import { getKickstarterColumns, type KickstarterRow } from "./kickstarter-columns"; import { KickstarterModal } from "./kickstarter-modal"; import { deleteKickstarter } from "../actions"; import { DataTable } from "@/components/shared/data-table"; import { DataTablePagination } from "@/components/shared/data-table-pagination"; import { DataTableViewOptions } from "@/components/shared/data-table-view-options"; import { DeleteDialog } from "@/components/shared/delete-dialog"; import { PageHeader } from "@/components/shared/page-header"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; interface HostOption { id: string; name: string; _count: { kickstarters: number }; } interface KickstarterTableProps { data: KickstarterRow[]; pageCount: number; totalCount: number; hosts: HostOption[]; } export function KickstarterTable({ data, pageCount, totalCount, hosts, }: KickstarterTableProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const [isPending, startTransition] = useTransition(); const [modalOpen, setModalOpen] = useState(false); const [editKickstarter, setEditKickstarter] = useState(); const [deleteId, setDeleteId] = useState(null); const [searchValue, setSearchValue] = useState(searchParams.get("search") ?? ""); const updateSearch = useCallback( (value: string) => { setSearchValue(value); const params = new URLSearchParams(searchParams.toString()); if (value) { params.set("search", value); params.set("page", "1"); } else { params.delete("search"); } router.push(`${pathname}?${params.toString()}`, { scroll: false }); }, [router, pathname, searchParams] ); const updateFilter = useCallback( (key: string, value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value && value !== "all") { params.set(key, value); params.set("page", "1"); } else { params.delete(key); } router.push(`${pathname}?${params.toString()}`, { scroll: false }); }, [router, pathname, searchParams] ); const columns = getKickstarterColumns({ onEdit: (kickstarter) => { setEditKickstarter(kickstarter); setModalOpen(true); }, onDelete: (id) => setDeleteId(id), }); const { table } = useDataTable({ data, columns, pageCount }); const handleDelete = () => { if (!deleteId) return; startTransition(async () => { const result = await deleteKickstarter(deleteId); if (result.success) { toast.success("Kickstarter deleted"); setDeleteId(null); } else { toast.error(result.error); } }); }; const activeDelivery = searchParams.get("delivery") ?? ""; const activePayment = searchParams.get("payment") ?? ""; const activeHost = searchParams.get("host") ?? ""; return (
updateSearch(e.target.value)} className="pl-9 h-9" />
{hosts.length > 0 && ( )}
{ setModalOpen(open); if (!open) setEditKickstarter(undefined); }} hosts={hosts} kickstarter={editKickstarter} /> !open && setDeleteId(null)} title="Delete Kickstarter" description="This will permanently delete this kickstarter and unlink any associated packages." onConfirm={handleDelete} isLoading={isPending} />
); }