Initial commit
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user