/* Stream Translations — Contact form + Footer. Exports to window. */ const { useState: useStateC, useEffect: useEffectC } = React; /* ===== Email delivery config (Web3Forms — no server, reliable CORS) ===== Submissions POST to Web3Forms via AJAX and the success screen shows in place (no page reload). To change the access key or receiving address, update it in your Web3Forms account and replace accessKey. */ const FORM_CONFIG = { endpoint: "https://api.web3forms.com/submit", accessKey: "687a5997-86c3-4673-b400-132b2d6ec472", subject: "【お問い合わせ】Stream Translations サイトより", fromName: "Stream Translations サイト", }; function Contact({ c, refEl }) { const f = c.contact.form; const [vals, setVals] = useStateC({ name: "", company: "", email: "", lang: "", message: "" }); const [errs, setErrs] = useStateC({}); const [sent, setSent] = useStateC(false); const [sending, setSending] = useStateC(false); const [sendErr, setSendErr] = useStateC(""); const set = (k) => (e) => setVals((v) => ({ ...v, [k]: e.target.value })); const validate = () => { const e = {}; if (!vals.name.trim()) e.name = f.errName; if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(vals.email)) e.email = f.errEmail; if (!vals.message.trim()) e.message = f.errMessage; setErrs(e); return Object.keys(e).length === 0; }; // Submit via AJAX to Web3Forms; show the success screen in place. const submit = async (ev) => { ev.preventDefault(); setSendErr(""); if (!validate()) return; setSending(true); const payload = { access_key: FORM_CONFIG.accessKey, subject: FORM_CONFIG.subject, from_name: FORM_CONFIG.fromName, name: vals.name, company: vals.company || "—", email: vals.email, replyto: vals.email, language: vals.lang || "—", message: vals.message, botcheck: false, }; try { const res = await fetch(FORM_CONFIG.endpoint, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json" }, body: JSON.stringify(payload), }); const data = await res.json().catch(() => ({})); if (data.success) { setSent(true); } else { setSendErr(f.errSend); } } catch (e) { setSendErr(f.errSend); } finally { setSending(false); } }; const reset = () => { setVals({ name: "", company: "", email: "", lang: "", message: "" }); setErrs({}); setSent(false); setSending(false); setSendErr(""); }; return (

{c.contact.eyebrow}

{c.contact.title}

{c.contact.body}

{sent ? (

{f.thanksTitle}

{f.thanksBody}

) : (
{errs.name && {errs.name}}
{errs.email && {errs.email}}