or
No account?
was successfully updated — route by role if (session) redirectByRole(session.user.id); } }); // ── Helper functions ────────────────────────────────────────────────────── function showErr(msg) { const e = document.getElementById('err'); e.textContent = msg; e.style.display = 'block'; document.getElementById('ok').style.display = 'none'; } function showOk(msg) { const e = document.getElementById('ok'); e.textContent = msg; e.style.display = 'block'; document.getElementById('err').style.display = 'none'; } function setLoading(btn, spin, txt, on) { document.getElementById(btn).disabled = on; document.getElementById(spin).style.display = on ? 'block' : 'none'; document.getElementById(txt).style.display = on ? 'none' : 'block'; } function showForm(name) { ['login', 'reset', 'set-password'].forEach(f => { document.getElementById(f + '-form').style.display = (f === name) ? 'block' : 'none'; }); document.getElementById('err').style.display = 'none'; document.getElementById('ok').style.display = 'none'; } // ── Sign in ─────────────────────────────────────────────────────────────── async function doLogin() { const email = document.getElementById('email').value.trim(); const password = document.getElementById('password').value; if (!email || !password) return showErr('Please enter your email and password.'); setLoading('login-btn', 'login-spin', 'login-txt', true); const { data, error } = await sb.auth.signInWithPassword({ email, password }); setLoading('login-btn', 'login-spin', 'login-txt', false); if (error) return showErr(error.message); if (data.session) redirectByRole(data.session.user.id); } // ── Request password reset ──────────────────────────────────────────────── async function doReset() { const email = document.getElementById('reset-email').value.trim(); if (!email) return showErr('Please enter your email address.'); setLoading('reset-btn', 'reset-spin', 'reset-txt', true); // redirectTo must point to this page (/) so the token hash lands here const { error } = await sb.auth.resetPasswordForEmail(email, { redirectTo: window.location.origin + '/' }); setLoading('reset-btn', 'reset-spin', 'reset-txt', false); if (error) return showErr(error.message); showOk('Reset link sent — check your email.'); } // ── Set new password (invite acceptance or password reset) ──────────────── async function doSetPassword() { const pw = document.getElementById('new-password').value; const pw2 = document.getElementById('confirm-password').value; if (pw.length < 8) return showErr('Password must be at least 8 characters.'); if (pw !== pw2) return showErr('Passwords do not match.'); setLoading('set-btn', 'set-spin', 'set-txt', true); const { error } = await sb.auth.updateUser({ password: pw }); setLoading('set-btn', 'set-spin', 'set-txt', false); if (error) return showErr(error.message); // onAuthStateChange will fire USER_UPDATED and redirect to /app } // ── Keyboard shortcuts ──────────────────────────────────────────────────── document.getElementById('password').addEventListener('keydown', e => { if (e.key === 'Enter') doLogin(); }); document.getElementById('confirm-password').addEventListener('keydown', e => { if (e.key === 'Enter') doSetPassword(); });