import { format } from "date-fns"; import { it } from "date-fns/locale"; import { CalendarIcon, CodeSquare, Eye, Printer, RefreshCcw, RotateCw, TriangleAlert, } from "lucide-react"; import Link from "next/link"; import toast from "react-hot-toast"; import z from "zod"; import { CarouselAnnuncio } from "~/components/annuncio_card"; import { Confirm } from "~/components/confirm"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import Input from "~/components/custom_ui/input"; import { DualInputLayout } from "~/components/custom_ui/inputLayouts"; import { type ListOption, MultiSelect, } from "~/components/custom_ui/multiselect"; import { Textarea } from "~/components/custom_ui/textarea"; import { PhoneInput } from "~/components/phone-input"; import { Button } from "~/components/ui/button"; import { Calendar } from "~/components/ui/calendar"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { Switch } from "~/components/ui/switch"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs"; import { filteredCaratteristiche } from "~/hooks/schedaAnnuncioUtils"; import { cn } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import { StatusBadge } from "~/pages/area-riservata/admin/edit-annuncio/[id]"; import { useTranslation } from "~/providers/I18nProvider"; import type { Annunci } from "~/schemas/public/Annunci"; import { zAnnuncioId } from "~/server/utils/zod_types"; import { api } from "~/utils/api"; import type { Caratteristiche } from "~/utils/kanel-types"; export const AnnuncioEditForm = ({ data }: { data: Annunci }) => { const schema = z.object({ accessori: z.string().array().nullable(), // ALTRI DATI IMMOBILE anno: z.string().nullable(), cap: z.string().nullable(), caratteristiche: z.custom().nullable(), categorie: z.string().array().nullable(), civico: z.string().nullable(), civico_secondario: z.string().nullable(), classe: z.string().nullable(), codice: z.string(), comune: z.string().nullable(), consegna: z.number().nullable(), desc_en: z.string().nullable(), desc_it: z.string().nullable(), disponibile_da: z.date().nullable(), email: z.email().optional(), homepage: z.boolean().nullable(), //BASE id: zAnnuncioId, // DATI IMMOBILE indirizzo: z.string().nullable(), indirizzo_secondario: z.string().nullable(), lat: z.string().nullable(), lat_secondario: z.string().nullable(), // DATI LOCATORE locatore: z.string().nullable(), lon: z.string().nullable(), lon_secondario: z.string().nullable(), mq: z.string().nullable(), numero: z.string().nullable(), numero_bagni: z.number().nullable(), numero_balconi: z.number().nullable(), numero_box: z.number().nullable(), numero_camere: z.number().nullable(), numero_postiauto: z.number().nullable(), numero_terrazzi: z.number().nullable(), numero_vani: z.number().nullable(), permanenza: z.number().array().nullable(), persone: z.string().array().nullable(), piano: z.string().nullable(), piano_palazzo: z.number().nullable(), prezzo: z.number(), provincia: z.string().nullable(), regione: z.string().nullable(), stato: z.string().nullable(), // DATI CONTRATTO tipo: z.string().nullable(), titolo_en: z.string().nullable(), titolo_it: z.string().nullable(), unita_condominio: z.number().nullable(), web: z.boolean().nullable(), // MEDIA //url_immagini: z.string().array().nullable(), //url_video: z.string().array().nullable(), //og_url: z.string().nullable(), //creato_il: z.date().nullable(), //modificato_il: z.date().nullable(), }); type FormValues = z.infer; const { locale } = useTranslation(); const utils = api.useUtils(); const { mutate: edit } = api.annunci.editAnnuncio.useMutation({ onSettled: async () => { await utils.annunci.getAnnuncio.invalidate({ cod: data.codice }); await utils.annunci.getAnnuncioById_rawImgUrls.invalidate({ id: data.id, }); await utils.annunci.getAnnunciList.invalidate(); toast.success("Annuncio modificato con successo"); }, }); const { mutateAsync: revalidate } = api.settings.revalidateAnnuncio.useMutation({ onSettled: async () => { await utils.annunci.getAnnuncio.invalidate({ cod: data.codice }); await utils.annunci.getAnnuncioById_rawImgUrls.invalidate({ id: data.id, }); toast.success("Revalidazione completata"); }, }); const { mutateAsync: update } = api.settings.updateAnnuncio.useMutation({ onSettled: async () => { await utils.annunci.getAnnuncio.invalidate({ cod: data.codice }); await utils.annunci.getAnnuncioById_rawImgUrls.invalidate({ id: data.id, }); toast.success( "L'aggiornamento dell'annuncio è stata richiesta con successo,\n potrebbero volerci alcuni minuti prima che le modifiche siano visibili.", { duration: 5000, }, ); }, }); const defaultValues: FormValues = { ...data, email: data.email || undefined, }; z.config(z.locales[locale]()); const form = useZodForm(schema, { defaultValues: defaultValues, }); function onSubmit(fields: FormValues) { edit({ annuncioId: data.id, data: { ...fields, email: fields.email || null }, }); } const personeOptions: ListOption[] = [ "single", "coppia", "colleghi", "famiglia", ].map((p) => ({ label: p, value: p, })); const permanenzaOptions: ListOption[] = [ { label: "1 mese", value: "1" }, { label: "3 mesi", value: "3" }, { label: "6 mesi", value: "6" }, { label: "9 mesi", value: "9" }, { label: "12 mesi", value: "12" }, { label: "18 mesi", value: "18" }, { label: "24 mesi", value: "24" }, ]; const tipoOptions: ListOption[] = [ "Transitorio", "Stabile", "Vendita", "Cessione", "Errore", ].map((o) => ({ label: o, value: o })); const statoOptions = ["Attivo", "Sospeso", "Trattativa"].map((o) => ({ label: o, value: o, })); const consegnaOptions: ListOption[] = [ { label: "Gennaio", value: "1" }, { label: "Febbraio", value: "2" }, { label: "Marzo", value: "3" }, { label: "Aprile", value: "4" }, { label: "Maggio", value: "5" }, { label: "Giugno", value: "6" }, { label: "Luglio", value: "7" }, { label: "Agosto", value: "8" }, { label: "Settembre", value: "9" }, { label: "Ottobre", value: "10" }, { label: "Novembre", value: "11" }, { label: "Dicembre", value: "12" }, ]; return ( <>

Annuncio {data.codice}

{ await update({ cod: data.codice }); }} title="Aggiornamento Annuncio" >
Italiano Inglese Descrizione ITA
(
Titolo ITA
)} />
(
Descrizione ITA