diff --git a/packages/ra-core/src/dataProvider/useDataProvider.spec.tsx b/packages/ra-core/src/dataProvider/useDataProvider.spec.tsx index b5b631df99f..16b5b61c89f 100644 --- a/packages/ra-core/src/dataProvider/useDataProvider.spec.tsx +++ b/packages/ra-core/src/dataProvider/useDataProvider.spec.tsx @@ -173,4 +173,67 @@ describe('useDataProvider', () => { expect(customVerb).toHaveBeenCalledWith({ id: 1 }, ['something']); }); + + it('should return array or object when 401', async () => { + const results = [] as any[]; + const doSomethingWithResult = (arg: any) => results.push(arg); + const UseDataProvider = () => { + const dataProvider = useDataProvider(); + useEffect(() => { + async function callDataProvider() { + doSomethingWithResult( + (await dataProvider.getList('posts', { + filter: { id: 1 }, + })) as any + ); + doSomethingWithResult( + (await dataProvider.getMany('posts', { + filter: { id: 1 }, + })) as any + ); + doSomethingWithResult( + (await dataProvider.getOne('posts', { + filter: { id: 1 }, + })) as any + ); + doSomethingWithResult( + (await dataProvider.getManyReference('posts', { + filter: { id: 1 }, + })) as any + ); + } + callDataProvider(); + }, [dataProvider]); + return
loading
; + }; + const dataProvider = { + getMany: () => Promise.reject({ status: 401 }), + getList: () => Promise.reject({ status: 401 }), + getOne: () => Promise.reject({ status: 401 }), + getManyReference: () => Promise.reject({ status: 401 }), + }; + render( + Promise.reject(true), + checkAuth: () => Promise.reject(true), + logout: () => Promise.resolve(false), + }} + > + + + ); + // waitFor for the dataProvider to return + await act(async () => { + await new Promise(resolve => setTimeout(resolve)); + }); + + expect(results).toEqual([ + { data: [] }, + { data: [] }, + { data: {} }, + { data: [] }, + ]); + }); }); diff --git a/packages/ra-core/src/dataProvider/useDataProvider.ts b/packages/ra-core/src/dataProvider/useDataProvider.ts index bd713cfd997..ce61bb69fb3 100644 --- a/packages/ra-core/src/dataProvider/useDataProvider.ts +++ b/packages/ra-core/src/dataProvider/useDataProvider.ts @@ -71,6 +71,9 @@ import useLogoutIfAccessDenied from '../auth/useLogoutIfAccessDenied'; * ) * } */ + +const arrayReturnTypes = ['getList', 'getMany', 'getManyReference']; + export const useDataProvider = < TDataProvider extends DataProvider = DataProvider >(): TDataProvider => { @@ -109,7 +112,14 @@ export const useDataProvider = < } return logoutIfAccessDenied(error).then( loggedOut => { - if (loggedOut) return { data: {} }; + if (loggedOut) + return { + data: arrayReturnTypes.includes( + type + ) + ? [] + : {}, + }; throw error; } );