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;
}
);