authSlice.ts
1.15 KB
// REQ-USR-004: 全局登录态(token + user)。token 持久化到 localStorage(D6)。
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
import { TOKEN_STORAGE_KEY } from '../../api/request';
import type { AuthUser } from '../../api/types';
export interface AuthState {
token: string | null;
user: AuthUser | null;
}
const initialState: AuthState = {
token: localStorage.getItem(TOKEN_STORAGE_KEY),
user: null,
};
const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
// 写 token + user,并持久化 token(reducer 内副作用为 MVP 取舍,全项目统一,D6)
setCredentials(state, action: PayloadAction<{ token: string; user: AuthUser }>) {
state.token = action.payload.token;
state.user = action.payload.user;
localStorage.setItem(TOKEN_STORAGE_KEY, action.payload.token);
},
// 清登录态并移除持久化 token
clearCredentials(state) {
state.token = null;
state.user = null;
localStorage.removeItem(TOKEN_STORAGE_KEY);
},
},
});
export const { setCredentials, clearCredentials } = authSlice.actions;
export default authSlice.reducer;