From fda052031fd7cb18e2c70c274419b118b6803fb7 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Wed, 25 Apr 2018 08:51:37 -0400 Subject: [PATCH] Data: Avoid tracking itemIds while request in progress --- core-data/queried-data/reducer.js | 6 +++--- core-data/queried-data/selectors.js | 4 ++++ core-data/queried-data/test/reducer.js | 4 ++-- core-data/queried-data/test/selectors.js | 26 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 core-data/queried-data/test/selectors.js diff --git a/core-data/queried-data/reducer.js b/core-data/queried-data/reducer.js index e62b177de7621..25eda4fbb4f88 100644 --- a/core-data/queried-data/reducer.js +++ b/core-data/queried-data/reducer.js @@ -29,7 +29,7 @@ import getQueryParts from './get-query-parts'; * * @return {number[]} Merged array of item IDs. */ -export function getMergedItemIds( itemIds = [], nextItemIds, page, perPage ) { +export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) { const nextItemIdsStartIndex = ( page - 1 ) * perPage; // If later page has already been received, default to the larger known @@ -125,7 +125,7 @@ const queries = flowRight( [ // for default query on initialization. withReturnUndefinedOnUnhandledDefault, ] )( combineReducers( { - itemIds( state = [], action ) { + itemIds( state = null, action ) { const { type, page, perPage } = action; if ( type !== RECEIVE_ITEMS ) { @@ -133,7 +133,7 @@ const queries = flowRight( [ } return getMergedItemIds( - state, + state || [], map( action.items, 'id' ), page, perPage diff --git a/core-data/queried-data/selectors.js b/core-data/queried-data/selectors.js index 3f678330cd788..a18cb2df32a51 100644 --- a/core-data/queried-data/selectors.js +++ b/core-data/queried-data/selectors.js @@ -46,6 +46,10 @@ export function getQueriedItems( state, query ) { } const itemIds = state.queries[ stableKey ].itemIds; + if ( ! itemIds ) { + return null; + } + const startOffset = ( page - 1 ) * perPage; const endOffset = startOffset + perPage; diff --git a/core-data/queried-data/test/reducer.js b/core-data/queried-data/test/reducer.js index 302c363010470..6175c984e7ea2 100644 --- a/core-data/queried-data/test/reducer.js +++ b/core-data/queried-data/test/reducer.js @@ -16,7 +16,7 @@ import reducer, { describe( 'getMergedItemIds', () => { it( 'should receive a page', () => { - const result = getMergedItemIds( undefined, [ 4, 5, 6 ], 2, 3 ); + const result = getMergedItemIds( [], [ 4, 5, 6 ], 2, 3 ); expect( result ).toEqual( [ undefined, @@ -164,7 +164,7 @@ describe( 'reducer', () => { items: {}, queries: { '': { - itemIds: [], + itemIds: null, requestingPageByPerPage: { 10: { 1: true, diff --git a/core-data/queried-data/test/selectors.js b/core-data/queried-data/test/selectors.js new file mode 100644 index 0000000000000..cbad438e7ccef --- /dev/null +++ b/core-data/queried-data/test/selectors.js @@ -0,0 +1,26 @@ +/** + * Internal dependencies + */ +import { getQueriedItems } from '../selectors'; + +describe( 'getQueriedItems', () => { + it( 'should return null if requesting but no item IDs', () => { + const state = { + items: {}, + queries: { + '': { + itemIds: null, + requestingPageByPerPage: { + 10: { + 1: true, + }, + }, + }, + }, + }; + + const result = getQueriedItems( state ); + + expect( result ).toBe( null ); + } ); +} );