/** * ChangePasswordModal 组件 * * 修改密码模态框组件 * 支持首次登录强制修改密码和普通修改密码 * 使用统一的 Modal 和 Input 组件,遵循三层架构 * * @created 2025-01-XX * @component */ 'use client' import { useState } from 'react' import { useSession } from 'next-auth/react' import { useDialog } from '@/components/ui/DialogProvider' import Modal from '@/components/ui/Modal' import Input from '@/components/ui/Input' import Button from '@/components/ui/Button' import { useThemeStyles, cn } from '@/lib/ui-styles' import { PASSWORD_POLICY_DESCRIPTION, validatePasswordStrength } from '@/lib/password-policy' interface ChangePasswordModalProps { isOpen: boolean onClose: () => void isRequired?: boolean // 是否强制修改(首次登录) onSuccess?: () => void } export default function ChangePasswordModal({ isOpen, onClose, isRequired = false, onSuccess }: ChangePasswordModalProps) { const { alert } = useDialog() const { update } = useSession() const styles = useThemeStyles() const [oldPassword, setOldPassword] = useState('') const [newPassword, setNewPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) const resetForm = () => { setOldPassword('') setNewPassword('') setConfirmPassword('') setError('') } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') if (!newPassword || !confirmPassword) { setError('请填写所有字段') return } const passwordValidation = validatePasswordStrength(newPassword) if (!passwordValidation.valid) { setError(passwordValidation.error || '新密码不符合安全要求') return } if (newPassword !== confirmPassword) { setError('两次输入的密码不一致') return } setLoading(true) try { const payload = isRequired ? { newPassword } : { oldPassword, newPassword } const response = await fetch('/api/user/change-password', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }) const data = await response.json() if (response.ok) { resetForm() try { await update() } catch (error) { console.warn('刷新会话状态失败:', error) } if (onSuccess) { onSuccess() } else { onClose() } // 显示成功消息 alert({ title: '成功', message: '密码修改成功!', variant: 'success', }) } else { setError(data.error || '修改密码失败') } } catch (error) { console.error('修改密码错误:', error) setError('修改密码失败,请稍后重试') } finally { setLoading(false) } } const formContent = (
{!isRequired && (
setOldPassword(e.target.value)} placeholder="请输入旧密码" required={!isRequired} fullWidth />
)}
setNewPassword(e.target.value)} placeholder="请输入新密码" required minLength={10} fullWidth />

{PASSWORD_POLICY_DESCRIPTION}

setConfirmPassword(e.target.value)} placeholder="请再次输入新密码" required minLength={10} fullWidth />
{error && (

{error}

)}
{!isRequired && ( )}
) if (!isOpen) return null if (isRequired) { return (

账号安全

设置新密码

首次登录需要先更换初始密码,完成后才能进入素材库。

当前账号仍在使用系统初始化密码,请设置一个只由您掌握的新密码。

{formContent}
) } return ( {formContent} ) }