Files
web_huangguo_web/app/static/js/pages/registerDialog.js
T
fish03andClaude Opus 5.5 bef9f8b4ed Initial commit
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 14:43:16 +07:00

214 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(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();
}
})();