burger-online
108 строк · 3.3 Кб
1import {PayloadAction, SerializedError, createSlice} from '@reduxjs/toolkit'
2import {RootState} from '../store'
3import {
4fetchCheckUser,
5fetchEditUser,
6fetchForgotPassword,
7fetchLogin,
8fetchLogout,
9fetchRegister,
10fetchResetPassword,
11} from './actions'
12import {TUserState} from './types'
13
14const initialState: TUserState = {
15user: null,
16errorStatus: {
17name: '',
18message: '',
19stack: '',
20code: '',
21},
22isAuthChecked: false,
23resetPasswordStatus: false,
24logoutStatus: false,
25}
26
27const userSlice = createSlice({
28name: 'user',
29initialState,
30reducers: {
31catchError: (state, action: PayloadAction<SerializedError | null>) => {
32if (action.payload) {
33state.errorStatus = action.payload
34}
35},
36},
37extraReducers: builder => {
38builder
39.addCase(fetchCheckUser.fulfilled, (state, {payload}) => {
40if (localStorage.getItem('access-token')) {
41state.user = payload.user
42}
43state.isAuthChecked = true
44})
45.addCase(fetchCheckUser.rejected, (state, action) => {
46state.errorStatus = action.error
47state.isAuthChecked = true
48state.user = null
49localStorage.removeItem('access-token')
50localStorage.removeItem('refresh-token')
51})
52.addCase(fetchRegister.fulfilled, (state, {payload}) => {
53if (payload.accessToken && payload.refreshToken) {
54localStorage.setItem('access-token', payload.accessToken)
55localStorage.setItem('refresh-token', payload.refreshToken)
56}
57state.user = payload.user
58state.isAuthChecked = true
59})
60.addCase(fetchRegister.rejected, (state, action) => {
61state.errorStatus = action.error
62})
63.addCase(fetchLogin.fulfilled, (state, {payload}) => {
64if (payload.accessToken && payload.refreshToken) {
65localStorage.setItem('access-token', payload.accessToken)
66localStorage.setItem('refresh-token', payload.refreshToken)
67}
68state.user = payload.user
69state.isAuthChecked = true
70})
71.addCase(fetchLogin.rejected, (state, action) => {
72state.errorStatus = action.error
73})
74.addCase(fetchEditUser.fulfilled, (state, {payload}) => {
75state.user = payload.user
76})
77.addCase(fetchEditUser.rejected, (state, action) => {
78state.errorStatus = action.error
79})
80.addCase(fetchForgotPassword.fulfilled, (state, {payload}) => {
81state.resetPasswordStatus = payload.success
82})
83.addCase(fetchForgotPassword.rejected, (state, action) => {
84state.errorStatus = action.error
85state.resetPasswordStatus = false
86})
87.addCase(fetchResetPassword.fulfilled, (state, {payload}) => {})
88.addCase(fetchResetPassword.rejected, (state, action) => {
89state.errorStatus = action.error
90})
91.addCase(fetchLogout.fulfilled, (state, {payload}) => {
92if (payload.success) {
93state.user = null
94state.logoutStatus = payload.success
95localStorage.removeItem('access-token')
96localStorage.removeItem('refresh-token')
97}
98})
99.addCase(fetchLogout.rejected, (state, action) => {
100state.errorStatus = action.error
101})
102},
103})
104
105export const userStore = (store: RootState) => store.user
106
107export const {catchError} = userSlice.actions
108export default userSlice.reducer
109