Advertisement
Oxios

Untitled

Jul 23rd, 2022
1,367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, {
  2.   useState,
  3.   useMemo,
  4.   createContext,
  5.   useCallback,
  6.   ReactNode,
  7. } from 'react';
  8. import {useCookies} from 'hooks/useCookies';
  9. import {history} from 'routing/router';
  10. import {ROUTES} from 'routing/routes';
  11. import {setAccessTokenToCookie} from 'helpers/setAccessTokenToCookie';
  12. import {
  13.   useSignUpMutation,
  14.   useSignInMutation,
  15.   useResendConfirmRegistrationMutation,
  16.   useRefreshTokenMutation,
  17. } from './api';
  18. import {
  19.   SignUpUserData,
  20.   SignInUserData,
  21.   ResendConfirmRegistrationData,
  22. } from './types';
  23. import {AxiosResponse} from 'axios';
  24. import {ResponseApi} from 'services/api/types';
  25.  
  26. const AuthenticatedState = {
  27.   IDLE: 'IDLE',
  28.   PROCESS: 'PROCESS',
  29.   END: 'END',
  30. } as const;
  31.  
  32. interface AuthContextValue {
  33.   isLoading: boolean;
  34.   isAuthenticated: boolean;
  35.   authenticatedState: keyof typeof AuthenticatedState;
  36.   onLogout: VoidFunction;
  37.   onSignIn: any;
  38.   onResendConfirmRegistration: any;
  39.   onSignUp: any;
  40.   checkAuth: any;
  41. }
  42.  
  43. const AuthContext = createContext<AuthContextValue | undefined>(undefined);
  44.  
  45. export const AuthProvider = ({children}: {children: ReactNode}) => {
  46.   const {getCookie, removeCookie} = useCookies();
  47.  
  48.   const accessToken = getCookie('control_auto_access_token');
  49.  
  50.   const isAuthenticated = useMemo(() => Boolean(accessToken), [accessToken]);
  51.  
  52.   const [authenticatedState, setAuthenticatedState] = useState<
  53.     keyof typeof AuthenticatedState
  54.   >(() => (Boolean(accessToken) ? 'END' : 'IDLE'));
  55.  
  56.   const signUpMutation = useSignUpMutation();
  57.   const signInMutation = useSignInMutation();
  58.   const resendConfirmRegistrationMutation = useResendConfirmRegistrationMutation();
  59.   const refreshTokenMutation = useRefreshTokenMutation();
  60.  
  61.   const handleLogout = useCallback(() => {
  62.     removeCookie('control_auto_access_token');
  63.  
  64.     history.push(ROUTES.root());
  65.   }, [removeCookie]);
  66.  
  67.   const handleSignIn = useCallback(
  68.     async (signInUserData: SignInUserData) => {
  69.       setAuthenticatedState('PROCESS');
  70.  
  71.       return await signInMutation.mutateAsync(signInUserData).finally(() => {
  72.         setAuthenticatedState('END');
  73.       });
  74.     },
  75.     [signInMutation],
  76.   );
  77.  
  78.   const handleResendConfirmRegistration = useCallback(
  79.     async (signUpUserData: ResendConfirmRegistrationData) => {
  80.       return await resendConfirmRegistrationMutation.mutateAsync(
  81.         signUpUserData,
  82.       );
  83.     },
  84.     [resendConfirmRegistrationMutation],
  85.   );
  86.  
  87.   const handleSignUp = useCallback(async (signUpUserData: SignUpUserData) => {
  88.     return await signUpMutation.mutateAsync(signUpUserData);
  89.   }, []);
  90.  
  91.   const handleCheckAuth = useCallback(async () => {
  92.     if (Boolean(accessToken)) {
  93.       return;
  94.     }
  95.  
  96.     setAuthenticatedState('PROCESS');
  97.  
  98.     try {
  99.       const response = await refreshTokenMutation.mutateAsync();
  100.  
  101.       setAccessTokenToCookie(response.data.result.accessToken);
  102.  
  103.       setAuthenticatedState('END');
  104.     } catch (e) {
  105.       setAuthenticatedState('END');
  106.     }
  107.   }, [accessToken, refreshTokenMutation]);
  108.  
  109.   const isLoading =
  110.     signUpMutation.isLoading ||
  111.     signInMutation.isLoading ||
  112.     resendConfirmRegistrationMutation.isLoading ||
  113.     refreshTokenMutation.isLoading;
  114.  
  115.   const value = useMemo(
  116.     () => ({
  117.       isLoading,
  118.       isAuthenticated,
  119.       authenticatedState,
  120.       onLogout: handleLogout,
  121.       onSignIn: handleSignIn,
  122.       onResendConfirmRegistration: handleResendConfirmRegistration,
  123.       onSignUp: handleSignUp,
  124.       checkAuth: handleCheckAuth,
  125.     }),
  126.     [
  127.       authenticatedState,
  128.       handleCheckAuth,
  129.       handleLogout,
  130.       handleResendConfirmRegistration,
  131.       handleSignIn,
  132.       handleSignUp,
  133.       isAuthenticated,
  134.       isLoading,
  135.     ],
  136.   );
  137.  
  138.   return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
  139. };
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement