From 930843d0658044d5af18de19bfe0cbcd73f55c5c Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Mon, 4 Mar 2024 10:48:55 +0000 Subject: [PATCH] fix: initialize auth in RQ client --- .../web/src/components/ApolloProvider/index.jsx | 6 ++++++ .../src/components/QueryClientProvider/index.jsx | 4 ++-- packages/web/src/contexts/Authentication.jsx | 13 ++++++++++++- packages/web/src/hooks/useAuthentication.js | 6 +----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/web/src/components/ApolloProvider/index.jsx b/packages/web/src/components/ApolloProvider/index.jsx index 09fe2a28..2f74988a 100644 --- a/packages/web/src/components/ApolloProvider/index.jsx +++ b/packages/web/src/components/ApolloProvider/index.jsx @@ -1,11 +1,14 @@ import { ApolloProvider as BaseApolloProvider } from '@apollo/client'; import * as React from 'react'; + import { mutateAndGetClient } from 'graphql/client'; import useAuthentication from 'hooks/useAuthentication'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; + const ApolloProvider = (props) => { const enqueueSnackbar = useEnqueueSnackbar(); const authentication = useAuthentication(); + const onError = React.useCallback( (message) => { enqueueSnackbar(message, { @@ -17,12 +20,15 @@ const ApolloProvider = (props) => { }, [enqueueSnackbar], ); + const client = React.useMemo(() => { return mutateAndGetClient({ onError, token: authentication.token, }); }, [onError, authentication]); + return ; }; + export default ApolloProvider; diff --git a/packages/web/src/components/QueryClientProvider/index.jsx b/packages/web/src/components/QueryClientProvider/index.jsx index 4fc83b8e..1c913236 100644 --- a/packages/web/src/components/QueryClientProvider/index.jsx +++ b/packages/web/src/components/QueryClientProvider/index.jsx @@ -33,11 +33,11 @@ export default function AutomatischQueryClientProvider({ children }) { if (token) { api.defaults.headers.Authorization = token; - - initialize(); } else { delete api.defaults.headers.Authorization; } + + initialize(); }, [initialize, token], ); diff --git a/packages/web/src/contexts/Authentication.jsx b/packages/web/src/contexts/Authentication.jsx index 60e49fa6..92dbb1b2 100644 --- a/packages/web/src/contexts/Authentication.jsx +++ b/packages/web/src/contexts/Authentication.jsx @@ -1,12 +1,18 @@ import * as React from 'react'; import { getItem, setItem } from 'helpers/storage'; + export const AuthenticationContext = React.createContext({ token: null, updateToken: () => void 0, + isAuthenticated: false, + initialize: () => void 0, }); + export const AuthenticationProvider = (props) => { const { children } = props; + const [isInitialized, setInitialized] = React.useState(false); const [token, setToken] = React.useState(() => getItem('token')); + const value = React.useMemo(() => { return { token, @@ -14,8 +20,13 @@ export const AuthenticationProvider = (props) => { setToken(newToken); setItem('token', newToken); }, + isAuthenticated: Boolean(token) && isInitialized, + initialize: () => { + setInitialized(true); + }, }; - }, [token]); + }, [token, isInitialized]); + return ( {children} diff --git a/packages/web/src/hooks/useAuthentication.js b/packages/web/src/hooks/useAuthentication.js index 5cd9bf47..58aad244 100644 --- a/packages/web/src/hooks/useAuthentication.js +++ b/packages/web/src/hooks/useAuthentication.js @@ -4,9 +4,5 @@ import { AuthenticationContext } from 'contexts/Authentication'; export default function useAuthentication() { const authenticationContext = React.useContext(AuthenticationContext); - return { - token: authenticationContext.token, - updateToken: authenticationContext.updateToken, - isAuthenticated: Boolean(authenticationContext.token), - }; + return authenticationContext; }