From 92270b7b8f7481524a9c117498d446cf6783340d Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Fri, 7 May 2021 18:21:36 +0200 Subject: [PATCH] Fix useQueryWithStore outputs incorrect loaded field when enabled is false Closes #6240 --- .../dataProvider/useQueryWithStore.spec.tsx | 49 +++++++++++++++++-- .../src/dataProvider/useQueryWithStore.ts | 7 +-- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/packages/ra-core/src/dataProvider/useQueryWithStore.spec.tsx b/packages/ra-core/src/dataProvider/useQueryWithStore.spec.tsx index 17ec38d0b72..1810f267890 100644 --- a/packages/ra-core/src/dataProvider/useQueryWithStore.spec.tsx +++ b/packages/ra-core/src/dataProvider/useQueryWithStore.spec.tsx @@ -55,6 +55,12 @@ describe('useQueryWithStore', () => { expect(callArgs.error).toBeNull(); expect(callArgs.total).toBeNull(); + await new Promise(resolve => setImmediate(resolve)); // wait for useEffect + callArgs = callback.mock.calls[1][0]; + expect(callArgs.loading).toEqual(false); + expect(callArgs.loaded).toEqual(false); + + callback.mockClear(); rerender( { , { admin: { resources: { posts: { data: {} } } } } ); - await new Promise(resolve => setImmediate(resolve)); // dataProvider Promise returns result on next tick - callArgs = callback.mock.calls[2][0]; + callArgs = callback.mock.calls[0][0]; + expect(callArgs.data).toBeUndefined(); + expect(callArgs.loading).toEqual(false); + expect(callArgs.loaded).toEqual(false); + expect(callArgs.error).toBeNull(); + expect(callArgs.total).toBeNull(); + + callback.mockClear(); + await new Promise(resolve => setImmediate(resolve)); // wait for useEffect + callArgs = callback.mock.calls[0][0]; expect(callArgs.data).toBeUndefined(); expect(callArgs.loading).toEqual(true); expect(callArgs.loaded).toEqual(false); expect(callArgs.error).toBeNull(); expect(callArgs.total).toBeNull(); - await new Promise(resolve => setImmediate(resolve)); // dataProvider Promise returns result on next tick - callArgs = callback.mock.calls[4][0]; + callArgs = callback.mock.calls[1][0]; + expect(callArgs.data).toEqual({ + id: 1, + title: 'titleFromDataProvider', + }); + expect(callArgs.loading).toEqual(false); + expect(callArgs.loaded).toEqual(true); + expect(callArgs.error).toBeNull(); + expect(callArgs.total).toBeNull(); + + callback.mockClear(); + rerender( + + + , + { admin: { resources: { posts: { data: {} } } } } + ); + callArgs = callback.mock.calls[0][0]; expect(callArgs.data).toEqual({ id: 1, title: 'titleFromDataProvider', @@ -82,6 +115,14 @@ describe('useQueryWithStore', () => { expect(callArgs.loaded).toEqual(true); expect(callArgs.error).toBeNull(); expect(callArgs.total).toBeNull(); + + callback.mockClear(); + await new Promise(resolve => setImmediate(resolve)); // wait for useEffect + callArgs = callback.mock.calls[0][0]; + expect(callArgs.loading).toEqual(false); + expect(callArgs.loaded).toEqual(false); + expect(callArgs.error).toBeNull(); + expect(callArgs.total).toBeNull(); }); it('should return data from dataProvider', async () => { diff --git a/packages/ra-core/src/dataProvider/useQueryWithStore.ts b/packages/ra-core/src/dataProvider/useQueryWithStore.ts index 0d5c7930be0..b9fcb4cc182 100644 --- a/packages/ra-core/src/dataProvider/useQueryWithStore.ts +++ b/packages/ra-core/src/dataProvider/useQueryWithStore.ts @@ -145,7 +145,7 @@ export const useQueryWithStore = ( total, error: null, loading: options?.enabled === false ? false : true, - loaded: isDataLoaded(data), + loaded: options?.enabled === false ? false : isDataLoaded(data), refetch, }); @@ -158,7 +158,7 @@ export const useQueryWithStore = ( total, error: null, loading: options?.enabled === false ? false : true, - loaded: isDataLoaded(data), + loaded: options?.enabled === false ? false : isDataLoaded(data), refetch, }); } else if (!isEqual(state.data, data) || state.total !== total) { @@ -217,7 +217,8 @@ export const useQueryWithStore = ( resolve({ error: null, loading: false, - loaded: true, + loaded: + options?.enabled === false ? false : true, }); }) .catch(error => {