function AuthDrawer({ isOpen, onClose }) { const [tab, setTab] = React.useState('signup'); // 'signup' | 'signin' const [submitted, setSubmitted] = React.useState(false); const [loading, setLoading] = React.useState(false); const [form, setForm] = React.useState({ firstName: '', lastName: '', email: '', phone: '', password: '', street: '', city: '', postal: '', country: 'Indonesia', newsletter: true, }); const [errors, setErrors] = React.useState({}); function set(k, v) { setForm(f => ({ ...f, [k]: v })); setErrors(e => ({ ...e, [k]: '' })); } function validate() { const e = {}; if (tab === 'signup') { if (!form.firstName.trim()) e.firstName = 'Required'; if (!form.lastName.trim()) e.lastName = 'Required'; if (!form.street.trim()) e.street = 'Required'; if (!form.city.trim()) e.city = 'Required'; if (!form.postal.trim()) e.postal = 'Required'; } if (!form.email.includes('@')) e.email = 'Valid email required'; if (form.password.length < 8) e.password = 'Minimum 8 characters'; return e; } function handleSubmit(e) { e.preventDefault(); const errs = validate(); if (Object.keys(errs).length) { setErrors(errs); return; } setLoading(true); setTimeout(() => { if (tab === 'signup') { const result = window.UmbraDB?.saveAccount?.(form); if (result === null) { setErrors({ email: 'Account already exists' }); setLoading(false); return; } window.UmbraDB?.setSession?.(result); } else { const account = window.UmbraDB?.findAccount?.(form.email); if (account) window.UmbraDB?.setSession?.(account); } setLoading(false); setSubmitted(true); }, 1100); } function reset() { setSubmitted(false); setLoading(false); setForm({ firstName: '', lastName: '', email: '', phone: '', password: '', street: '', city: '', postal: '', country: 'Indonesia', newsletter: true }); setErrors({}); } // Shared input style factory function inp(key) { return { width: '100%', background: 'none', border: 'none', borderBottom: `1px solid ${errors[key] ? 'rgba(0,0,0,0.6)' : 'rgba(0,0,0,0.18)'}`, padding: '10px 0', outline: 'none', fontFamily: "'Montserrat', sans-serif", fontSize: 12, color: '#000000', letterSpacing: '0.04em', transition: 'border-color 0.2s', }; } function lbl(txt, key) { return (