Files
web_huangguo2_h5/app/static/js/setting.js
T
谢宇宁andClaude Opus 5.5 0fbdba5ccf Initial commit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 11:47:47 +07:00

144 lines
5.3 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.
(() => {
const form = document.querySelector('[data-setting-form]');
if (!form) return;
const status = form.querySelector('[data-setting-status]');
const save = form.querySelector('[data-setting-save]');
const passwordPop = document.querySelector('[data-setting-password-pop]');
const passwordForm = document.querySelector('[data-setting-password-form]');
const passwordOpen = document.querySelector('[data-setting-password-open]');
const passwordStatus = document.querySelector('[data-setting-password-status]');
const passwordSubmit = document.querySelector('[data-setting-password-submit]');
let previousOverflow = '';
function showStatus(message, success = false) {
status.textContent = message;
status.classList.toggle('is-success', success);
}
form.addEventListener('submit', async event => {
event.preventDefault();
const data = {};
const nickname = form.elements.nickName.value.trim();
const introduction = form.elements.introduction.value.trim();
if (!nickname || [...nickname].length > 40) {
showStatus('昵称须为 1 至 40 个字符');
form.elements.nickName.focus();
return;
}
if ([...introduction].length > 300) {
showStatus('简介不能超过 300 个字符');
return;
}
if (nickname !== form.elements.nickName.defaultValue) data.nickName = nickname;
if (introduction !== form.elements.introduction.defaultValue.trim()) data.introduction = introduction;
if (!Object.keys(data).length) {
showStatus('没有需要保存的修改');
return;
}
save.disabled = true;
showStatus('保存中…');
try {
const response = await fetch('/api/auth/profile', {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data),
});
const result = await response.json();
if (!response.ok || result.code !== 200) throw new Error(result.tip || '保存失败,请稍后重试');
showStatus('保存成功', true);
window.setTimeout(() => window.location.reload(), 800);
} catch (error) {
showStatus(error.message || '保存失败,请稍后重试');
save.disabled = false;
}
});
function setPasswordStatus(message, success = false) {
if (!passwordStatus) return;
passwordStatus.textContent = message || '';
passwordStatus.classList.toggle('is-success', success);
}
function openPasswordPop() {
if (!passwordPop || !passwordForm) return;
passwordForm.reset();
setPasswordStatus('');
previousOverflow = document.body.style.overflow;
document.body.style.overflow = 'hidden';
passwordPop.hidden = false;
const first = passwordForm.elements.oldPassword;
if (first) window.setTimeout(() => first.focus(), 0);
}
function closePasswordPop() {
if (!passwordPop || passwordPop.hidden) return;
passwordPop.hidden = true;
document.body.style.overflow = previousOverflow;
if (passwordForm) passwordForm.reset();
setPasswordStatus('');
if (passwordOpen) passwordOpen.focus();
}
if (passwordOpen) passwordOpen.addEventListener('click', openPasswordPop);
if (passwordPop) {
passwordPop.querySelectorAll('[data-setting-password-close]').forEach(button => {
button.addEventListener('click', closePasswordPop);
});
}
document.addEventListener('keydown', event => {
if (event.key === 'Escape' && passwordPop && !passwordPop.hidden) closePasswordPop();
});
if (passwordForm) {
passwordForm.addEventListener('submit', async event => {
event.preventDefault();
const oldPassword = passwordForm.elements.oldPassword.value;
const newPassword = passwordForm.elements.newPassword.value;
const confirmPassword = passwordForm.elements.confirmPassword.value;
if (oldPassword.length < 4 || oldPassword.length > 16) {
setPasswordStatus('请输入 4–16 位当前密码');
passwordForm.elements.oldPassword.focus();
return;
}
if (newPassword.length < 4 || newPassword.length > 16) {
setPasswordStatus('请输入 4–16 位新密码');
passwordForm.elements.newPassword.focus();
return;
}
if (newPassword !== confirmPassword) {
setPasswordStatus('两次输入的新密码不一致');
passwordForm.elements.confirmPassword.focus();
return;
}
passwordSubmit.disabled = true;
passwordSubmit.textContent = '修改中…';
setPasswordStatus('');
try {
const response = await fetch('/api/auth/profile', {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ oldPassword, newPassword }),
});
const result = await response.json();
if (!response.ok || result.code !== 200) throw new Error(result.tip || '密码修改失败,请稍后重试');
setPasswordStatus('密码修改成功', true);
window.setTimeout(() => {
closePasswordPop();
window.location.reload();
}, 600);
} catch (error) {
setPasswordStatus(error.message || '密码修改失败,请稍后重试');
passwordSubmit.disabled = false;
passwordSubmit.textContent = '确认修改';
}
});
}
})();