const $ = s => document.querySelector(s); const fail = e => { $('#err').textContent = e && e.name === 'NotAllowedError' ? 'Cancelled. Try again.' : (e.message || String(e)); }; async function signIn() { $('#err').textContent = ''; try { await passkeyLogin(); location.replace('/'); } catch (e) { fail(e); } } async function init() { if (!window.PublicKeyCredential) { $('#sub').textContent = ''; return fail(new Error('This browser does not support passkeys.')); } const st = await (await fetch('/api/auth/state')).json(); if (st.authed) return location.replace('/'); if (st.registered) { $('#sub').textContent = 'Sign in with your passkey'; $('#ui').innerHTML = ''; $('#go').onclick = signIn; $('#ui').insertAdjacentHTML('beforeend', '
New device or lost your devices? Use an invite or recovery code
'); $('#inv').onclick = e => { e.preventDefault(); $('#err').textContent = ''; $('#sub').textContent = 'Add this device'; $('#ui').innerHTML = ``; $('#f').onsubmit = async ev => { ev.preventDefault(); $('#err').textContent = ''; try { await passkeyRegister('', $('#nm').value.trim() || 'Passkey', $('#ic').value.trim()); location.replace('/'); } catch (err) { fail(err); } }; }; // Offer the passkey straight away unless the user came here to use an invite code. signIn(); } else { $('#sub').textContent = 'First-time setup: create a passkey for this device'; $('#ui').innerHTML = ``; $('#f').onsubmit = async e => { e.preventDefault(); $('#err').textContent = ''; try { await passkeyRegister($('#sc').value.trim(), $('#nm').value.trim() || 'Passkey'); location.replace('/'); } catch (err) { fail(err); } }; } } init().catch(fail);