/* global React */ // Formulário do usuário final (Agência 4 Patas). // Lê e persiste os valores no localStorage do navegador. const STORAGE_KEY = 'proposta-agencia-4patas-v1'; function useClientForm(defaults) { const [data, setData] = React.useState(() => { try { const stored = localStorage.getItem(STORAGE_KEY); if (stored) { const parsed = JSON.parse(stored); return { ...defaults, ...parsed }; } } catch (e) {} return defaults; }); const update = (key, value) => { setData(prev => { const next = { ...prev, [key]: value }; try { localStorage.setItem(STORAGE_KEY, JSON.stringify(next)); } catch (e) {} return next; }); }; const reset = () => { try { localStorage.removeItem(STORAGE_KEY); } catch (e) {} setData(defaults); }; return [data, update, reset]; } function useServicePrices(defaultServices) { const STORAGE = STORAGE_KEY + '-services'; const [services, setServices] = React.useState(() => { try { const stored = localStorage.getItem(STORAGE); if (stored) { const parsed = JSON.parse(stored); return defaultServices.map((s, i) => ({ ...s, price: parsed[i]?.price ?? s.price, priceLabel: parsed[i]?.priceLabel ?? s.priceLabel, })); } } catch (e) {} return defaultServices; }); const updateService = (idx, patch) => { setServices(prev => { const next = prev.map((s, i) => i === idx ? { ...s, ...patch } : s); try { const toStore = next.map(s => ({ price: s.price, priceLabel: s.priceLabel })); localStorage.setItem(STORAGE, JSON.stringify(toStore)); } catch (e) {} return next; }); }; const resetServices = () => { try { localStorage.removeItem(STORAGE); } catch (e) {} setServices(defaultServices); }; return [services, updateService, resetServices]; } // ── UI primitives ─────────────────────────────────────────────────────────── function Field({ label, children, hint }) { return ( ); } function TextInput({ value, onChange, placeholder, disabled }) { return ( onChange(e.target.value)} placeholder={placeholder} disabled={disabled} readOnly={disabled} /> ); } function NumberInput({ value, onChange, min = 0, max = 99999, step = 1, prefix }) { return (
{prefix && {prefix}} onChange(Number(e.target.value) || 0)} />
); } function Textarea({ value, onChange, rows = 2 }) { return (