// 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) => (
{mode === 'login' ? 'Masuk untuk lapor & pantau lingkunganmu.' : 'Buat akun untuk mulai melapor dan kumpulkan poin.'}