import { format } from "date-fns"; import { it } from "date-fns/locale"; import { CalendarIcon } from "lucide-react"; import { z } from "zod/v4"; import { Counter } from "~/components/counter"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import { MultiSelect, UnpackOptions } from "~/components/custom_ui/multiselect"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; import { Calendar } from "~/components/ui/calendar"; import { Label } from "~/components/ui/label"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { Separator } from "~/components/ui/separator"; import { Slider } from "~/components/ui/slider"; import { Switch } from "~/components/ui/switch"; import { cn } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import { useTranslation } from "~/providers/I18nProvider"; import type { Servizio } from "~/schemas/public/Servizio"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { FieldResetButton } from "./comps"; const Schema = z .object({ animali: z.boolean(), arredato: z.boolean(), ascensore: z.boolean(), budget: z.number(), entromese: z.number().nullable(), fumatori: z.boolean(), giardino: z.boolean(), motivazione_transitorio: z.string().nullable(), n_adulti: z.number().min(1), n_minori: z.number(), parcheggio: z.boolean(), permanenza: z.number().nullable(), pianoterra: z.boolean(), reddito: z.string().nullable(), terrazzo: z.boolean(), tipologia: z.custom(), scadenza_motivazione_transitoria: z.date().nullable(), skipPayment: z.boolean(), skipControlloDoc: z.boolean(), skipDocMotivazione: z.boolean(), }) .superRefine(({ n_adulti }, refinementContext) => { if (n_adulti <= 0) { refinementContext.issues.push({ code: "custom", input: "", message: "Inserisci il numero di persone", path: ["npersone"], }); } }); export type FormValues = z.infer; export const FormNewServizio = ({ initialData, onSubmit, isLimited, }: { initialData: Servizio | undefined; onSubmit: (fields: FormValues) => void; isLimited: boolean; }) => { // This can come from your database or API. let defaultValues: FormValues; if (initialData) { defaultValues = { ...initialData, }; } else { defaultValues = { animali: false, arredato: false, ascensore: false, budget: 0, entromese: null, fumatori: false, giardino: false, motivazione_transitorio: "", n_adulti: 1, n_minori: 0, parcheggio: false, permanenza: null, pianoterra: false, reddito: "", terrazzo: false, tipologia: TipologiaPosizioneEnum.Transitorio, scadenza_motivazione_transitoria: null, skipPayment: false, skipControlloDoc: true, skipDocMotivazione: true, }; } const { locale, t } = useTranslation(); z.config(z.locales[locale]()); const form = useZodForm(Schema, { defaultValues: defaultValues, }); type altrePrefMappingType = [ ["animali", string], ["fumatori", string], ["giardino", string], ["parcheggio", string], ["terrazzo", string], ["ascensore", string], ["pianoterra", string], ]; const altrePrefMapping = t.altriParamsMapping as altrePrefMappingType; const tipologia = form.watch("tipologia"); return (
(
Tipologia
{isLimited ? (

{field.value}

La tipologia non può essere modificata. Contatta il supporto se necessario.

) : ( { field.onChange(value.value); form.setValue("motivazione_transitorio", null); form.setValue("reddito", null); }} options={[ { label: "Transitorio", value: TipologiaPosizioneEnum.Transitorio, }, { label: "Stabile", value: TipologiaPosizioneEnum.Stabile, }, ]} placeholder={t.seleziona_placeholder} /> )}
)} /> (
{`${t.parametri.budget_label1} - ${field.value.toLocaleString("it")},00 ${ t.parametri.budget_label2 }`}
{ field.onChange(Number(vals[0])); }} step={50} value={[form.getValues("budget")]} /> {t.parametri.budget_desc}
)} />
(
{t.parametri.dalmese_label}... {field.value !== null && !initialData && ( form.setValue("entromese", null)} /> )}
label: t.parametri.mesi[field.value]!, value: String(field.value), } : undefined } elementId="select-mesi" elementName="entro_mese" isMulti={false} key={field.value} onValueChange={(value) => { field.onChange( value.value !== "" ? parseInt(value.value) : null, ); }} options={UnpackOptions({ options: t.parametri.mesi, })} placeholder="Seleziona..." />
)} /> (
{t.parametri.permanenza_label} {field.value !== null && !initialData && ( form.setValue("permanenza", null)} /> )}
{ field.onChange( value.value !== "" ? parseInt(value.value) : null, ); }} options={UnpackOptions({ options: t.parametri.permanenza, })} placeholder="Seleziona..." /> {tipologia === TipologiaPosizioneEnum.Transitorio && ( {t.parametri.permanenza_desc} )}
)} />
(
{t.parametri.nadulti_label}
field.onChange(Number(value))} value={Number(field.value)} />
)} /> (
{t.parametri.nminori_label}
field.onChange(Number(value))} value={Number(field.value)} />
)} />
(
{t.parametri.arredato_label}
{t.parametri.arredato_desc}
)} /> {tipologia === TipologiaPosizioneEnum.Transitorio ? (
{ const existingValue = t.parametri.motivazioni_mappings.find( (m) => m.id === field.value, ); return (
{t.parametri.motivazione_label}
{isLimited ? (

{existingValue?.title}

La motivazione non può essere modificata. Contatta il supporto se necessario.

) : ( <> { field.onChange(value.value); }} options={t.parametri.motivazioni_mappings.map( (option) => ({ label: option.title, value: option.id, }), )} placeholder={t.seleziona_placeholder} /> {t.parametri.motivazione_desc} )}
); }} /> (
Scadenza motivazione
{isLimited ? (

{field.value ? format(field.value, "dd/MM/yyyy") : "Errore data invalida"}

La scadenza non può essere modificata. Contatta il supporto se necessario.

) : ( )} es. scadenza contratto di lavoro, fine corso di studi, ecc.
)} />
) : ( (
{t.parametri.reddito_label}
{ field.onChange(value.value); }} options={UnpackOptions({ options: t.parametri.reddito_options, })} placeholder={t.seleziona_placeholder} />
)} /> )}
{t.parametri.altriparams_desc}
{altrePrefMapping.map((pair) => { if (pair) { return ( ( { field.onChange(!field.value); }} variant={field.value ? "default" : "secondary"} > {pair[1]} )} /> ); } })}
{!isLimited && (
(
Salta Pagamento
Salta la richiesta di pagamento al cliente (per tutti i pagamenti)
)} /> (
Salta controllo documento
Salta la richiesta del documento del cliente al momento dello sblocco contatti
)} /> (
Salta documento motivazione
Salta l'invio del documento di motivazione al cliente al momento della conferma annuncio
)} />
)} ); };