127 lines
5.6 KiB
JavaScript
127 lines
5.6 KiB
JavaScript
import { api, loadGoals } from './api.js';
|
|
import { tr } from './i18n.js';
|
|
import { state } from './state.js';
|
|
import { tpl, showSheet, closeOv, showToast, updateHeader } from './ui.js';
|
|
import { render } from './render.js';
|
|
|
|
export function showLogin(err) {
|
|
const c = tpl('tpl-login');
|
|
if (err) { const e = c.querySelector('.login-err'); e.textContent = err; e.style.display = ''; }
|
|
showSheet(c, false);
|
|
const email = c.querySelector('.lf-email'), pass = c.querySelector('.lf-pass'), sub = c.querySelector('.lf-sub');
|
|
setTimeout(() => email.focus(), 50);
|
|
email.onkeydown = e => { if (e.key === 'Enter') pass.focus(); };
|
|
pass.onkeydown = e => { if (e.key === 'Enter') sub.click(); };
|
|
c.querySelector('.lf-fgt').onclick = () => showForgotPassword();
|
|
sub.onclick = () => {
|
|
const ev = email.value.trim(), pv = pass.value;
|
|
if (!ev || !pv) {
|
|
const errEl = c.querySelector('.login-err');
|
|
errEl.textContent = tr('loginErrEmpty'); errEl.style.display = '';
|
|
return;
|
|
}
|
|
sub.disabled = true; sub.textContent = '…';
|
|
api('POST', 'login', { email: ev, password: pv })
|
|
.then(() => loadGoals())
|
|
.then(g => { state.goals = g; closeOv(); render(); })
|
|
.catch(err => {
|
|
sub.disabled = false; sub.textContent = tr('loginBtn');
|
|
showLogin(err.status === 401 ? tr('loginErrWrong') : err.status === 429 ? tr('loginErrRate') : tr('loginErrConn'));
|
|
});
|
|
};
|
|
}
|
|
|
|
export function showForgotPassword() {
|
|
const c = tpl('tpl-forgot-pw');
|
|
showSheet(c, false);
|
|
const email = c.querySelector('.fp-email'), errEl = c.querySelector('.login-err'), sub = c.querySelector('.fp-sub');
|
|
setTimeout(() => email.focus(), 50);
|
|
c.querySelector('.fp-back').onclick = () => showLogin();
|
|
sub.onclick = () => {
|
|
const ev = email.value.trim(); if (!ev) return;
|
|
sub.disabled = true; sub.textContent = '…';
|
|
api('POST', 'reset-request', { email: ev })
|
|
.then(() => {
|
|
const conf = tpl('tpl-email-sent');
|
|
conf.querySelector('.es-ok').onclick = () => showLogin();
|
|
showSheet(conf, false);
|
|
})
|
|
.catch(err => {
|
|
sub.disabled = false; sub.textContent = tr('sendLink');
|
|
errEl.textContent = err.message || 'Fehler'; errEl.style.display = '';
|
|
});
|
|
};
|
|
}
|
|
|
|
export function showResetPassword(selector, token) {
|
|
const c = tpl('tpl-reset-pw');
|
|
showSheet(c, false);
|
|
const pass = c.querySelector('.rp-pass'), errEl = c.querySelector('.login-err'), sub = c.querySelector('.rp-sub');
|
|
setTimeout(() => pass.focus(), 50);
|
|
sub.onclick = () => {
|
|
const pv = pass.value; if (!pv) return;
|
|
sub.disabled = true; sub.textContent = '…';
|
|
api('POST', 'reset-password', { selector, token, password: pv })
|
|
.then(() => {
|
|
const conf = tpl('tpl-pw-changed');
|
|
conf.querySelector('.pc-ok').onclick = () => showLogin();
|
|
showSheet(conf, false);
|
|
})
|
|
.catch(err => {
|
|
sub.disabled = false; sub.textContent = tr('setPw');
|
|
errEl.textContent = err.message || 'Fehler'; errEl.style.display = '';
|
|
});
|
|
};
|
|
}
|
|
|
|
export function showChangePassword() {
|
|
const c = tpl('tpl-change-pw');
|
|
showSheet(c, true);
|
|
const oldP = c.querySelector('.cp-old'), newP = c.querySelector('.cp-new'), newP2 = c.querySelector('.cp-new2');
|
|
const errEl = c.querySelector('.login-err'), sub = c.querySelector('.cp-sub');
|
|
setTimeout(() => oldP.focus(), 50);
|
|
c.querySelector('.cp-can').onclick = closeOv;
|
|
sub.onclick = () => {
|
|
const o = oldP.value, n = newP.value, n2 = newP2.value;
|
|
if (!o || !n || !n2) return;
|
|
if (n !== n2) { errEl.textContent = tr('errPwMismatch'); errEl.style.display = ''; return; }
|
|
sub.disabled = true; sub.textContent = '…';
|
|
api('POST', 'change-password', { old_password: o, new_password: n })
|
|
.then(() => { showToast(tr('pwChanged')); closeOv(); })
|
|
.catch(err => {
|
|
sub.disabled = false; sub.textContent = tr('changePwBtn');
|
|
errEl.textContent = err.message || 'Fehler'; errEl.style.display = '';
|
|
});
|
|
};
|
|
}
|
|
|
|
export function showRegister(token) {
|
|
const c = tpl('tpl-register');
|
|
showSheet(c, false);
|
|
const nameInp = c.querySelector('.rg-name'), email = c.querySelector('.rg-email');
|
|
const pass = c.querySelector('.rg-pass'), pass2 = c.querySelector('.rg-pass2');
|
|
const errEl = c.querySelector('.login-err'), sub = c.querySelector('.rg-sub');
|
|
setTimeout(() => nameInp.focus(), 50);
|
|
nameInp.onkeydown = e => { if (e.key === 'Enter') email.focus(); };
|
|
email.onkeydown = e => { if (e.key === 'Enter') pass.focus(); };
|
|
pass.onkeydown = e => { if (e.key === 'Enter') pass2.focus(); };
|
|
pass2.onkeydown = e => { if (e.key === 'Enter') sub.click(); };
|
|
const checkMatch = () => {
|
|
if (pass2.value && pass.value !== pass2.value) { errEl.textContent = tr('errPwMismatch2'); errEl.style.display = ''; }
|
|
else errEl.style.display = 'none';
|
|
};
|
|
pass.oninput = checkMatch; pass2.oninput = checkMatch;
|
|
sub.onclick = () => {
|
|
const nv = nameInp.value.trim(), ev = email.value.trim(), pv = pass.value;
|
|
if (!nv || !ev || !pv) { errEl.textContent = tr('errFillAll'); errEl.style.display = ''; return; }
|
|
if (pv !== pass2.value) { errEl.textContent = tr('errPwMismatch2'); errEl.style.display = ''; return; }
|
|
sub.disabled = true; sub.textContent = '…';
|
|
api('POST', 'register', { name: nv, email: ev, password: pv, token })
|
|
.then(r => { state.userName = r.name || ''; return loadGoals(); })
|
|
.then(g => { state.goals = g; closeOv(); updateHeader(); render(); })
|
|
.catch(err => {
|
|
sub.disabled = false; sub.textContent = tr('registerBtn');
|
|
errEl.textContent = err.message || 'Fehler'; errEl.style.display = '';
|
|
});
|
|
};
|
|
}
|