"use client"; import { validateItalianTaxCode, validatePartitaIva } from "../../utils/italian-validators"; import { Field, FieldError, FieldLabel, Input } from "../../shadcnui"; import { useTranslations } from "next-intl"; import { forwardRef, useCallback, useImperativeHandle, useRef, useState } from "react"; import { z } from "zod"; export interface FiscalDataHandle { validate: () => boolean; getData: () => Record; isDirty: () => boolean; reset: (initialData: Record) => void; } export interface ItalianFiscalDataProps { initialData: Record; } const ItalianFiscalData = forwardRef(function ItalianFiscalData( { initialData }, ref, ) { const t = useTranslations(); const initialRef = useRef>(initialData); const [fiscalData, setFiscalData] = useState>(initialData); const fiscalDataRef = useRef>(initialData); const [fiscalErrors, setFiscalErrors] = useState>({}); const updateFiscalField = useCallback((key: string, value: string) => { setFiscalData((prev) => { const next = { ...prev, [key]: value }; fiscalDataRef.current = next; return next; }); setFiscalErrors((prev) => { const next = { ...prev }; delete next[key]; return next; }); }, []); useImperativeHandle(ref, () => ({ validate: (): boolean => { const data = fiscalDataRef.current; const errors: Record = {}; if (data.codice_fiscale && !validateItalianTaxCode(data.codice_fiscale, "codiceFiscale")) { errors.codice_fiscale = t("common.fields.codice_fiscale.error"); } if (data.partita_iva && !validatePartitaIva(data.partita_iva)) { errors.partita_iva = t("common.fields.partita_iva.error"); } if (data.pec && !z.string().email().safeParse(data.pec).success) { errors.pec = t("common.fields.pec.error"); } setFiscalErrors(errors); return Object.keys(errors).length === 0; }, getData: (): Record => fiscalDataRef.current, isDirty: (): boolean => JSON.stringify(fiscalDataRef.current) !== JSON.stringify(initialRef.current), reset: (newInitialData: Record) => { initialRef.current = newInitialData; fiscalDataRef.current = newInitialData; setFiscalData(newInitialData); setFiscalErrors({}); }, })); return (
{t("common.fields.codice_fiscale.label")} updateFiscalField("codice_fiscale", e.target.value)} placeholder={t("common.fields.codice_fiscale.placeholder")} /> {fiscalErrors.codice_fiscale && {fiscalErrors.codice_fiscale}} {t("common.fields.partita_iva.label")} updateFiscalField("partita_iva", e.target.value)} placeholder={t("common.fields.partita_iva.placeholder")} /> {fiscalErrors.partita_iva && {fiscalErrors.partita_iva}} {t("common.fields.sdi.label")} updateFiscalField("sdi", e.target.value)} placeholder={t("common.fields.sdi.placeholder")} /> {t("common.fields.rea.label")} updateFiscalField("rea", e.target.value)} placeholder={t("common.fields.rea.placeholder")} /> {t("common.fields.pec.label")} updateFiscalField("pec", e.target.value)} placeholder={t("common.fields.pec.placeholder")} /> {fiscalErrors.pec && {fiscalErrors.pec}}
); }); export default ItalianFiscalData;