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;