authSlice.ts
1.4 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
44
45
46
47
48
49
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import type { UserInfo } from '../../api/auth';
export type AuthStatus = 'idle' | 'submitting' | 'success' | 'failed';
export interface AuthState {
accessToken: string | null;
userInfo: UserInfo | null;
status: AuthStatus;
}
const initialState: AuthState = {
accessToken: null,
userInfo: null,
status: 'idle',
};
const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
setSession(
state,
action: PayloadAction<{ accessToken: string; userInfo: UserInfo }>,
) {
state.accessToken = action.payload.accessToken;
state.userInfo = action.payload.userInfo;
state.status = 'success';
},
clearSession(state) {
state.accessToken = null;
state.userInfo = null;
state.status = 'idle';
},
setStatus(state, action: PayloadAction<AuthStatus>) {
state.status = action.payload;
},
},
});
export const { setSession, clearSession, setStatus } = authSlice.actions;
export default authSlice.reducer;
// selectors
export const selectAccessToken = (state: { auth: AuthState }) => state.auth.accessToken;
export const selectUserInfo = (state: { auth: AuthState }) => state.auth.userInfo;
export const selectIsAuthenticated = (state: { auth: AuthState }) =>
state.auth.accessToken != null;
export const selectAuthStatus = (state: { auth: AuthState }) => state.auth.status;