Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
214 lines
6.9 KiB
JavaScript
214 lines
6.9 KiB
JavaScript
(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();
|
||
}
|
||
})();
|