import { z } from "zod"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import { customErrorMapWrapper } from "~/hooks/locale"; import { useZodForm } from "~/lib/zodForm"; import { Button } from "~/components/ui/button"; import { useTranslation } from "~/providers/I18nProvider"; import { cn } from "~/lib/utils"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { Slider } from "~/components/ui/slider"; import { MultiSelect, UnpackOptions } from "~/components/custom_ui/multiselect"; import { Counter } from "~/components/counter"; import { Switch } from "~/components/ui/switch"; import { Label } from "~/components/ui/label"; import { Badge } from "~/components/ui/badge"; import type { Servizio } from "~/schemas/public/Servizio"; const schema = z .object({ tipologia: z.custom(), budget: z.coerce.number(), entromese: z.number().nullable(), n_adulti: z.coerce.number().min(1), n_minori: z.coerce.number(), permanenza: z.number().nullable(), motivazione_transitorio: z.string().nullable(), reddito: z.string().nullable(), arredato: z.boolean(), animali: z.boolean(), fumatori: z.boolean(), giardino: z.boolean(), parcheggio: z.boolean(), terrazzo: z.boolean(), ascensore: z.boolean(), pianoterra: z.boolean(), }) .superRefine(({ n_adulti }, refinementContext) => { if (n_adulti <= 0) { refinementContext.addIssue({ code: z.ZodIssueCode.custom, 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 = { tipologia: TipologiaPosizioneEnum.Transitorio, budget: 0, entromese: null, n_adulti: 1, n_minori: 0, permanenza: null, motivazione_transitorio: "", reddito: "", arredato: false, animali: false, fumatori: false, giardino: false, parcheggio: false, terrazzo: false, ascensore: false, pianoterra: false, }; } const { locale, t } = useTranslation(); z.setErrorMap(customErrorMapWrapper(locale)); const form = useZodForm({ schema: schema, defaultValues: defaultValues, }); type altrePrefMappingType = [ ["animali", string], ["fumatori", string], ["giardino", string], ["parcheggio", string], ["terrazzo", string], ["ascensore", string], ["pianoterra", string], ]; const altrePrefMapping = t.altrePrefMapping 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); }} /> )}
)} /> (
{`${t.preferenze.budget_label1} - ${field.value.toLocaleString("it")},00 ${ t.preferenze.budget_label2 }`}
{ field.onChange(vals[0]); }} rangeClassName="bg-neutral-700" thumbClassName="border-neutral-700" value={[form.getValues("budget")]} id="budgetslider" /> {t.preferenze.budget_desc}
)} />
(
{t.preferenze.dalmese_label}... {field.value !== null && !initialData && ( )}
{ field.onChange( value.value !== "" ? parseInt(value.value) : null, ); }} placeholder="Seleziona..." isMulti={false} />
)} /> (
{t.preferenze.permanenza_label} {field.value !== null && !initialData && ( )}
{ field.onChange( value.value !== "" ? parseInt(value.value) : null, ); }} placeholder="Seleziona..." isMulti={false} disabled={tipologia !== TipologiaPosizioneEnum.Transitorio} /> {t.preferenze.permanenza_desc}
)} />
(
{t.preferenze.nadulti_label}
)} /> (
{t.preferenze.nminori_label}
)} />
(
{t.preferenze.arredato_label}
{t.preferenze.arredato_desc}
)} /> {tipologia === TipologiaPosizioneEnum.Transitorio ? ( { const existingValue = t.preferenze.motivazioni_mappings.find( (m) => m.id == field.value, ); return (
{t.preferenze.motivazione_label}
{isLimited ? (

{existingValue?.title}

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

) : ( <> ({ value: option.id, label: option.title, }), )} onValueChange={(value) => { field.onChange(value.value); }} /> {t.preferenze.motivazione_desc} )}
); }} /> ) : ( (
{t.preferenze.reddito_label}
{ field.onChange(value.value); }} />
)} /> )}
{t.preferenze.altrepref_desc}
{altrePrefMapping.map((pair, index) => { if (pair) { return ( ( { field.onChange(!field.value); }} className={cn( "cursor-pointer text-sm", field.value ? "bg-neutral-800 hover:bg-neutral-800 sm:hover:bg-neutral-900/80" : "bg-neutral-200 text-neutral-700 hover:bg-neutral-200 sm:hover:bg-neutral-900/80 sm:hover:text-neutral-50", )} > {pair[1]} )} /> ); } })}
); };