// gs-auth.jsx — layar login/daftar gs.town (email + password) function LoginScreen({ onAuthed, onClose }) { const [mode, setMode] = React.useState('login'); // login | signup const [name, setName] = React.useState(''); const [email, setEmail] = React.useState(''); const [pass, setPass] = React.useState(''); const [busy, setBusy] = React.useState(false); const [err, setErr] = React.useState(''); const [info, setInfo] = React.useState(''); const submit = async () => { setErr(''); setInfo(''); if (!email.trim() || !pass) return setErr('Email dan kata sandi wajib diisi'); if (mode === 'signup' && !name.trim()) return setErr('Nama wajib diisi'); if (pass.length < 6) return setErr('Kata sandi minimal 6 karakter'); setBusy(true); try { if (mode === 'signup') { const res = await gsData.signUp(email.trim(), pass, name.trim()); if (res.error) { setErr(res.error.message); setBusy(false); return; } if (res.data && res.data.session) { onAuthed(); return; } setInfo('Akun dibuat. Cek email untuk verifikasi, lalu masuk.'); setMode('login'); setBusy(false); return; } else { const res = await gsData.signIn(email.trim(), pass); if (res.error) { setErr(res.error.message); setBusy(false); return; } onAuthed(); return; } } catch (e) { setErr(String(e.message || e)); setBusy(false); } }; const field = (label, value, set, type, ph) => (
{ set(e.target.value); setErr(''); }} placeholder={ph} autoCapitalize={type === 'email' ? 'none' : 'sentences'} autoCorrect="off" style={{ width: '100%', padding: '14px 15px', borderRadius: 'var(--r-md)', border: '1px solid var(--border)', background: 'var(--surface-2)', fontFamily: 'var(--font)', fontSize: 15, fontWeight: 500, color: 'var(--text-1)', outline: 'none' }} />
); return (
{onClose && }

{mode === 'login' ? 'Selamat datang kembali' : 'Gabung warga Gading Serpong'}

{mode === 'login' ? 'Masuk untuk lapor & pantau lingkunganmu.' : 'Buat akun untuk mulai melapor dan kumpulkan poin.'}

{mode === 'signup' && field('Nama lengkap', name, setName, 'text', 'cth. Rama Aditya')} {field('Email', email, setEmail, 'email', 'kamu@email.com')} {field('Kata sandi', pass, setPass, 'password', 'minimal 6 karakter')} {err && (
{err}
)} {info && (
{info}
)}
{mode === 'login' ? 'Belum punya akun? ' : 'Sudah punya akun? '}
); } window.LoginScreen = LoginScreen;