"use client"; import { useState, useCallback, useTransition } from "react"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { toast } from "sonner"; import { Search } from "lucide-react"; import { useDataTable } from "@/hooks/use-data-table"; import { getPackageColumns, type PackageRow } from "./package-columns"; import { PackageFilesDrawer } from "./package-files-drawer"; import { IngestionStatus } from "./ingestion-status"; import { SkippedPackagesTab } from "./skipped-packages-tab"; 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 { PageHeader } from "@/components/shared/page-header"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Badge } from "@/components/ui/badge"; import type { IngestionAccountStatus } from "@/lib/telegram/types"; import type { SkippedRow } from "./skipped-columns"; import { updatePackageCreator, updatePackageTags } from "../actions"; interface StlTableProps { data: PackageRow[]; pageCount: number; totalCount: number; ingestionStatus: IngestionAccountStatus[]; availableTags: string[]; searchTerm: string; skippedData: SkippedRow[]; skippedPageCount: number; skippedTotalCount: number; } export function StlTable({ data, pageCount, totalCount, ingestionStatus, availableTags, searchTerm, skippedData, skippedPageCount, skippedTotalCount, }: StlTableProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const [searchValue, setSearchValue] = useState(searchParams.get("search") ?? ""); const [viewPkg, setViewPkg] = useState(null); const [, startTransition] = useTransition(); 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 updateTagFilter = useCallback( (value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value && value !== "all") { params.set("tag", value); params.set("page", "1"); } else { params.delete("tag"); } router.push(`${pathname}?${params.toString()}`, { scroll: false }); }, [router, pathname, searchParams] ); const activeTab = searchParams.get("tab") ?? "packages"; const updateTab = useCallback( (value: string) => { const params = new URLSearchParams(searchParams.toString()); if (value === "packages") { params.delete("tab"); } else { params.set("tab", value); } params.set("page", "1"); router.push(`${pathname}?${params.toString()}`, { scroll: false }); }, [router, pathname, searchParams] ); const columns = getPackageColumns({ onViewFiles: (pkg) => setViewPkg(pkg), searchTerm, onSetCreator: (pkg) => { const value = prompt("Enter creator name:", pkg.creator ?? ""); if (value === null) return; startTransition(async () => { const result = await updatePackageCreator(pkg.id, value || null); if (result.success) { toast.success(value ? `Creator set to "${value}"` : "Creator removed"); router.refresh(); } else { toast.error(result.error); } }); }, onSetTags: (pkg) => { const value = prompt( "Enter tags (comma-separated):", pkg.tags.join(", ") ); if (value === null) return; const tags = value.split(",").map((t) => t.trim()).filter(Boolean); startTransition(async () => { const result = await updatePackageTags(pkg.id, tags); if (result.success) { toast.success(tags.length > 0 ? `Tags updated` : "Tags removed"); router.refresh(); } else { toast.error(result.error); } }); }, }); const { table } = useDataTable({ data, columns, pageCount }); const activeTag = searchParams.get("tag") ?? ""; return (
Packages Skipped / Failed {skippedTotalCount > 0 && ( {skippedTotalCount} )}
updateSearch(e.target.value)} className="pl-9 h-9" />
{availableTags.length > 0 && ( )}
{ if (!open) setViewPkg(null); }} highlightTerm={searchTerm} />
); }