/* ============ Contact — input / confirm / complete ============ */ const PURPOSES = ["アプリ開発について","Webシステム開発について","AI開発について","ハードウェア・IoT開発について","DX・業務改善について","プロトタイプ開発について","共同開発・協業について","取材・登壇について","その他"]; const BUDGETS = ["未定","〜50万円","50〜100万円","100〜300万円","300〜500万円","500万円以上"]; function Field({ label, en, required, children, error }) { return ( ); } function Contact() { const [step, setStep] = useState(0); // 0 form, 1 confirm, 2 done const [f, setF] = useState({ title:"", purpose:"", content:"", company:"", name:"", email:"", phone:"", budget:"", timing:"", url:"", file:"", agree:false }); const [errs, setErrs] = useState({}); const [sending, setSending] = useState(false); const [sendError, setSendError] = useState(""); const set = (k) => (e) => setF(s => ({ ...s, [k]: e.target.type === "checkbox" ? e.target.checked : e.target.value })); const validate = () => { const e = {}; if (!f.title.trim()) e.title = "入力してください"; if (!f.purpose) e.purpose = "選択してください"; if (!f.content.trim()) e.content = "入力してください"; if (!f.name.trim()) e.name = "入力してください"; if (!f.email.trim()) e.email = "入力してください"; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(f.email)) e.email = "メール形式が正しくありません"; if (!f.agree) e.agree = "同意が必要です"; setErrs(e); return Object.keys(e).length === 0; }; const toConfirm = () => { if (validate()) { setSendError(""); setStep(1); window.scrollTo({top:document.getElementById("contact").offsetTop-40,behavior:"smooth"}); } }; const submit = async () => { if (sending) return; setSending(true); setSendError(""); try { const res = await fetch("contact.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(f) }); const data = await res.json().catch(() => ({})); if (!res.ok || !data.ok) { if (data.errors) setErrs(data.errors); throw new Error(data.message || "送信に失敗しました。"); } setStep(2); } catch (err) { setSendError(err.message || "送信に失敗しました。"); } finally { setSending(false); } }; const reset = () => { setF({ title:"",purpose:"",content:"",company:"",name:"",email:"",phone:"",budget:"",timing:"",url:"",file:"",agree:false }); setErrs({}); setSendError(""); setStep(0); }; return (
07 Contact
GET IN TOUCH

開発・DX・AI・ハードウェア/IoT・プロトタイプ制作まで、まずは気軽にご相談ください。アイデア段階でも構いません。

{["入力","確認","完了"].map((s,i)=>( i?"done":""}`}>{i+1}{s} ))}
{step === 0 && (
{PURPOSES.map(p => ( ))}