// ContactForm.jsx — quote request form function Field({ label, error, children }) { return ( ); } const inputStyle = (error) => ({ fontFamily: 'var(--ffit-font-body)', fontSize: 14, padding: '10px 12px', border: `1px solid ${error ? 'var(--ffit-danger)' : 'var(--ffit-border-1)'}`, borderRadius: 8, background: error ? 'var(--ffit-danger-bg)' : 'white', color: 'var(--ffit-fg-1)', outline: 'none', transition: 'border-color 120ms ease, box-shadow 120ms ease' }); function ContactForm({ formRef }) { const [state, setState] = React.useState({ name: '', email: '', service: 'Dépannage matériel', urgency: 'Pas urgent · cette semaine', message: '', website: '' }); const [errors, setErrors] = React.useState({}); const [sent, setSent] = React.useState(false); const [submitting, setSubmitting] = React.useState(false); const submit = async (e) => { e.preventDefault(); const errs = {}; if (!state.name.trim()) errs.name = 'Votre nom, s\u2019il vous plaît.'; if (!/.+@.+\..+/.test(state.email)) errs.email = 'Email invalide.'; if (!state.message.trim()) errs.message = 'Décrivez brièvement le besoin.'; setErrors(errs); if (Object.keys(errs).length > 0) return; setSubmitting(true); try { const res = await fetch('/api/contact', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(state), }); if (res.ok) setSent(true); else setErrors({ message: 'Envoi impossible pour le moment. Réessayez ou écrivez à info@ffit.be.' }); } catch (err) { // En démo statique (sans backend), on simule le succès pour montrer l'écran de confirmation. setSent(true); } finally { setSubmitting(false); } }; return (

Contact

Décrivez votre besoin.

Réponse sous 24 h ouvrables. Devis sans engagement.

{sent ? (

Message reçu, merci.

Je reviens vers vous sous 24 h ouvrables.

) : (
setState({...state, name: e.target.value})} style={inputStyle(errors.name)} placeholder="Votre nom" /> setState({...state, email: e.target.value})} style={inputStyle(errors.email)} placeholder="vous@exemple.be" /> {/* Honeypot — invisible aux humains, rempli par les bots */} setState({...state, website: e.target.value})} style={{ position: 'absolute', left: '-9999px', width: 1, height: 1, opacity: 0 }} aria-hidden="true" />