blob: 64daa4e36c1b1d1463740f4a72ec25f84ef83a35 [file] [log] [blame]
22301014b1477f72025-06-07 22:54:40 +08001// src/store/userSlice.ts
2import { createSlice, createAsyncThunk, type PayloadAction } from '@reduxjs/toolkit';
22301014356527a2025-06-09 17:46:56 +08003import type { UserDetailInfo, UserInfo } from '../../api/User/type';
22301014b1477f72025-06-07 22:54:40 +08004import UserAPi from '../../api/User/UserApi';
5
6// 定义用户信息的类型
7interface UserState {
8 username: string;
9 userid: string;
10 email: string;
11 status: 'idle' | 'loading' | 'succeeded' | 'failed';
12 error: string | null;
13}
14
15// 定义初始状态
16const initialState: UserState = {
17 username: '',
18 userid: '',
19 email: '',
20 status: 'idle',
21 error: null,
22};
23
24
25// 创建异步 action,用于获取用户信息
26export const getUserInfo = createAsyncThunk<
27 UserInfo,
28 void,
29 {rejectValue:string}
30>(
31 'user/getUserInfo',
32 async (_, { rejectWithValue }) => {
33 const response = await UserAPi.getMe();
34 if (response.data.code == 0) {
22301014b1477f72025-06-07 22:54:40 +080035 return response.data.data;
36 } else {
22301014b1477f72025-06-07 22:54:40 +080037 return rejectWithValue(response.data.message);
38 }
39 }
40);
41
22301014356527a2025-06-09 17:46:56 +080042export const getUserDetail = createAsyncThunk<
43 UserDetailInfo,
44 string,
45 {rejectValue:string}
46>(
47 'user/getUserDetail',
48 async (id, { rejectWithValue }) => {
49 if(!id) return rejectWithValue("未获取到用户信息");
50 const response = await UserAPi.getMeDetail(id);
51 if (response.data.code == 0) {
52 return response.data.data;
53 } else {
54 return rejectWithValue(response.data.message);
55 }
56 }
57);
58
22301014b1477f72025-06-07 22:54:40 +080059// 创建 userSlice
60const userSlice = createSlice({
61 name: 'user',
62 initialState,
63 reducers: {
64 // 可以在这里处理同步操作,如修改用户名等
65 setUser: (state, action: PayloadAction<string>) => {
66 state.username = action.payload;
67 },
68 },
69 extraReducers: (builder) => {
70 builder
71 .addCase(getUserInfo.pending, (state) => {
72 state.status = 'loading';
73 })
74 .addCase(getUserInfo.fulfilled, (state, action: PayloadAction<UserInfo>) => {
75 state.status = 'succeeded';
76 state.username = action.payload.username;
77 state.userid = action.payload.userid;
78 })
79 .addCase(getUserInfo.rejected, (state, action) => {
80 state.status = 'failed';
81 state.error = action.error.message ?? 'Unknown error';
22301014356527a2025-06-09 17:46:56 +080082 })
83 // getUserDetailFromState
84 .addCase(getUserDetail.pending, (state) => {
85 state.status = 'loading';
86 state.error = null;
87 })
88 .addCase(getUserDetail.fulfilled, (state, action: PayloadAction<UserDetailInfo>) => {
89 state.status = 'succeeded';
90 state.username = action.payload.username;
91 state.email = action.payload.email || '';
92 })
93 .addCase(getUserDetail.rejected, (state, action) => {
94 state.status = 'failed';
95 state.error = action.payload || action.error.message || 'Unknown error';
96 })
22301014b1477f72025-06-07 22:54:40 +080097 },
98});
99
100// 导出 actions 和 reducer
101export const { setUser } = userSlice.actions;
102export default userSlice.reducer;