import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { listJobs, fetchLibraries, rebuildIndex, rebuildThumbnails, regenerateThumbnails, startMetadataBatch, startMetadataRefresh, startReadingStatusMatch, startReadingStatusPush, startDownloadDetection, apiFetch, IndexJobDto, LibraryDto } from "@/lib/api"; import { JobsList } from "@/app/components/JobsList"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, FormField, FormSelect } from "@/app/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, prowlarrSettings] = await Promise.all([ listJobs().catch(() => [] as IndexJobDto[]), fetchLibraries().catch(() => [] as LibraryDto[]), apiFetch<{ url?: string }>("/settings/prowlarr").catch(() => null), ]); const prowlarrConfigured = !!prowlarrSettings?.url; const libraryMap = new Map(libraries.map(l => [l.id, l.name])); const readingStatusLibraries = libraries.filter(l => l.reading_status_provider); 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 triggerRescan(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await rebuildIndex(libraryId || undefined, false, 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; const result = await startMetadataBatch(libraryId || undefined); revalidatePath("/jobs"); redirect(result.id ? `/jobs?highlight=${result.id}` : "/jobs"); } async function triggerMetadataRefresh(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await startMetadataRefresh(libraryId || undefined); revalidatePath("/jobs"); redirect(result.id ? `/jobs?highlight=${result.id}` : "/jobs"); } async function triggerReadingStatusMatch(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await startReadingStatusMatch(libraryId || undefined); revalidatePath("/jobs"); redirect(result.id ? `/jobs?highlight=${result.id}` : "/jobs"); } async function triggerReadingStatusPush(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await startReadingStatusPush(libraryId || undefined); revalidatePath("/jobs"); redirect(result.id ? `/jobs?highlight=${result.id}` : "/jobs"); } async function triggerDownloadDetection(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; const result = await startDownloadDetection(libraryId || undefined); revalidatePath("/jobs"); redirect(result.id ? `/jobs?highlight=${result.id}` : "/jobs"); } 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")}
{/* Reading status group — only shown if at least one library has a provider configured */} {readingStatusLibraries.length > 0 && (
{t("jobs.groupReadingStatus")}
)} {/* Download group — only shown if Prowlarr is configured */} {prowlarrConfigured &&
{t("jobs.groupProwlarr")}
}
); }