auth.ts 1.15 KB
import { createSlice, type PayloadAction } from '@reduxjs/toolkit'
import { TOKEN_KEY } from '@/api/request'
import type { UserInfo } from '@/api/types'

const USER_KEY = 'erp.user'

function loadUser(): UserInfo | null {
  const raw = sessionStorage.getItem(USER_KEY)
  if (!raw) return null
  try { return JSON.parse(raw) as UserInfo } catch { return null }
}

interface AuthState {
  token: string | null
  user: UserInfo | null
}

const initialState: AuthState = {
  token: sessionStorage.getItem(TOKEN_KEY),
  user: loadUser(),
}

const slice = createSlice({
  name: 'auth',
  initialState,
  reducers: {
    loginSucceeded(state, action: PayloadAction<{ token: string; user: UserInfo }>) {
      state.token = action.payload.token
      state.user = action.payload.user
      sessionStorage.setItem(TOKEN_KEY, action.payload.token)
      sessionStorage.setItem(USER_KEY, JSON.stringify(action.payload.user))
    },
    loggedOut(state) {
      state.token = null
      state.user = null
      sessionStorage.removeItem(TOKEN_KEY)
      sessionStorage.removeItem(USER_KEY)
    },
  },
})

export const { loginSucceeded, loggedOut } = slice.actions
export default slice.reducer