// Demo request modal — opens from any .btn linking to #demo; sends via e-mail const { useState: useStateDF, useEffect: useEffectDF, useRef: useRefDF } = React; const DEMO_EMAIL = "comercial@naescala.com.br"; const DEMO_FIELDS = [ { name: "razao", label: "Razão social", req: true, span: 2, ac: "organization" }, { name: "responsavel", label: "Nome do responsável", req: true, span: 2, ac: "name" }, { name: "cnpj", label: "CNPJ", req: true, span: 1, ph: "00.000.000/0000-00" }, { name: "cep", label: "CEP", req: false, span: 1, ph: "00000-000", ac: "postal-code" }, { name: "rua", label: "Rua", req: false, span: 2, ac: "address-line1" }, { name: "numero", label: "Número", req: false, span: 1 }, { name: "bairro", label: "Bairro", req: false, span: 1 }, { name: "cidade", label: "Cidade", req: false, span: 1 }, { name: "estado", label: "Estado", req: false, span: 1 }, { name: "telefone", label: "Telefone", req: true, span: 1, type: "tel", ph: "(00) 00000-0000", ac: "tel" }, { name: "email", label: "E-mail", req: true, span: 1, type: "email", ph: "voce@empresa.com.br", ac: "email" }, ]; function DemoModal() { const [open, setOpen] = useStateDF(false); const [vals, setVals] = useStateDF({}); const [errors, setErrors] = useStateDF({}); const [sent, setSent] = useStateDF(false); const firstRef = useRefDF(null); // open from any CTA button pointing to #demo useEffectDF(() => { const onClick = (e) => { const a = e.target.closest && e.target.closest("a.btn"); if (a && (a.getAttribute("href") || "").indexOf("#demo") !== -1) { e.preventDefault(); setOpen(true); } }; const onKey = (e) => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("click", onClick); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("click", onClick); document.removeEventListener("keydown", onKey); }; }, []); useEffectDF(() => { document.body.style.overflow = open ? "hidden" : ""; if (open) { setSent(false); setTimeout(() => firstRef.current && firstRef.current.focus(), 60); } }, [open]); const set = (name, v) => { setVals((p) => ({ ...p, [name]: v })); setErrors((p) => (p[name] ? { ...p, [name]: false } : p)); }; const validate = () => { const er = {}; DEMO_FIELDS.forEach((f) => { const v = (vals[f.name] || "").trim(); if (f.req && !v) er[f.name] = true; if (f.name === "email" && v && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) er[f.name] = true; }); return er; }; const buildBody = () => { const lines = ["Solicitação de demonstração — Na Escala", ""]; DEMO_FIELDS.forEach((f) => { const v = (vals[f.name] || "").trim(); if (v || f.req) lines.push(f.label + ": " + (v || "-")); }); lines.push("", "Enviado pelo site naescala.com.br"); return lines.join("\r\n"); }; const submit = (e) => { e.preventDefault(); const er = validate(); setErrors(er); if (Object.keys(er).length) { const first = DEMO_FIELDS.find((f) => er[f.name]); const el = document.getElementById("df-" + first.name); if (el) el.focus(); return; } const subject = "Solicitação de demonstração — " + (vals.razao || "").trim(); const mailto = "mailto:" + DEMO_EMAIL + "?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(buildBody()); window.location.href = mailto; setSent(true); }; const copy = () => { const txt = "Para: " + DEMO_EMAIL + "\r\n" + buildBody(); if (navigator.clipboard) navigator.clipboard.writeText(txt); }; if (!open) return null; return (
Abrimos seu aplicativo de e-mail com a solicitação já preenchida. É só revisar e enviar para {DEMO_EMAIL}.
Não abriu? Copie os dados e envie manualmente.
Preencha os dados abaixo. Nossa equipe entra em contato para liberar seu teste de 30 dias.