"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 type { useFurnitureJobs } from "./use-furniture-jobs"; export function FurnitureJobHistory({ state, expanded = false, }: { state: ReturnType; expanded?: boolean; }) { const t = useTranslations("pages.admin.importHistory"); const format = useFormatter(); const [limits, setLimits] = useState>({}); return (
{t("summary", { count: state.jobs.filter( (job) => job.state === "queued" || job.state === "running", ).length, })}
{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.error && (

    {item.error}

    )} {[...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 && ( )}
); })}
); }