diff --git a/src/app/(app)/stls/_components/package-columns.tsx b/src/app/(app)/stls/_components/package-columns.tsx index 146bcec..7adf80e 100644 --- a/src/app/(app)/stls/_components/package-columns.tsx +++ b/src/app/(app)/stls/_components/package-columns.tsx @@ -1,7 +1,7 @@ "use client"; import { type ColumnDef } from "@tanstack/react-table"; -import { FileArchive, Eye, ImageIcon } from "lucide-react"; +import { FileArchive, Eye, Pencil } from "lucide-react"; import { DataTableColumnHeader } from "@/components/shared/data-table-column-header"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -26,6 +26,7 @@ export interface PackageRow { interface PackageColumnsProps { onViewFiles: (pkg: PackageRow) => void; + onSetCreator: (pkg: PackageRow) => void; } function formatBytes(bytesStr: string): string { @@ -57,6 +58,7 @@ function PreviewCell({ pkg }: { pkg: PackageRow }) { export function getPackageColumns({ onViewFiles, + onSetCreator, }: PackageColumnsProps): ColumnDef[] { return [ { @@ -113,9 +115,13 @@ export function getPackageColumns({ accessorKey: "creator", header: ({ column }) => , cell: ({ row }) => ( - - {row.original.creator ?? "\u2014"} - + ), }, { diff --git a/src/app/(app)/stls/_components/stl-table.tsx b/src/app/(app)/stls/_components/stl-table.tsx index 1b46f9b..38980c8 100644 --- a/src/app/(app)/stls/_components/stl-table.tsx +++ b/src/app/(app)/stls/_components/stl-table.tsx @@ -1,7 +1,8 @@ "use client"; -import { useState, useCallback } from "react"; +import { useState, useCallback, useTransition } from "react"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; +import { toast } from "sonner"; import { Search, FileBox } from "lucide-react"; import { useDataTable } from "@/hooks/use-data-table"; import { getPackageColumns, type PackageRow } from "./package-columns"; @@ -13,6 +14,7 @@ import { DataTableViewOptions } from "@/components/shared/data-table-view-option import { PageHeader } from "@/components/shared/page-header"; import { Input } from "@/components/ui/input"; import type { IngestionAccountStatus } from "@/lib/telegram/types"; +import { updatePackageCreator } from "../actions"; interface StlTableProps { data: PackageRow[]; @@ -33,6 +35,7 @@ export function StlTable({ const [searchValue, setSearchValue] = useState(searchParams.get("search") ?? ""); const [viewPkg, setViewPkg] = useState(null); + const [, startTransition] = useTransition(); const updateSearch = useCallback( (value: string) => { @@ -51,6 +54,19 @@ export function StlTable({ const columns = getPackageColumns({ onViewFiles: (pkg) => setViewPkg(pkg), + 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); + } + }); + }, }); const { table } = useDataTable({ data, columns, pageCount }); diff --git a/src/app/(app)/stls/actions.ts b/src/app/(app)/stls/actions.ts new file mode 100644 index 0000000..54c73c8 --- /dev/null +++ b/src/app/(app)/stls/actions.ts @@ -0,0 +1,44 @@ +"use server"; + +import { auth } from "@/lib/auth"; +import { prisma } from "@/lib/prisma"; +import type { ActionResult } from "@/types/api.types"; +import { revalidatePath } from "next/cache"; + +export async function updatePackageCreator( + packageId: string, + creator: string | null +): Promise { + const session = await auth(); + if (!session?.user?.id) return { success: false, error: "Unauthorized" }; + + try { + await prisma.package.update({ + where: { id: packageId }, + data: { creator: creator?.trim() || null }, + }); + revalidatePath("/stls"); + return { success: true, data: undefined }; + } catch { + return { success: false, error: "Failed to update creator" }; + } +} + +export async function bulkSetCreator( + packageIds: string[], + creator: string +): Promise { + const session = await auth(); + if (!session?.user?.id) return { success: false, error: "Unauthorized" }; + + try { + await prisma.package.updateMany({ + where: { id: { in: packageIds } }, + data: { creator: creator.trim() }, + }); + revalidatePath("/stls"); + return { success: true, data: undefined }; + } catch { + return { success: false, error: "Failed to update creators" }; + } +}