/* * DESIGN: "Clinical Warmth" * Sezione prenotazione: form to mail con conferma non vincolante. */ import { useEffect, useRef, useState } from "react"; import { motion, useInView } from "framer-motion"; import { Calendar, CheckCircle2, Clock, Mail, PawPrint, Phone, ShieldCheck, User, } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; const bookingFormPaused = false; const services = [ "Visita clinica generale", "Ecografia", "Radiologia", "Laboratorio", "Vaccinazione", "Oncologia", "Dermatologia", "Oculistica", "Nutrizione", "Ortopedia", "Endoscopia", "Laparoscopia", ]; const doctors = [ "Dott. Paolo Parmeggiani", "Dott.ssa Irene Paganelli", "Dott. Simone Tinti", "Dott.ssa Michela Sghedoni", "Dott.ssa Sara Casali", "Dott. Riccardo Suffritti", ]; const openingHours = [ { days: "Visite: Lunedì - Venerdì", hours: "09:00 - 19:30" }, { days: "Visite: Sabato", hours: "09:00 - 17:00" }, { days: "Urgenze: Lunedì - Venerdì", hours: "08:00 - 22:30" }, { days: "Urgenze: Sabato e Festivi", hours: "09:00 - 20:00" }, ]; const preferredPeriods = [ "Questa settimana", "Prossima settimana", "Tra 2 settimane", "Il mese prossimo", ]; const preferredTimeWindows = [ "Mattino", "Pausa pranzo", "Pomeriggio", ]; type BookingFormState = { name: string; email: string; phone: string; petName: string; petType: string; doctor: string; service: string; date: string; time: string; notes: string; website: string; captchaAnswer: string; }; const initialForm: BookingFormState = { name: "", email: "", phone: "", petName: "", petType: "cane", doctor: "", service: "", date: "", time: "", notes: "", website: "", captchaAnswer: "", }; type CaptchaChallenge = { captcha_id: string; question: string; }; export default function BookingSection() { const ref = useRef(null); const isInView = useInView(ref, { once: true, margin: "-80px" }); const [submitted, setSubmitted] = useState(false); const [submitting, setSubmitting] = useState(false); const [submittedName, setSubmittedName] = useState(""); const [form, setForm] = useState(initialForm); const [captcha, setCaptcha] = useState(null); const [captchaLoading, setCaptchaLoading] = useState(false); const loadCaptcha = async () => { setCaptchaLoading(true); try { const response = await fetch("/api/booking-captcha"); if (!response.ok) { throw new Error("Verifica anti-spam non disponibile"); } const payload = await response.json(); setCaptcha(payload); setForm((currentForm) => ({ ...currentForm, captchaAnswer: "" })); } catch { setCaptcha(null); toast.error("Verifica anti-spam non disponibile", { description: "Riprova tra qualche istante prima di inviare il modulo.", }); } finally { setCaptchaLoading(false); } }; useEffect(() => { if (!bookingFormPaused) { loadCaptcha(); } }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.name || !form.email || !form.phone || !form.doctor || !form.service || !form.date) { toast.error("Compila tutti i campi obbligatori"); return; } if (!captcha || !form.captchaAnswer) { toast.error("Completa la verifica anti-spam"); return; } try { setSubmitting(true); const response = await fetch("/api/booking-request", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name: form.name, email: form.email, phone: form.phone, pet_name: form.petName, pet_type: form.petType, doctor: form.doctor, service: form.service, date: form.date, time: form.time, notes: form.notes, website: form.website, captcha_id: captcha.captcha_id, captcha_answer: form.captchaAnswer, }), }); if (!response.ok) { const errorPayload = await response.json().catch(() => null); throw new Error(errorPayload?.detail || "Invio non riuscito"); } const payload = await response.json(); setSubmittedName(form.name); setSubmitted(true); setForm(initialForm); loadCaptcha(); toast.success("Richiesta inviata", { description: payload.message, }); } catch (error) { loadCaptcha(); const message = error instanceof Error ? error.message : "Si e verificato un problema durante l'invio."; toast.error("Invio non riuscito", { description: message, }); } finally { setSubmitting(false); } }; return (
Prenotazioni

Richiedi una visita online

Compila il modulo per inviare una richiesta di appuntamento. La richiesta non è vincolante e dovrà essere confermata dallo staff della clinica, che ti ricontatterà il prima possibile.

Richiesta non vincolante

L'invio del modulo non costituisce conferma automatica dell'appuntamento. Il team verificherà disponibilità, tipologia di visita e urgenza del caso prima di confermare periodo e fascia oraria.

Orari di apertura

{openingHours.map((slot) => (

{slot.days}

{slot.hours}

))}
{bookingFormPaused ? (

Form in aggiornamento

Il modulo di richiesta appuntamento è temporaneamente sospeso per manutenzione. Per prenotazioni o informazioni contatta direttamente la clinica.

Chiama 320 532.24.39
) : submitted ? (

Grazie {submittedName || "per la tua richiesta"}

La tua richiesta di prenotazione è stata inviata correttamente.

Il team della Clinica Veterinaria Formiginese la prenderà in carico il prima possibile e ti ricontatterà per confermare disponibilità, data e orario.

Nota importante: la richiesta inviata non equivale a una prenotazione gia confermata.
) : (

Richiedi un appuntamento

Compila i campi richiesti e inviaci una preferenza di periodo: sarà lo staff a ricontattarti per confermare la visita.

setForm({ ...form, name: e.target.value })} className="w-full rounded-lg border border-gray-200 py-2.5 pl-9 pr-3 text-sm transition-all focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[#4ECDC4]" />
setForm({ ...form, email: e.target.value })} className="w-full rounded-lg border border-gray-200 py-2.5 pl-9 pr-3 text-sm transition-all focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[#4ECDC4]" />
setForm({ ...form, phone: e.target.value })} className="w-full rounded-lg border border-gray-200 py-2.5 pl-9 pr-3 text-sm transition-all focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[#4ECDC4]" />
setForm({ ...form, petName: e.target.value })} className="w-full rounded-lg border border-gray-200 py-2.5 pl-9 pr-3 text-sm transition-all focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[#4ECDC4]" />