woocommerce/plugins/woocommerce-blocks/assets/js/data/collections/reducers.js

73 lines
1.7 KiB
JavaScript

/**
* Internal dependencies
*/
import { ACTION_TYPES as types } from './action-types';
import { hasInState, updateState } from '../utils';
/**
* Reducer for receiving items to a collection.
*
* @param {Object} state The current state in the store.
* @param {Object} action Action object.
*
* @return {Object} New or existing state depending on if there are
* any changes.
*/
const receiveCollection = ( state = {}, action ) => {
// Update last modified and previous last modified values.
if ( action.type === types.RECEIVE_LAST_MODIFIED ) {
if ( action.timestamp === state.lastModified ) {
return state;
}
return {
...state,
lastModified: action.timestamp,
};
}
// When invalidating data, remove stored values from state.
if ( action.type === types.INVALIDATE_RESOLUTION_FOR_STORE ) {
return {};
}
const { type, namespace, resourceName, queryString, response } = action;
// ids are stringified so they can be used as an index.
const ids = action.ids ? JSON.stringify( action.ids ) : '[]';
switch ( type ) {
case types.RECEIVE_COLLECTION:
if (
hasInState( state, [
namespace,
resourceName,
ids,
queryString,
] )
) {
return state;
}
state = updateState(
state,
[ namespace, resourceName, ids, queryString ],
response
);
break;
case types.RESET_COLLECTION:
state = updateState(
state,
[ namespace, resourceName, ids, queryString ],
response
);
break;
case types.ERROR:
state = updateState(
state,
[ namespace, resourceName, ids, queryString ],
response
);
break;
}
return state;
};
export default receiveCollection;