import React, { useEffect, useState } from 'react'; import { passwordApi, PasswordStrengthLevel } from '../services/passwordApi'; import { Shield, ShieldAlert, ShieldCheck } from 'lucide-react'; interface PasswordStrengthIndicatorProps { password: string; onStrengthChange?: (meetsRequirements: boolean) => void; } const PasswordStrengthIndicator: React.FC = ({ password, onStrengthChange }) => { const [strength, setStrength] = useState('weak'); const [score, setScore] = useState(0); const [suggestions, setSuggestions] = useState([]); const [meetsRequirements, setMeetsRequirements] = useState(false); const [isChecking, setIsChecking] = useState(false); useEffect(() => { const checkStrength = async () => { if (!password) { setStrength('weak'); setScore(0); setSuggestions([]); setMeetsRequirements(false); onStrengthChange?.(false); return; } setIsChecking(true); try { const result = await passwordApi.checkPasswordStrength(password); setStrength(result.strength); setScore(result.score); setSuggestions(result.suggestions); setMeetsRequirements(result.meets_requirements); onStrengthChange?.(result.meets_requirements); } catch (error) { console.error('密码强度检测失败:', error); } finally { setIsChecking(false); } }; // 防抖处理 const timer = setTimeout(checkStrength, 300); return () => clearTimeout(timer); }, [password, onStrengthChange]); if (!password) { return null; } // 强度配置 const strengthConfig = { weak: { label: '弱', color: 'text-red-600', bgColor: 'bg-red-100', borderColor: 'border-red-300', barColor: 'bg-red-500', icon: ShieldAlert, width: '33%' }, medium: { label: '中', color: 'text-yellow-600', bgColor: 'bg-yellow-100', borderColor: 'border-yellow-300', barColor: 'bg-yellow-500', icon: Shield, width: '66%' }, strong: { label: '强', color: 'text-green-600', bgColor: 'bg-green-100', borderColor: 'border-green-300', barColor: 'bg-green-500', icon: ShieldCheck, width: '100%' } }; const config = strengthConfig[strength]; const Icon = config.icon; return (
{/* 强度指示器 */}
{config.label}
{/* 建议提示 */} {suggestions.length > 0 && (
{suggestions.map((suggestion, index) => (
{suggestion}
))}
)} {/* 强度说明 */} {!isChecking && (
{strength === 'weak' && '密码强度较弱,建议添加大写字母、数字和特殊符号'} {strength === 'medium' && '密码强度中等,添加更多字符类型可提高安全性'} {strength === 'strong' && '密码强度很好,符合安全要求'}
)}
); }; export default PasswordStrengthIndicator;