Files
duplicati_preview/public/setup.js
T

102 lines
2.7 KiB
JavaScript

import { createFeedbackController, escapeHtml } from './modules/common.js';
import { buildLoginUrl, loadAuthState, redirectToNextPath } from './modules/auth-client.js';
const feedback = createFeedbackController(document.querySelector('#feedback'));
const authSummaryElement = document.querySelector('#authSummary');
const setupForm = document.querySelector('#setupForm');
const setupButton = document.querySelector('#setupButton');
function setSummaryRows(rows) {
authSummaryElement.innerHTML = `
<div class="summary-stack">
${rows
.map(
(row) => `
<div class="summary-row">
<span>${escapeHtml(row.label)}</span>
<strong>${escapeHtml(row.value)}</strong>
</div>
`
)
.join('')}
</div>
`;
}
async function postJson(url, payload) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
const body = await response.json().catch(() => ({}));
if (!response.ok) {
throw new Error(`${body.error?.code ?? 'REQUEST_FAILED'}: ${body.error?.message ?? 'Request failed.'}`);
}
return body;
}
async function refreshAuthState() {
const auth = await loadAuthState();
if (auth.authenticated) {
setSummaryRows([
{ label: '状态', value: `已登录:${auth.username}` },
{ label: '会话有效期', value: auth.expiresAt ?? '未知' }
]);
redirectToNextPath('/');
return;
}
if (!auth.setupRequired) {
window.location.assign(buildLoginUrl());
return;
}
setSummaryRows([
{ label: '系统状态', value: '尚未配置管理员账号' },
{ label: '下一步', value: '创建管理员账号并进入系统' }
]);
}
async function handleSetup(event) {
event.preventDefault();
feedback.clear();
const password = document.querySelector('#setupPassword').value;
const passwordConfirm = document.querySelector('#setupPasswordConfirm').value;
if (password !== passwordConfirm) {
feedback.set('error', '两次输入的密码不一致。');
return;
}
setupButton.disabled = true;
try {
await postJson('/api/auth/setup', {
username: document.querySelector('#setupUsername').value.trim(),
password
});
await refreshAuthState();
} catch (error) {
feedback.set('error', error.message);
} finally {
setupButton.disabled = false;
}
}
setupForm.addEventListener('submit', (event) => {
void handleSetup(event);
});
void refreshAuthState().catch((error) => {
feedback.set('error', error.message);
setSummaryRows([
{ label: '状态', value: '无法读取认证信息' },
{ label: '错误', value: error.message }
]);
});