(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(); } })();