burger-online

Форк
0
108 строк · 3.3 Кб
1
import {PayloadAction, SerializedError, createSlice} from '@reduxjs/toolkit'
2
import {RootState} from '../store'
3
import {
4
  fetchCheckUser,
5
  fetchEditUser,
6
  fetchForgotPassword,
7
  fetchLogin,
8
  fetchLogout,
9
  fetchRegister,
10
  fetchResetPassword,
11
} from './actions'
12
import {TUserState} from './types'
13

14
const initialState: TUserState = {
15
  user: null,
16
  errorStatus: {
17
    name: '',
18
    message: '',
19
    stack: '',
20
    code: '',
21
  },
22
  isAuthChecked: false,
23
  resetPasswordStatus: false,
24
  logoutStatus: false,
25
}
26

27
const userSlice = createSlice({
28
  name: 'user',
29
  initialState,
30
  reducers: {
31
    catchError: (state, action: PayloadAction<SerializedError | null>) => {
32
      if (action.payload) {
33
        state.errorStatus = action.payload
34
      }
35
    },
36
  },
37
  extraReducers: builder => {
38
    builder
39
      .addCase(fetchCheckUser.fulfilled, (state, {payload}) => {
40
        if (localStorage.getItem('access-token')) {
41
          state.user = payload.user
42
        }
43
        state.isAuthChecked = true
44
      })
45
      .addCase(fetchCheckUser.rejected, (state, action) => {
46
        state.errorStatus = action.error
47
        state.isAuthChecked = true
48
        state.user = null
49
        localStorage.removeItem('access-token')
50
        localStorage.removeItem('refresh-token')
51
      })
52
      .addCase(fetchRegister.fulfilled, (state, {payload}) => {
53
        if (payload.accessToken && payload.refreshToken) {
54
          localStorage.setItem('access-token', payload.accessToken)
55
          localStorage.setItem('refresh-token', payload.refreshToken)
56
        }
57
        state.user = payload.user
58
        state.isAuthChecked = true
59
      })
60
      .addCase(fetchRegister.rejected, (state, action) => {
61
        state.errorStatus = action.error
62
      })
63
      .addCase(fetchLogin.fulfilled, (state, {payload}) => {
64
        if (payload.accessToken && payload.refreshToken) {
65
          localStorage.setItem('access-token', payload.accessToken)
66
          localStorage.setItem('refresh-token', payload.refreshToken)
67
        }
68
        state.user = payload.user
69
        state.isAuthChecked = true
70
      })
71
      .addCase(fetchLogin.rejected, (state, action) => {
72
        state.errorStatus = action.error
73
      })
74
      .addCase(fetchEditUser.fulfilled, (state, {payload}) => {
75
        state.user = payload.user
76
      })
77
      .addCase(fetchEditUser.rejected, (state, action) => {
78
        state.errorStatus = action.error
79
      })
80
      .addCase(fetchForgotPassword.fulfilled, (state, {payload}) => {
81
        state.resetPasswordStatus = payload.success
82
      })
83
      .addCase(fetchForgotPassword.rejected, (state, action) => {
84
        state.errorStatus = action.error
85
        state.resetPasswordStatus = false
86
      })
87
      .addCase(fetchResetPassword.fulfilled, (state, {payload}) => {})
88
      .addCase(fetchResetPassword.rejected, (state, action) => {
89
        state.errorStatus = action.error
90
      })
91
      .addCase(fetchLogout.fulfilled, (state, {payload}) => {
92
        if (payload.success) {
93
          state.user = null
94
          state.logoutStatus = payload.success
95
          localStorage.removeItem('access-token')
96
          localStorage.removeItem('refresh-token')
97
        }
98
      })
99
      .addCase(fetchLogout.rejected, (state, action) => {
100
        state.errorStatus = action.error
101
      })
102
  },
103
})
104

105
export const userStore = (store: RootState) => store.user
106

107
export const {catchError} = userSlice.actions
108
export default userSlice.reducer
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.