import { useEffect, useState } from 'react'; import { ApiError, fetchMyCustomer, loadSession, sendOfferRequest } from '../lib/api'; const istEmail = (e: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim()); /** * Anfrageformular „Individuelles Angebot". * * Wird an zwei Stellen genutzt: im Konfigurator als eigene Seite (nach der Wahl * eines Anfrageprodukts) und in der Seitenleiste als Dialog. Deshalb rendert es * nur den Inhalt – die Umrahmung (Karte bzw. Overlay) kommt von außen. * * `onClose` blendet im Dialog den Schließen-Button ein; inline (im Konfigurator) * bleibt er weg. */ export default function OfferForm({ produkt, onClose }: { produkt?: string; onClose?: () => void }) { const gewaehltesProdukt = produkt?.trim() || ''; const [form, setForm] = useState({ first_name: '', last_name: '', email: '', phone: '', quantity: '', message: '' }); const [datenschutz, setDatenschutz] = useState(false); const [status, setStatus] = useState<'formular' | 'sendet' | 'fertig'>('formular'); const [fehler, setFehler] = useState([]); // Bei angemeldeten Kunden Name und E-Mail vorausfüllen. useEffect(() => { if (!loadSession()) return; fetchMyCustomer() .then((c) => { if (!c) return; setForm((f) => ({ ...f, first_name: c.first_name || f.first_name, last_name: c.last_name || f.last_name, email: c.email || f.email, phone: c.phone || f.phone, })); }) .catch(() => { /* Vorausfüllen ist optional */ }); }, []); const set = (k: keyof typeof form) => (e: React.ChangeEvent) => { const roh = e.target.value; setForm({ ...form, [k]: k === 'phone' ? roh.replace(/[^0-9+ ]/g, '') : roh }); }; async function absenden(e: React.FormEvent) { e.preventDefault(); if (!istEmail(form.email)) { setFehler(['Bitte geben Sie eine gültige E-Mail-Adresse an.']); return; } if (!form.phone.trim()) { setFehler(['Bitte geben Sie eine Telefonnummer an.']); return; } setFehler([]); setStatus('sendet'); try { await sendOfferRequest({ first_name: form.first_name.trim(), last_name: form.last_name.trim(), email: form.email.trim(), phone: form.phone.trim() || undefined, quantity: form.quantity ? Number(form.quantity) : null, message: form.message.trim(), product: gewaehltesProdukt || undefined, }); setStatus('fertig'); } catch (err) { setFehler(err instanceof ApiError ? (err.details.length ? err.details : [err.message]) : ['Anfrage konnte nicht gesendet werden.']); setStatus('formular'); } } if (status === 'fertig') { return ( <>

Vielen Dank – wir melden uns werktags innerhalb eines Tages mit einem Angebot bei Ihnen.

{onClose && ( )} ); } return ( <>

Größere Mengen, Sonderformate, Unterschriftenservice oder automatisierte Follow-ups – schildern Sie kurz Ihr Vorhaben.

{gewaehltesProdukt && (
Ihre Anfrage betrifft
{gewaehltesProdukt}
)}