"use client"; import Link from "next/link"; import { useFormatter, useTranslations } from "next-intl"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { retryableJobItems } from "@/lib/furni/import-job-retry"; import { ImportAttachmentRecovery } from "./import-attachment-recovery"; import type { useFurnitureJobs } from "./use-furniture-jobs"; export function FurnitureJobHistoryBody({ state, expanded = false, }: { state: ReturnType; expanded?: boolean; }) { const t = useTranslations("pages.admin.importHistory"); const format = useFormatter(); const progressT = useTranslations("pages.admin.importProgress"); const [limits, setLimits] = useState>({}); return (
{state.error &&

{state.error}

}

{state.paginated ? t("ownerHistory") : t("historyLimit")}

{state.paginated && (
{t("page", { page: state.page })}
)} {!state.jobs.length && !state.loading && !state.error && (

{t("empty")}

)} {state.jobs.map((job) => { const retryItems = retryableJobItems(job); const done = job.items.filter((i) => i.state === "done"), failed = job.items.filter((i) => i.state === "failed"); return (
{format.dateTime(new Date(job.createdAt), { dateStyle: "short", timeStyle: "short", })}{" "} · {t(job.state)} ·{" "} {t("result", { done: done.length, total: job.items.length, failed: failed.length, })}
    {job.items.slice(0, limits[job.id] ?? 50).map((item) => (
  • {item.classname} · {t(item.state)} {item.itemId ? ` · ID ${item.itemId}` : ""} {item.phase && (item.state === "running" || item.state === "failed" || item.state === "interrupted") && (

    {progressT( item.state === "running" ? "current" : "last", { phase: progressT(item.phase) }, )} {item.state === "running" && item.phaseStartedAt && ` · ${progressT("elapsed", { seconds: Math.max(0, Math.floor((Date.now() - Date.parse(item.phaseStartedAt)) / 1000)) })}`} {item.sourceAttempt && ` · ${item.sourceAttempt}`}

    )} {item.recoveredSource && (

    {progressT("recovered", { source: item.recoveredSource.sourceName, revision: item.recoveredSource.revision, })}

    )} {item.error && (

    {item.error}

    )} {!job.syncKind && item.state === "failed" && retryItems.some( (retryItem) => retryItem.classname === item.classname, ) && ( )} {[...new Set(item.warnings ?? [])].map((warning) => (

    {warning}

    ))}
  • ))}
{job.items.length > (limits[job.id] ?? 50) && ( )} {(job.state === "queued" || job.state === "running") && (

{t(job.cancelRequested ? "cancelRequested" : "cancelHint")}

)} {job.items.some( (item) => item.state === "interrupted" || item.error?.startsWith("Server restarted during import.") || (item.state === "running" && job.state === "interrupted"), ) && (

{t("uncertainOutcome")}{" "} {t("reviewLocalData")}

)} {retryItems.length > 0 && ( )}
); })}
); }