blob: 64daa4e36c1b1d1463740f4a72ec25f84ef83a35 [file] [log] [blame]
// 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;