diff --git a/packages/react-data-provider/src/ClientProvider.tsx b/packages/react-data-provider/src/ClientProvider.tsx index 281e6a81..79a0f790 100644 --- a/packages/react-data-provider/src/ClientProvider.tsx +++ b/packages/react-data-provider/src/ClientProvider.tsx @@ -1,35 +1,32 @@ import React, { createContext, - ReactNode, useEffect, useState, useContext, + PropsWithChildren, } from 'react'; import { HttpError } from './interfaces'; export type ClientContextType = { baseUrl: string; onRefreshTokenError: (error?: HttpError) => void; + onForbiddenAccessError: (error?: HttpError) => void; }; export const ClientContext = createContext({ baseUrl: '', onRefreshTokenError: () => ({}), + onForbiddenAccessError: () => ({}), }); export const useClient = () => useContext(ClientContext); -type Props = { - baseUrl?: string; - onRefreshTokenError?: (error?: HttpError) => void; - children: ReactNode; -}; - const ClientProvider = ({ baseUrl: outerBaseUrl, onRefreshTokenError, + onForbiddenAccessError, children, -}: Props) => { +}: PropsWithChildren>) => { const [baseUrl, setBaseUrl] = useState(outerBaseUrl || ''); useEffect(() => { @@ -39,7 +36,9 @@ const ClientProvider = ({ }, [outerBaseUrl]); return ( - + {children} ); diff --git a/packages/react-data-provider/src/useDataProvider.ts b/packages/react-data-provider/src/useDataProvider.ts index 214bee68..18eafb92 100644 --- a/packages/react-data-provider/src/useDataProvider.ts +++ b/packages/react-data-provider/src/useDataProvider.ts @@ -20,7 +20,7 @@ import { useClient } from './ClientProvider'; const maxAge = 10000; const useDataProvider = () => { - const { baseUrl, onRefreshTokenError } = useClient(); + const { baseUrl, onRefreshTokenError, onForbiddenAccessError } = useClient(); //TODO //let user inject any http instance that match the HttpClient interface requirements @@ -107,6 +107,9 @@ const useDataProvider = () => { const handleServerError = (err: HttpError) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { code, response, message } = err; + if (response.status === 403) { + onForbiddenAccessError?.(err); + } throw err; }; diff --git a/packages/react-material-ui/src/components/RocketsProvider/index.tsx b/packages/react-material-ui/src/components/RocketsProvider/index.tsx index 28f4a274..082b452e 100644 --- a/packages/react-material-ui/src/components/RocketsProvider/index.tsx +++ b/packages/react-material-ui/src/components/RocketsProvider/index.tsx @@ -48,6 +48,7 @@ export type RocketsProps = { * onAuthError: handleError, * onLogout: handleLogout, * handleRefreshTokenError: handleTokenError, + * handleForbiddenAccessError: handleForbiddenError, * }} * dataProvider={{ apiUrl: 'https://api.example.com' }} * layout={{ AppBar: MyAppBar, Layout: MyLayout, menuOptions: myMenuOptions }} @@ -66,6 +67,7 @@ const RocketsProvider = ({ void; + /** + * Function to handle forbidden access errors. + */ + handleForbiddenAccessError: (error: unknown) => void; }; export type RocketsDataProviderProps = { diff --git a/packages/react-navigation/src/components/AuthRoute.tsx b/packages/react-navigation/src/components/AuthRoute.tsx index d77d3b71..7282476e 100644 --- a/packages/react-navigation/src/components/AuthRoute.tsx +++ b/packages/react-navigation/src/components/AuthRoute.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Navigate } from 'react-router'; -import { useAuth } from '@concepta/react-auth-provider'; import { AuthModule, AuthModuleProps } from '@concepta/react-material-ui/'; import { toast } from 'react-toastify'; @@ -15,11 +14,8 @@ type AuthRouteProps = { const AuthRoute = (props: AuthRouteProps) => { const { home, moduleProps, route } = props; - const { accessToken: authAccessToken } = useAuth(); - const accessToken = authAccessToken ?? localStorage.getItem('accessToken'); - - if (accessToken) { + if (localStorage.getItem('accessToken')) { return ; }