Files
Traffic-information_Trackin…/assets/login.js
T

146 lines
5.1 KiB
JavaScript

(() => {
const auth = window.TrafficAuth;
const $ = (id) => document.getElementById(id);
const enrollmentByUser = new Map();
let selectedUsername = '';
function nextPage() {
const next = new URLSearchParams(location.search).get('next');
return ['link-generator.html', 'link-history.html'].includes(next) ? next : 'link-generator.html';
}
function showToast(message) {
const toast = $('toast');
toast.textContent = message; toast.classList.add('show');
setTimeout(() => toast.classList.remove('show'), 1600);
}
function currentEnrollment() {
if (!enrollmentByUser.has(selectedUsername)) enrollmentByUser.set(selectedUsername, auth.createEnrollment(selectedUsername));
return enrollmentByUser.get(selectedUsername);
}
function renderQr(otpauthUrl) {
const container = $('qrCode');
container.innerHTML = '';
if (typeof window.qrcode !== 'function') {
container.innerHTML = '<span class="qr-error">二维码加载失败,请刷新页面重试</span>';
return false;
}
try {
const qr = window.qrcode(0, 'M');
qr.addData(otpauthUrl);
qr.make();
container.innerHTML = qr.createSvgTag(5, 4);
return true;
} catch (_) {
container.innerHTML = '<span class="qr-error">二维码生成失败,请刷新页面重试</span>';
return false;
}
}
function resetForms() {
['signinPassword','signinCode','newPassword','confirmPassword','setupCode'].forEach((id) => { $(id).value = ''; });
$('accountMessage').textContent = '';
$('signinMessage').textContent = '';
$('enrollMessage').textContent = '';
}
function openAccount(username) {
selectedUsername = username;
const enrolled = auth.isEnrolled(username);
$('accountForm').classList.add('hidden');
$('confirmedAccount').classList.remove('hidden');
$('confirmedUser').textContent = username;
$('signinForm').classList.toggle('hidden', !enrolled);
$('enrollForm').classList.toggle('hidden', enrolled);
$('loginTitle').textContent = enrolled ? '欢迎回来' : '首次注册';
$('loginSubtitle').textContent = enrolled ? '输入密码和动态验证码登录' : '扫描二维码并设置本机密码';
if (!enrolled) {
const ready = renderQr(currentEnrollment().otpauthUrl);
$('enrollMessage').textContent = ready ? '' : '二维码组件加载失败,暂时无法完成注册';
}
}
function changeAccount() {
selectedUsername = '';
resetForms();
$('confirmedAccount').classList.add('hidden');
$('signinForm').classList.add('hidden');
$('enrollForm').classList.add('hidden');
$('accountForm').classList.remove('hidden');
$('loginTitle').textContent = 'Shareit ID 登录';
$('loginSubtitle').textContent = '输入你的 Shareit ID 继续';
$('loginUser').focus();
}
$('accountForm').addEventListener('submit', (event) => {
event.preventDefault();
const username = $('loginUser').value.trim().toLowerCase();
if (!username) {
$('accountMessage').textContent = '请输入 Shareit ID';
return;
}
if (!auth.findUser(username)) {
$('accountMessage').textContent = '该 Shareit ID 不在授权名单中';
return;
}
resetForms();
openAccount(username);
});
$('signinForm').addEventListener('submit', async (event) => {
event.preventDefault();
const button = event.submitter;
button.disabled = true;
$('signinMessage').textContent = '正在验证…';
try {
await auth.login(selectedUsername, $('signinPassword').value, $('signinCode').value);
location.href = nextPage();
} catch (error) {
$('signinMessage').textContent = error.message;
button.disabled = false;
}
});
$('enrollForm').addEventListener('submit', async (event) => {
event.preventDefault();
const password = $('newPassword').value;
if (password !== $('confirmPassword').value) {
$('enrollMessage').textContent = '两次输入的密码不一致';
return;
}
if (typeof window.qrcode !== 'function') {
$('enrollMessage').textContent = '二维码组件尚未加载,请刷新页面重试';
return;
}
const button = event.submitter;
button.disabled = true;
$('enrollMessage').textContent = '正在注册…';
try {
await auth.enroll(selectedUsername, password, currentEnrollment().secret, $('setupCode').value);
location.href = nextPage();
} catch (error) {
$('enrollMessage').textContent = error.message;
button.disabled = false;
}
});
$('changeAccount').addEventListener('click', changeAccount);
$('resetEnrollment').addEventListener('click', () => {
if (!window.confirm(`确定清除 ${selectedUsername} 在当前浏览器的密码和 Authenticator 绑定吗?`)) return;
try {
auth.clearEnrollment(selectedUsername);
enrollmentByUser.delete(selectedUsername);
resetForms();
openAccount(selectedUsername);
showToast('本机绑定已清除,请重新注册');
} catch (error) {
$('signinMessage').textContent = error.message;
}
});
if (auth.currentUser()) location.replace(nextPage());
else $('loginUser').focus();
})();