/** * filekorolheader: 认证状态管理 - 登录注册页面状态管理核心 * 功能:状态管理、表单验证、倒计时管理、错误处理 * 路径:/login/components/authReducer.tsx * 规范:遵循crop-x/docs/开发项目规范.md,使用useReducer状态管理,shadcn语义化样式 */ 'use client'; import { Enterprise } from '@/types/auth'; // 状态接口定义 export interface AuthState { loading: boolean; showPassword: boolean; showConfirmPassword: boolean; sendingCode: boolean; countdown: number; error: string; success: string; enterprises: Enterprise[]; passwordForm: { username: string; password: string; captcha: string; }; phoneForm: { phone: string; code: string; captcha: string; }; registerForm: { username: string; password: string; confirmPassword: string; phone: string; code: string; realName: string; email: string; enterpriseId: string; captcha: string; }; validation: { username: string; password: string; confirmPassword: string; phone: string; realName: string; }; } // Action类型定义 export type AuthAction = | { type: 'SET_LOADING'; payload: boolean } | { type: 'TOGGLE_PASSWORD_VISIBILITY' } | { type: 'TOGGLE_CONFIRM_PASSWORD_VISIBILITY' } | { type: 'SET_SENDING_CODE'; payload: boolean } | { type: 'SET_COUNTDOWN'; payload: number } | { type: 'SET_ERROR'; payload: string } | { type: 'SET_SUCCESS'; payload: string } | { type: 'SET_ENTERPRISES'; payload: Enterprise[] } | { type: 'UPDATE_PASSWORD_FORM'; payload: Partial } | { type: 'UPDATE_PHONE_FORM'; payload: Partial } | { type: 'UPDATE_REGISTER_FORM'; payload: Partial } | { type: 'UPDATE_VALIDATION'; payload: Partial } | { type: 'CLEAR_VALIDATION' } | { type: 'RESET_FORMS' }; // Reducer函数 export function authReducer(state: AuthState, action: AuthAction): AuthState { switch (action.type) { case 'SET_LOADING': return { ...state, loading: action.payload }; case 'TOGGLE_PASSWORD_VISIBILITY': return { ...state, showPassword: !state.showPassword }; case 'TOGGLE_CONFIRM_PASSWORD_VISIBILITY': return { ...state, showConfirmPassword: !state.showConfirmPassword }; case 'SET_SENDING_CODE': return { ...state, sendingCode: action.payload }; case 'SET_COUNTDOWN': return { ...state, countdown: action.payload }; case 'SET_ERROR': return { ...state, error: action.payload, success: '' }; case 'SET_SUCCESS': return { ...state, success: action.payload, error: '' }; case 'SET_ENTERPRISES': return { ...state, enterprises: action.payload }; case 'UPDATE_PASSWORD_FORM': return { ...state, passwordForm: { ...state.passwordForm, ...action.payload } }; case 'UPDATE_PHONE_FORM': return { ...state, phoneForm: { ...state.phoneForm, ...action.payload } }; case 'UPDATE_REGISTER_FORM': return { ...state, registerForm: { ...state.registerForm, ...action.payload } }; case 'UPDATE_VALIDATION': return { ...state, validation: { ...state.validation, ...action.payload } }; case 'CLEAR_VALIDATION': return { ...state, validation: { username: '', password: '', confirmPassword: '', phone: '', realName: '' } }; case 'RESET_FORMS': return { ...state, passwordForm: { username: '', password: '', captcha: '' }, phoneForm: { phone: '', code: '', captcha: '' }, registerForm: { username: '', password: '', confirmPassword: '', phone: '', code: '', realName: '', email: '', enterpriseId: '', captcha: '', }, validation: { username: '', password: '', confirmPassword: '', phone: '', realName: '' }, error: '', success: '', }; default: return state; } } // 初始状态 export const initialAuthState: AuthState = { loading: false, showPassword: false, showConfirmPassword: false, sendingCode: false, countdown: 0, error: '', success: '', enterprises: [], passwordForm: { username: '', password: '', captcha: '', }, phoneForm: { phone: '', code: '', captcha: '', }, registerForm: { username: '', password: '', confirmPassword: '', phone: '', code: '', realName: '', email: '', enterpriseId: '', captcha: '', }, validation: { username: '', password: '', confirmPassword: '', phone: '', realName: '', }, };