import { FormEvent, useEffect, useState } from "react"; import { copyFor } from "./content/strings"; import type { Language, Scenario } from "./demo/types"; import { buildLeadDraft, defaultLeadMessage, leadContact, submitLead, type LeadSubmissionConfig, type ProductInterest, } from "./leads"; interface LeadFormProps { language: Language; clinic: string; specialty: string; scenario: Scenario; transcript: string; endpoint?: string; leadEmail?: string; fetcher?: typeof fetch; onMailto?: (url: string) => void; interest?: ProductInterest; onInterestChange?: (interest: ProductInterest) => void; hideInterestField?: boolean; } export default function LeadForm({ language, clinic, specialty, scenario, transcript, endpoint = import.meta.env.VITE_LEAD_ENDPOINT, leadEmail = leadContact.email, fetcher, onMailto, interest: controlledInterest, onInterestChange, hideInterestField = false, }: LeadFormProps) { const labels = copyFor(language).form; const [localInterest, setLocalInterest] = useState("both"); const interest = controlledInterest ?? localInterest; const [name, setName] = useState(""); const [clinicName, setClinicName] = useState(clinic); const [specialtyName, setSpecialtyName] = useState(specialty); const [role, setRole] = useState(""); const [contact, setContact] = useState(""); const [includeDemoContext, setIncludeDemoContext] = useState(false); const [message, setMessage] = useState(() => defaultLeadMessage(clinic, specialty, scenario, language, interest), ); const [messageDirty, setMessageDirty] = useState(false); const [status, setStatus] = useState< "idle" | "submitting" | "posted" | "mailto" | "error" >("idle"); const [errors, setErrors] = useState>({}); useEffect(() => { if (!messageDirty) { setMessage( defaultLeadMessage( clinicName, specialtyName, scenario, language, interest, includeDemoContext, ), ); } }, [clinicName, includeDemoContext, interest, language, messageDirty, scenario, specialtyName]); async function sendRequest(event: FormEvent) { event.preventDefault(); const nextErrors: Record = {}; for (const [key, value] of Object.entries({ name, clinic: clinicName, specialty: specialtyName, role, contact, message, })) { if (!value.trim()) nextErrors[key] = labels.required; } setErrors(nextErrors); if (Object.keys(nextErrors).length > 0) return; const payload = buildLeadDraft({ clinic: clinicName, specialty: specialtyName, scenario, transcript, language, interest, includeInterpreterContext: includeDemoContext, fields: { name, role, contact, message }, }); setStatus("submitting"); try { const submissionConfig: LeadSubmissionConfig = { endpoint, email: leadEmail, }; if (fetcher) submissionConfig.fetcher = fetcher; if (onMailto) submissionConfig.openMailto = onMailto; const result = await submitLead(payload, submissionConfig); setStatus(result); } catch { setStatus("error"); } } return (
{interest !== "scribe" && ( )} {!hideInterestField && ( )}