"use client"; import { useRouter } from "next/navigation"; import { useActionState, useCallback, useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { CheckCircle2, PenLine, Send } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { IDLE } from "@/lib/reports/action-state"; import { SIGNATURE_OUTCOMES, SIGNATURE_REASON_REQUIRED, type SignatureOutcome } from "@/lib/reports/content"; import { cn } from "@/lib/utils"; import { captureSignatureAction } from "@/server/actions/reports/signature"; import { submitReportAction } from "@/server/actions/reports/workflow"; import { ActionMessage } from "../action-message"; import { SignaturePad } from "../signature-pad"; /** * Mobile completion step 3+4: signature or documented reason (Spec §18.2), then submit. */ export function SignFlow({ reportId, reportNumber, orderNumber, dateLabel, canNotRequired, existing, editable, doneHref, }: { reportId: string; reportNumber: string; orderNumber: string; dateLabel: string; canNotRequired: boolean; existing: { outcome: SignatureOutcome; signerName: string | null; reason: string | null } | null; editable: boolean; doneHref: string; }) { const t = useTranslations("reports"); const router = useRouter(); const [outcome, setOutcome] = useState(existing && existing.outcome !== "signed" ? existing.outcome : "signed"); const [png, setPng] = useState(null); const [sigState, capture, capturing] = useActionState(captureSignatureAction, IDLE); const [submitState, submit, submitting] = useActionState(submitReportAction, IDLE); const onPad = useCallback((v: string | null) => setPng(v), []); const confirmationText = t("sign.confirmation", { reportNumber, orderNumber, date: dateLabel }); const signed = existing?.outcome === "signed"; const options = SIGNATURE_OUTCOMES.filter((o) => o !== "not_required" || canNotRequired); useEffect(() => { if (sigState.status === "ok") router.refresh(); }, [sigState, router]); useEffect(() => { if (submitState.status === "ok") router.push(doneHref); }, [submitState, router, doneHref]); return (
{signed ? (

{t("sign.alreadySigned")} {existing?.signerName ? `· ${existing.signerName}` : ""}

) : (
{t("sign.outcomeLabel")}
{options.map((o) => ( ))}
{outcome === "signed" && ( <>
)} {(SIGNATURE_REASON_REQUIRED as readonly string[]).includes(outcome) && (