v_1.7
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
const $ = (s) => document.querySelector(s);
|
||||
|
||||
// Decide whether to show the sign-in form or the first-run setup form.
|
||||
fetch('/api/me').then((r) => r.json()).then((m) => {
|
||||
if (m.authed) { location.href = '/'; return; }
|
||||
if (m.needsSetup) {
|
||||
$('#loginView').style.display = 'none';
|
||||
$('#setupView').style.display = 'block';
|
||||
$('#s_username').focus();
|
||||
} else {
|
||||
$('#username').focus();
|
||||
}
|
||||
}).catch(() => {});
|
||||
|
||||
// --- sign in ---------------------------------------------------------------
|
||||
async function signIn() {
|
||||
const username = $('#username').value.trim();
|
||||
const password = $('#password').value;
|
||||
$('#err').textContent = '';
|
||||
if (!username || !password) { $('#err').textContent = 'Enter your username and password.'; return; }
|
||||
$('#signin').disabled = true;
|
||||
try {
|
||||
const res = await fetch('/api/login', {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ username, password })
|
||||
});
|
||||
const data = await res.json().catch(() => ({}));
|
||||
if (!res.ok) throw new Error(data.error || 'Sign in failed.');
|
||||
location.href = '/';
|
||||
} catch (e) { $('#err').textContent = e.message; $('#signin').disabled = false; }
|
||||
}
|
||||
$('#signin').addEventListener('click', signIn);
|
||||
|
||||
// --- first-run setup -------------------------------------------------------
|
||||
async function createAdmin() {
|
||||
const username = $('#s_username').value.trim();
|
||||
const email = $('#s_email').value.trim();
|
||||
const password = $('#s_password').value;
|
||||
const password2 = $('#s_password2').value;
|
||||
$('#s_err').textContent = '';
|
||||
if (!username || !password) { $('#s_err').textContent = 'Choose a username and password.'; return; }
|
||||
if (password !== password2) { $('#s_err').textContent = 'The passwords do not match.'; return; }
|
||||
$('#createAdmin').disabled = true;
|
||||
try {
|
||||
const res = await fetch('/api/setup', {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ username, email, password })
|
||||
});
|
||||
const data = await res.json().catch(() => ({}));
|
||||
if (!res.ok) throw new Error(data.error || 'Could not create the account.');
|
||||
location.href = '/';
|
||||
} catch (e) { $('#s_err').textContent = e.message; $('#createAdmin').disabled = false; }
|
||||
}
|
||||
$('#createAdmin').addEventListener('click', createAdmin);
|
||||
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key !== 'Enter') return;
|
||||
if ($('#setupView').style.display !== 'none') createAdmin();
|
||||
else signIn();
|
||||
});
|
||||
Reference in New Issue
Block a user