Initial commit

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
fish03
2026-09-23 14:43:16 +07:00
co-authored by Claude Opus 5.5
commit bef9f8b4ed
663 changed files with 81305 additions and 0 deletions
+213
View File
@@ -0,0 +1,213 @@
(function () {
var mask = document.getElementById("registerDialog");
if (!mask) return;
var form = mask.querySelector("[data-register-dialog-form]");
var accountInput = mask.querySelector("[data-register-account]");
var passwordInput = mask.querySelector("[data-register-password]");
var confirmInput = mask.querySelector("[data-register-password-confirm]");
var submitBtn = mask.querySelector("[data-register-submit]");
var defaultSubmitText = (submitBtn && submitBtn.textContent) || "立即注册";
function setSubmitting(loading) {
if (!submitBtn) return;
submitBtn.disabled = !!loading;
submitBtn.classList.toggle("is-loading", !!loading);
submitBtn.setAttribute("aria-busy", loading ? "true" : "false");
submitBtn.textContent = loading ? "注册中..." : defaultSubmitText;
}
function getField(name) {
return mask.querySelector('[data-register-field="' + name + '"]');
}
function setFieldError(name, message) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-register-control]");
var error = field.querySelector("[data-register-error]");
if (control) control.classList.add("is-error");
if (error) {
error.textContent = message;
error.hidden = false;
}
}
function clearFieldError(name) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-register-control]");
var error = field.querySelector("[data-register-error]");
if (control) control.classList.remove("is-error");
if (error) error.hidden = true;
}
function clearAllErrors() {
clearFieldError("account");
clearFieldError("password");
clearFieldError("password_confirm");
}
function isValidLength(value) {
return value.length >= 4 && value.length <= 16;
}
function validateForm() {
var account = (accountInput && accountInput.value.trim()) || "";
var password = (passwordInput && passwordInput.value) || "";
var confirm = (confirmInput && confirmInput.value) || "";
var valid = true;
clearAllErrors();
if (!account) {
setFieldError("account", "请输入账号");
valid = false;
} else if (!isValidLength(account)) {
setFieldError("account", "账号需为 4–16 个字符");
valid = false;
}
if (!password) {
setFieldError("password", "请输入密码");
valid = false;
} else if (!isValidLength(password)) {
setFieldError("password", "密码需为 4–16 个字符");
valid = false;
}
if (!confirm) {
setFieldError("password_confirm", "请再次输入密码");
valid = false;
} else if (confirm !== password) {
setFieldError("password_confirm", "两次输入的密码不一致");
valid = false;
}
if (!valid) return null;
return { accountNo: account, password: password };
}
function mapServerError(err) {
var tip = (err && err.message) || "注册失败,请稍后重试";
var code = err && err.code;
if (code === 5005 || /已存在|重复|占用/.test(tip)) {
setFieldError("account", tip);
return;
}
if (/密码|password/i.test(tip)) {
setFieldError("password", tip);
return;
}
if (window.AuthAPI) AuthAPI.toast(tip, "error");
else if (typeof showToast === "function") showToast(tip, "error");
}
function openDialog(event) {
if (event) event.preventDefault();
if (typeof window.closeLoginDialog === "function") {
window.closeLoginDialog();
}
clearAllErrors();
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
return true;
}
function closeDialog() {
mask.classList.remove("is-open");
clearAllErrors();
if (!document.getElementById("loginDialog") || !document.getElementById("loginDialog").classList.contains("is-open")) {
document.body.style.overflow = "";
}
}
if (form) {
form.addEventListener("submit", function (event) {
event.preventDefault();
if (submitBtn && submitBtn.classList.contains("is-loading")) return;
var payload = validateForm();
if (!payload) return;
if (!window.AuthAPI || !window.HttpRequest) {
return;
}
setSubmitting(true);
AuthAPI.register(payload)
.then(function () {
AuthAPI.toast("注册成功", "success");
closeDialog();
setTimeout(function () {
window.location.reload();
}, 400);
})
.catch(function (err) {
setSubmitting(false);
mapServerError(err);
});
});
}
function consumeAuthQuery(kind) {
var params = new URLSearchParams(window.location.search);
if (params.get("auth") !== kind) return false;
params.delete("auth");
var qs = params.toString();
var next = window.location.pathname + (qs ? "?" + qs : "") + window.location.hash;
window.history.replaceState(null, "", next);
return true;
}
if (accountInput) {
accountInput.addEventListener("input", function () {
clearFieldError("account");
});
}
if (passwordInput) {
passwordInput.addEventListener("input", function () {
clearFieldError("password");
});
}
if (confirmInput) {
confirmInput.addEventListener("input", function () {
clearFieldError("password_confirm");
});
}
document.addEventListener("click", function (event) {
var openEl = event.target.closest("[data-register-dialog-open]");
if (openEl) {
openDialog(event);
return;
}
var registerLink = event.target.closest('a[href="/register/"], a[href="#register"]');
if (registerLink) {
openDialog(event);
return;
}
if (event.target.closest("[data-register-dialog-close]")) {
closeDialog();
return;
}
if (event.target === mask) {
closeDialog();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
closeDialog();
}
});
window.openRegisterDialog = openDialog;
window.closeRegisterDialog = closeDialog;
if ((document.body && document.body.getAttribute("data-auth-mode") === "register") || consumeAuthQuery("register")) {
openDialog();
}
})();