"use client"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import z from "zod"; import { Button } from "~/components/ui/button"; import { Card } from "~/components/ui/card"; import { filteredCaratteristiche } from "~/hooks/schedaAnnuncioUtils"; import { it } from "~/i18n/it"; import { handleConsegna } from "~/lib/annuncio_details"; import { replaceWithBr } from "~/lib/newlineToBr"; import { cn, formatCurrency } from "~/lib/utils"; import type { Annunci } from "~/schemas/public/Annunci"; import { api } from "~/utils/api"; import { IconMatrix } from "./IconComponents"; import { GoogleMapsIcon, LogoSvg, WhatsAppIcon } from "./svgs"; import { Input } from "./ui/input"; import { Label } from "./ui/label"; import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; const blobToBase64 = (blob: Blob): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onerror = reject; reader.onload = () => { if (typeof reader.result === "string") { // Remove the Data-URL prefix (e.g. "data:application/pdf;base64,") to get just the base64 resolve(reader.result.split(",")[1] || ""); } else { reject(new Error("Failed to convert blob to text")); } }; reader.readAsDataURL(blob); }); }; export function SchedaAnnuncioStampabile({ data }: { data: Annunci }) { const [inputEmail, setInputEmail] = useState(""); const [openPopover, setOpenPopover] = useState(false); const { mutate } = api.comunicazioni.sendSchedaAnnuncioEmail.useMutation({ onSuccess: () => { toast.success("Email inviata con successo!", { id: "send-scheda-annuncio-email", }); }, onError: (error) => { toast.error(`Errore durante l'invio dell'email: ${error.message}`, { id: "send-scheda-annuncio-email", }); }, }); const sendPdf = async () => { if (!data || !inputEmail || !data.locatore || !data.numero) { toast.error("Dati annuncio mancanti."); return; } try { toast.loading("Generazione PDF in corso...", { id: "generate-pdf", }); const response = await fetch(`/api/generate-pdf?id=${data.id}`); if (!response.ok) { throw new Error( `Errore nella generazione del PDF: ${response.statusText}`, ); } const blob = await response.blob(); const pdfBase64 = await blobToBase64(blob); mutate({ pdf: pdfBase64, to: inputEmail, codice: data.codice, numero: data.numero, nominativo: data.locatore, indirizzo: `${data.indirizzo}, ${data.civico} ${data.comune} ${data.cap} (${data.provincia})`, }); setInputEmail(""); toast.success("PDF generato con successo!", { id: "generate-pdf", }); } catch (error) { toast.error( `Errore durante la generazione del PDF: ${(error as Error).message}`, { id: "generate-pdf", }, ); console.error("Error generating PDF:", error); } }; const generatePdf = async () => { if (!data) { toast.error("Dati annuncio mancanti."); return; } try { toast.loading("Generazione PDF in corso...", { id: "generate-pdf", }); const response = await fetch(`/api/generate-pdf?id=${data.id}`); if (!response.ok) { throw new Error( `Errore nella generazione del PDF: ${response.statusText}`, ); } const blob = await response.blob(); toast.success("PDF generato con successo!", { id: "generate-pdf", }); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `scheda-annuncio-${data.codice}.pdf`; document.body.appendChild(link); link.click(); link.remove(); window.URL.revokeObjectURL(url); } catch (error) { toast.error( `Errore durante la generazione del PDF: ${(error as Error).message}`, { id: "generate-pdf", }, ); console.error("Error generating PDF:", error); } }; return (

Scheda Annuncio Stampabile

setInputEmail(e.target.value)} onKeyDown={(e) => { if ( e.key === "Enter" && z.safeParse(z.email(), inputEmail).success ) { sendPdf(); } }} type="email" />
); } export function SchedaAnnuncio({ data, raw, }: { data: Annunci; raw?: boolean; }) { const companyAddress = "Via Beata Giovanna, 1 a Bassano del Grappa (VI)\nTel. +39 0424529869\nEmail: arca@infoalloggi.it"; const footer = "Arcenia Srl. | Tel. +39 0424529869 | Email: arca@infoalloggi.it"; const [navigationUrl, setNavigationUrl] = useState( undefined, ); const [printDate, setPrintDate] = useState(""); const [disponibileDate, setDisponibileDate] = useState(""); useEffect(() => { setPrintDate(new Date().toLocaleDateString("it-IT")); if (data.disponibile_da) { setDisponibileDate(new Date(data.disponibile_da).toLocaleDateString()); } else if (data.consegna) { setDisponibileDate( handleConsegna({ aggiornamento: it.card.in_aggiornamento, consegna: data.consegna, consegna_da: it.card.consegna_da, mesi: it.parametri.mesi, subito: it.card.consegna_subito, }), ); } else { setDisponibileDate("Non specificata"); } if (!data) return; if (typeof window === "undefined") return; if ( navigator.userAgent.toUpperCase().includes("MAC") || navigator.userAgent.toUpperCase().includes("IPAD") || navigator.userAgent.toUpperCase().includes("IPHONE") || navigator.userAgent.toUpperCase().includes("IOS") || navigator.userAgent.toUpperCase().includes("IPOD") ) { setNavigationUrl( `maps://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${data.lat},${data.lon}`, ); } else { setNavigationUrl( `https://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${data.lat},${data.lon}`, ); } }, [data]); return (

Arcenia Srl

{companyAddress}

{/* Property Header */}

{data.titolo_it || "Immobile in Affitto"}

Riferimento: {data.codice}

{" "} Contatti (mandare un messaggio WhatsApp prima di chiamare)

{data.locatore}

{data.numero &&

Tel. {data.numero}

}
{/* Property Details Grid */}
{/* Location Details */}

Indirizzo

{data.indirizzo}, {data.civico} {data.comune} {data.cap} ( {data.provincia})

{navigationUrl && ( Apri in Google Maps )}
{/* Property Characteristics */} {/*

🏠 Caratteristiche

{data.mq && (

mq: {data.mq} mq

)} {data.numero_vani && (

Locali:{" "} {data.numero_vani}

)} {data.numero_camere && (

Camere:{" "} {data.numero_camere}

)} {data.numero_bagni && (

Bagni:{" "} {data.numero_bagni}

)}
*/}
{/* Pricing Information */}
{data.tipo && (

Tipologia

Affitto {data.tipo}

)} {data.prezzo && (

Canone Mensile

{formatCurrency(data.prezzo / 100)}

)} {(data.disponibile_da || data.consegna) && (

Disponibile da

{disponibileDate}

)}
{/* Additional Features */}

Dotazioni e Servizi

{data.caratteristiche && filteredCaratteristiche(data.caratteristiche).map((item) => { if (!item.value) return null; return (
{item.text}: {item.value}
); })}
{/* Description */} {data.desc_it && ( <>

Descrizione

)}

Informazione strettamente riservata ed indirizzata all'Utente Arca-Infoalloggi nel rispetto dell' Art. F. Precisazione dei Tuoi Obblighi e responsabilità delle Condizioni Generali di Contratto (CGC) accettate

{footer}

Documento generato in data: {printDate}

); }