);
}
function MenuGroup({ theme, title, children }) {
return (
{title}
{children}
);
}
function MenuItem({ theme, accent, icon, label, hint, color, last, onClick }) {
return (
);
}
// ─── LOGIN ───────────────────────────────────────────────────────
function ScreenLogin({ theme, accent, onContinue, auth }) {
const T = theme;
const [mode, setMode] = React.useState('main'); // main | password | magic
const [email, setEmail] = React.useState('');
const [password, setPass] = React.useState('');
const [isSignup, setIsSignup] = React.useState(false);
const [sent, setSent] = React.useState(false);
const [loading, setLoading] = React.useState(false);
const [err, setErr] = React.useState('');
const [showPass, setShowPass] = React.useState(false);
const validEmail = email.includes('@') && email.includes('.');
const realAuth = auth || {};
function reset() { setErr(''); setLoading(false); }
async function handlePassword(e) {
e && e.preventDefault();
if (!validEmail || password.length < 6) return;
setLoading(true); setErr('');
if (!window.SB) { setErr('Koneksi belum siap'); setLoading(false); return; }
try {
if (isSignup) {
var r = await window.SB.auth.signUp({
email, password,
options: { emailRedirectTo: window.location.origin }
});
if (r.error) throw r.error;
// Jika email confirm OFF → user langsung punya session
if (r.data && r.data.session) {
// Langsung masuk — useAuth akan detect via onAuthStateChange
setLoading(false); return;
}
// Jika email confirm ON → tampilkan pesan cek email
setSent(true); setLoading(false); return;
} else {
var r = await window.SB.auth.signInWithPassword({ email, password });
if (r.error) throw r.error;
// Login sukses — App detect session change otomatis
}
} catch(e) {
var msg = e.message || 'Gagal login';
if (msg.includes('Invalid login credentials')) msg = 'Email atau password salah';
if (msg.includes('Email not confirmed')) msg = 'Email belum diverifikasi — cek inbox kamu';
if (msg.includes('User already registered')) msg = 'Email sudah terdaftar — coba login';
setErr(msg); setLoading(false);
}
}
async function handleMagicLink(e) {
e && e.preventDefault();
if (!validEmail) return;
setLoading(true); setErr('');
try {
var r = await window.SB.auth.signInWithOtp({
email, options: { emailRedirectTo: window.location.origin }
});
if (r.error) throw r.error;
setSent(true); setLoading(false);
} catch(e) {
var msg = e.message || 'Gagal';
if (msg.includes('rate limit')) msg = 'Terlalu banyak percobaan, tunggu beberapa menit';
setErr(msg); setLoading(false);
}
}
async function handleGoogle() {
setLoading(true); setErr('');
try {
if (!window.SB) throw new Error('Koneksi belum siap');
var r = await window.SB.auth.signInWithOAuth({
provider: 'google',
options: { redirectTo: window.location.origin },
});
if (r.error) throw r.error;
} catch(e) {
setErr(e.message || 'Gagal login dengan Google'); setLoading(false);
}
}
// ── Sent confirmation ───────────────────────────────────────────
if (sent) return (
{isSignup ? '🎉' : '✉️'}
{isSignup ? 'Cek email kamu!' : 'Link terkirim!'}
{isSignup
? <>Kami kirim link verifikasi ke {email}. Klik link tersebut lalu kembali ke sini untuk login.>
: <>Kami kirim magic link ke {email}. Klik link di email untuk masuk.>
}