import { format } from "date-fns"; import { Check, SlidersHorizontal } from "lucide-react" import { useState } from "react"; import toast from "react-hot-toast"; import { z } from "zod/v4"; import { Counter } from "~/components/counter"; import { Credenza, CredenzaBody, CredenzaContent, CredenzaDescription, CredenzaHeader, CredenzaTitle, CredenzaTrigger, } from "~/components/custom_ui/credenza"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import { DateInput } from "~/components/custom_ui/inputDate"; import { MultiSelect, UnpackOptions } from "~/components/custom_ui/multiselect"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "~/components/ui/dialog"; import { Label } from "~/components/ui/label"; import { Slider } from "~/components/ui/slider"; import { Switch } from "~/components/ui/switch"; import { FieldResetButton } from "~/forms/comps"; import { cn } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import { useTranslation } from "~/providers/I18nProvider"; import { useServizio } from "~/providers/ServizioProvider"; import type { Servizio } from "~/schemas/public/Servizio"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersId } from "~/schemas/public/Users"; import { api } from "~/utils/api"; import { DEFAULT_SERVIZIO_INTERRUZIONE_DURATION_DAYS } from "~/utils/config"; 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: tipologiaPosizioneEnum, scadenza_motivazione_transitoria: z.date().nullable(), skipPayment: z.boolean(), skipControlloDoc: z.boolean(), skipDocMotivazione: z.boolean(), interruzioneDays: z.number().min(0), acceptedInterr: z.boolean(), }) .superRefine(({ n_adulti }, refinementContext) => { if (n_adulti <= 0) { refinementContext.issues.push({ code: "custom", input: "", message: "Inserisci il numero di persone", path: ["npersone"], }); } }); type FormValues = z.infer; const FormServizio = ({ initialData, onSubmit, isLimited, setOpen, }: { initialData: Servizio | undefined; onSubmit: (fields: FormValues) => void; isLimited: boolean; setOpen?: (open: boolean) => void; }) => { // 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.enum.Transitorio, scadenza_motivazione_transitoria: null, skipPayment: false, skipControlloDoc: true, skipDocMotivazione: true, interruzioneDays: DEFAULT_SERVIZIO_INTERRUZIONE_DURATION_DAYS, // default value for interruzioneDays acceptedInterr: false, }; } 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.enum.Transitorio, }, { label: "Stabile", value: tipologiaPosizioneEnum.enum.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")]} /> {!isLimited && ( {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 } disabled={isLimited} 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.enum.Transitorio && !isLimited && ( {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.enum.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} />
)} /> )}
{!isLimited && ( {t.parametri.altriparams_desc} )}
{altrePrefMapping.map((pair) => { if (pair) { return ( ( { if (isLimited) return; field.onChange(!field.value); }} variant={field.value ? "default" : "outline"} > {field.value && } {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
)} />
)} */}
{!isLimited && ( )}
); }; export const NewServizioModal = ({ userId }: { userId: UsersId }) => { const [open, setOpen] = useState(false); const utils = api.useUtils(); const { mutate: add } = api.servizio.addServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { toast.success("Servizio creato con successo"); await utils.servizio.invalidate(); setOpen(false); }, }); function onSubmit(fields: FormValues) { add({ data: { ...fields, user_id: userId } }); } return ( Creazione Servizio desc
); }; export const EditServizioModal = () => { const { servizioId, isAdmin, servizio } = useServizio(); const { t } = useTranslation(); const [openEditParametri, setOpenEditParametri] = useState(false); const utils = api.useUtils(); const { mutate: update } = api.servizio.updateServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { toast.success("Servizio modificato con successo"); await utils.servizio.invalidate(); setOpenEditParametri(false); }, }); function onSubmit(fields: FormValues) { update({ data: { ...fields, }, servizioId, }); } return ( { e.preventDefault(); }} > {t.servizio.parametri.title} {t.servizio.parametri.title} ); };