blob: c3f7e4436c0c13a3c8bf236a0376a0c235886b0b [file] [log] [blame]
22301014b1477f72025-06-07 22:54:40 +08001// src/store/userSlice.ts
2import { createSlice, createAsyncThunk, type PayloadAction } from '@reduxjs/toolkit';
3import type { UserInfo } from '../../api/User/type';
4import 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
42// 创建 userSlice
43const userSlice = createSlice({
44 name: 'user',
45 initialState,
46 reducers: {
47 // 可以在这里处理同步操作,如修改用户名等
48 setUser: (state, action: PayloadAction<string>) => {
49 state.username = action.payload;
50 },
51 },
52 extraReducers: (builder) => {
53 builder
54 .addCase(getUserInfo.pending, (state) => {
55 state.status = 'loading';
56 })
57 .addCase(getUserInfo.fulfilled, (state, action: PayloadAction<UserInfo>) => {
58 state.status = 'succeeded';
59 state.username = action.payload.username;
60 state.userid = action.payload.userid;
61 })
62 .addCase(getUserInfo.rejected, (state, action) => {
63 state.status = 'failed';
64 state.error = action.error.message ?? 'Unknown error';
65 });
66 },
67});
68
69// 导出 actions 和 reducer
70export const { setUser } = userSlice.actions;
71export default userSlice.reducer;