Skip to content

Commit

Permalink
th-425: * fix incorrect validation behaviour in auth-related componen…
Browse files Browse the repository at this point in the history
…ts (BinaryStudioAcademy#439)

Co-authored-by: Alina Kupchyk <[email protected]>
  • Loading branch information
Some14u and kalinkaaaa14 committed Sep 30, 2023
1 parent 2415710 commit e2faaf1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { DataStatus } from '~/libs/enums/enums.js';
import { LocalStorage, StorageKey } from '~/libs/packages/storage/storage.js';
import { actions as authActions } from '~/slices/auth/auth.js';
import { selectIsLoading } from '~/slices/auth/selectors.js';
import { selectGetCurrentRequestStatus } from '~/slices/auth/selectors.js';

import {
useAppDispatch,
Expand All @@ -17,13 +17,13 @@ type GetCurrentUser = {

const useGetCurrentUser = (): GetCurrentUser => {
const dispatch = useAppDispatch();
const authDataStatus = useAppSelector(selectIsLoading);
const getCurrentRequestStatus = useAppSelector(selectGetCurrentRequestStatus);

const requestCurrentUser = useCallback(async (): Promise<void> => {
const token = await LocalStorage.get<string>(StorageKey.TOKEN);

if (!token) {
void dispatch(authActions.setDataStatus(DataStatus.FULFILLED));
void dispatch(authActions.resolveGetCurrentRequestStatus());

return;
}
Expand All @@ -32,9 +32,9 @@ const useGetCurrentUser = (): GetCurrentUser => {

const isRequestFinished = useMemo(
() =>
authDataStatus !== DataStatus.IDLE &&
authDataStatus !== DataStatus.PENDING,
[authDataStatus],
getCurrentRequestStatus !== DataStatus.IDLE &&
getCurrentRequestStatus !== DataStatus.PENDING,
[getCurrentRequestStatus],
);

return { requestCurrentUser, isRequestFinished };
Expand Down
24 changes: 12 additions & 12 deletions frontend/src/slices/auth/auth.slice.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type PayloadAction, createSlice, isAnyOf } from '@reduxjs/toolkit';
import { createSlice, isAnyOf } from '@reduxjs/toolkit';

import { DataStatus } from '~/libs/enums/enums.js';
import { type HttpError } from '~/libs/packages/http/http.js';
Expand All @@ -23,6 +23,7 @@ import {
type State = {
error: HttpError | null;
dataStatus: ValueOf<typeof DataStatus>;
getCurrentRequestStatus: ValueOf<typeof DataStatus>;
socketDriverAuthStatus: ValueOf<typeof DataStatus>;
socketDriverAuthErrorMessage: SocketErrorValues | null;
user: AuthUser | null;
Expand All @@ -31,6 +32,7 @@ type State = {
const initialState: State = {
error: null,
dataStatus: DataStatus.IDLE,
getCurrentRequestStatus: DataStatus.IDLE,
socketDriverAuthStatus: DataStatus.IDLE,
socketDriverAuthErrorMessage: null,
user: null,
Expand All @@ -43,11 +45,8 @@ const { reducer, actions, name } = createSlice({
clearAuthServerError: (store) => {
store.error = null;
},
setDataStatus: (
store,
action: PayloadAction<ValueOf<typeof DataStatus>>,
) => {
store.dataStatus = action.payload;
resolveGetCurrentRequestStatus: (store) => {
store.getCurrentRequestStatus = DataStatus.FULFILLED;
},
},
extraReducers(builder) {
Expand All @@ -58,9 +57,11 @@ const { reducer, actions, name } = createSlice({
.addCase(getCurrent.fulfilled, (state, action) => {
state.user = action.payload;
state.dataStatus = DataStatus.FULFILLED;
state.getCurrentRequestStatus = DataStatus.FULFILLED;
})
.addCase(getCurrent.rejected, (state) => {
state.dataStatus = DataStatus.REJECTED;
state.getCurrentRequestStatus = DataStatus.REJECTED;
})
.addCase(signIn.fulfilled, (state, action) => {
state.error = null;
Expand Down Expand Up @@ -122,13 +123,12 @@ const { reducer, actions, name } = createSlice({
state.socketDriverAuthStatus = DataStatus.FULFILLED;
state.socketDriverAuthErrorMessage = null;
})
.addCase(getCurrent.pending, (state) => {
state.dataStatus = DataStatus.PENDING;
state.getCurrentRequestStatus = DataStatus.PENDING;
})
.addMatcher(
isAnyOf(
signUp.pending,
signIn.pending,
getCurrent.pending,
logOut.pending,
),
isAnyOf(signUp.pending, signIn.pending, logOut.pending),
(state) => {
state.dataStatus = DataStatus.PENDING;
},
Expand Down
7 changes: 7 additions & 0 deletions frontend/src/slices/auth/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ const selectIsLoading = (state: RootState): ValueOf<typeof DataStatus> => {
return state.auth.dataStatus;
};

const selectGetCurrentRequestStatus = (
state: RootState,
): ValueOf<typeof DataStatus> => {
return state.auth.getCurrentRequestStatus;
};

const selectUser = (
store: RootState,
): RootState[typeof AuthSliceName]['user'] => store[AuthSliceName].user;
Expand All @@ -28,6 +34,7 @@ const selectSocketDriverAuthErrorMessage = (

export {
selectAuthServerError,
selectGetCurrentRequestStatus,
selectIsLoading,
selectSocketDriverAuthErrorMessage,
selectSocketDriverAuthStatus,
Expand Down

0 comments on commit e2faaf1

Please sign in to comment.