Files
smart-crop-ui/crop-x/src/app/(auth)/login/components/authReducer.tsx

161 lines
4.6 KiB
TypeScript
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.

/**
* 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<AuthState['passwordForm']> }
| { type: 'UPDATE_PHONE_FORM'; payload: Partial<AuthState['phoneForm']> }
| { type: 'UPDATE_REGISTER_FORM'; payload: Partial<AuthState['registerForm']> }
| { type: 'UPDATE_VALIDATION'; payload: Partial<AuthState['validation']> }
| { 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: '',
},
};