auth.ts
1.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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