diff --git a/core-data/queried-data/get-query-parts.js b/core-data/queried-data/get-query-parts.js index b4d8a4ecefa72..a5b3bdebebfb0 100644 --- a/core-data/queried-data/get-query-parts.js +++ b/core-data/queried-data/get-query-parts.js @@ -23,7 +23,7 @@ import { withWeakMapCache } from './utils'; * * @return {WPQueriedDataQueryParts} Query parts. */ -export function getQueryParts( query = {} ) { +export function getQueryParts( query ) { /** * @type {WPQueriedDataQueryParts} */ diff --git a/core-data/queried-data/reducer.js b/core-data/queried-data/reducer.js index 25eda4fbb4f88..08c5b36b6b958 100644 --- a/core-data/queried-data/reducer.js +++ b/core-data/queried-data/reducer.js @@ -57,25 +57,6 @@ export function getMergedItemIds( itemIds, nextItemIds, page, perPage ) { return mergedItemIds; } -/** - * Higher-order reducer which returns undefined if the original reducer returns - * the default state value. Used in combination with `onSubKey` in avoiding - * assingment for undefined value to key. - * - * @param {Function} reducer Original reducer. - * - * @return {Function} Enhanced reducer. - */ -function withReturnUndefinedOnUnhandledDefault( reducer ) { - const defaultState = reducer( undefined, {} ); - return ( state = defaultState, action ) => { - const nextState = reducer( state, action ); - if ( nextState !== defaultState ) { - return nextState; - } - }; -} - /** * Reducer tracking items state, keyed by ID. Items are assumed to be normal, * where identifiers are common across all queries. @@ -112,18 +93,23 @@ const queries = flowRight( [ ifMatchingAction( ( action ) => 'query' in action ), // Inject query parts into action for use both in `onSubKey` and reducer. - replaceAction( ( action ) => ( { - ...action, - ...getQueryParts( action.query ), - } ) ), + replaceAction( ( action ) => { + // `ifMatchingAction` still passes on initialization, where state is + // undefined and a query is not assigned. Avoid attempting to parse + // parts. `onSubKey` will omit by lack of `stableKey`. + if ( action.query ) { + return { + ...action, + ...getQueryParts( action.query ), + }; + } + + return action; + } ), // Queries shape is shared, but keyed by query `stableKey` part. Original // reducer tracks only a single query object. onSubKey( 'stableKey' ), - - // Since query is optional for handled actions, avoid tracking empty object - // for default query on initialization. - withReturnUndefinedOnUnhandledDefault, ] )( combineReducers( { itemIds( state = null, action ) { const { type, page, perPage } = action; diff --git a/core-data/queried-data/selectors.js b/core-data/queried-data/selectors.js index a18cb2df32a51..2c44173a0eac6 100644 --- a/core-data/queried-data/selectors.js +++ b/core-data/queried-data/selectors.js @@ -19,7 +19,7 @@ import getQueryParts from './get-query-parts'; * * @return {?boolean} `requestingPageByPerPage` value for query. */ -function getRequestingPageByPerPage( state, query ) { +function getRequestingPageByPerPage( state, query = {} ) { const { stableKey, page, perPage } = getQueryParts( query ); return get( state, [ @@ -39,7 +39,7 @@ function getRequestingPageByPerPage( state, query ) { * * @return {?Array} Query items. */ -export function getQueriedItems( state, query ) { +export function getQueriedItems( state, query = {} ) { const { stableKey, page, perPage } = getQueryParts( query ); if ( ! state.queries[ stableKey ] ) { return null; diff --git a/core-data/queried-data/test/get-query-parts.js b/core-data/queried-data/test/get-query-parts.js index 4522c78338188..af9b3f40e081f 100644 --- a/core-data/queried-data/test/get-query-parts.js +++ b/core-data/queried-data/test/get-query-parts.js @@ -4,16 +4,6 @@ import { getQueryParts } from '../get-query-parts'; describe( 'getQueryParts', () => { - it( 'returns default value if passed undefined', () => { - const parts = getQueryParts(); - - expect( parts ).toEqual( { - page: 1, - perPage: 10, - stableKey: '', - } ); - } ); - it( 'parses out pagination data', () => { const parts = getQueryParts( { page: 2, perPage: 2 } );