| // src/store/userSlice.ts |
| import { createSlice, createAsyncThunk, type PayloadAction } from '@reduxjs/toolkit'; |
| import type { UserDetailInfo, UserInfo } from '../../api/User/type'; |
| import UserAPi from '../../api/User/UserApi'; |
| |
| // 定义用户信息的类型 |
| interface UserState { |
| username: string; |
| userid: string; |
| email: string; |
| status: 'idle' | 'loading' | 'succeeded' | 'failed'; |
| error: string | null; |
| } |
| |
| // 定义初始状态 |
| const initialState: UserState = { |
| username: '', |
| userid: '', |
| email: '', |
| status: 'idle', |
| error: null, |
| }; |
| |
| |
| // 创建异步 action,用于获取用户信息 |
| export const getUserInfo = createAsyncThunk< |
| UserInfo, |
| void, |
| {rejectValue:string} |
| >( |
| 'user/getUserInfo', |
| async (_, { rejectWithValue }) => { |
| const response = await UserAPi.getMe(); |
| if (response.data.code == 0) { |
| return response.data.data; |
| } else { |
| return rejectWithValue(response.data.message); |
| } |
| } |
| ); |
| |
| export const getUserDetail = createAsyncThunk< |
| UserDetailInfo, |
| string, |
| {rejectValue:string} |
| >( |
| 'user/getUserDetail', |
| async (id, { rejectWithValue }) => { |
| if(!id) return rejectWithValue("未获取到用户信息"); |
| const response = await UserAPi.getMeDetail(id); |
| if (response.data.code == 0) { |
| return response.data.data; |
| } else { |
| return rejectWithValue(response.data.message); |
| } |
| } |
| ); |
| |
| // 创建 userSlice |
| const userSlice = createSlice({ |
| name: 'user', |
| initialState, |
| reducers: { |
| // 可以在这里处理同步操作,如修改用户名等 |
| setUser: (state, action: PayloadAction<string>) => { |
| state.username = action.payload; |
| }, |
| }, |
| extraReducers: (builder) => { |
| builder |
| .addCase(getUserInfo.pending, (state) => { |
| state.status = 'loading'; |
| }) |
| .addCase(getUserInfo.fulfilled, (state, action: PayloadAction<UserInfo>) => { |
| state.status = 'succeeded'; |
| state.username = action.payload.username; |
| state.userid = action.payload.userid; |
| }) |
| .addCase(getUserInfo.rejected, (state, action) => { |
| state.status = 'failed'; |
| state.error = action.error.message ?? 'Unknown error'; |
| }) |
| // getUserDetailFromState |
| .addCase(getUserDetail.pending, (state) => { |
| state.status = 'loading'; |
| state.error = null; |
| }) |
| .addCase(getUserDetail.fulfilled, (state, action: PayloadAction<UserDetailInfo>) => { |
| state.status = 'succeeded'; |
| state.username = action.payload.username; |
| state.email = action.payload.email || ''; |
| }) |
| .addCase(getUserDetail.rejected, (state, action) => { |
| state.status = 'failed'; |
| state.error = action.payload || action.error.message || 'Unknown error'; |
| }) |
| }, |
| }); |
| |
| // 导出 actions 和 reducer |
| export const { setUser } = userSlice.actions; |
| export default userSlice.reducer; |