import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { listJobs, fetchLibraries, rebuildIndex, rebuildThumbnails, regenerateThumbnails, startMetadataBatch, startMetadataRefresh, IndexJobDto, LibraryDto } from "../../lib/api"; import { JobsList } from "../components/JobsList"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, FormField, FormSelect } from "../components/ui"; import { getServerTranslations } from "../../lib/i18n/server"; export const dynamic = "force-dynamic"; export default async function JobsPage({ searchParams }: { searchParams: Promise<{ highlight?: string }> }) { const { highlight } = await searchParams; const { t } = await getServerTranslations(); const [jobs, libraries] = await Promise.all([ listJobs().catch(() => [] as IndexJobDto[]), fetchLibraries().catch(() => [] as LibraryDto[]) ]); const libraryMap = new Map(libraries.map(l => [l.id, l.name])); async function triggerRebuild(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await rebuildIndex(libraryId || undefined); revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } async function triggerFullRebuild(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await rebuildIndex(libraryId || undefined, true); revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } async function triggerThumbnailsRebuild(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await rebuildThumbnails(libraryId || undefined); revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } async function triggerThumbnailsRegenerate(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await regenerateThumbnails(libraryId || undefined); revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } async function triggerMetadataBatch(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; if (!libraryId) return; let result; try { result = await startMetadataBatch(libraryId); } catch { // Library may have metadata disabled — ignore silently return; } revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } async function triggerMetadataRefresh(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; if (!libraryId) return; let result; try { result = await startMetadataRefresh(libraryId); } catch { return; } revalidatePath("/jobs"); redirect(`/jobs?highlight=${result.id}`); } return ( <>

{t("jobs.title")}

{t("jobs.startJob")} {t("jobs.startJobDescription")}
{libraries.map((lib) => ( ))}
{/* Indexation group */}
{t("jobs.groupIndexation")}
{/* Thumbnails group */}
{t("jobs.groupThumbnails")}
{/* Metadata group */}
{t("jobs.groupMetadata")} ({t("jobs.requiresLibrary")})
); }