UNPKG

@collectionspace/cspace-public-browser

Version:
86 lines (85 loc) 3.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isPending = exports.hasMore = exports.getResult = exports.getParams = exports.getPageSize = exports.getOffset = exports.getNextOffset = exports.getError = exports.default = void 0; var _immutable = _interopRequireDefault(require("immutable")); var _actionCodes = require("../constants/actionCodes"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const handleSearchFulfilled = (state, action) => { const { offset, pageSize, params: searchParams } = action.meta; const currentParams = state.get('params'); if (searchParams !== currentParams) { return state; } const { responses } = action.payload; const [resultResponse, ...filterResponses] = responses; const { aggregations, hits } = resultResponse; const currentResult = state.get('result') || _immutable.default.Map(); const currentHits = currentResult.get('hits') || _immutable.default.List(); const nextHits = currentHits.setSize(offset).concat(_immutable.default.fromJS(hits.hits)); let nextResult = currentResult.set('params', searchParams).set('total', hits.total).set('hits', nextHits); if (offset === 0) { let nextAggregations = _immutable.default.fromJS(aggregations); filterResponses.forEach(filterResponse => { nextAggregations = nextAggregations.merge(_immutable.default.fromJS(filterResponse.aggregations)); }); nextResult = nextResult.set('aggregations', nextAggregations); } return state.set('offset', offset).set('nextOffset', offset + pageSize).delete('pending').set('result', nextResult).delete('error'); }; var _default = (state = _immutable.default.Map(), action) => { switch (action.type) { case _actionCodes.SEARCH_STARTED: return state.set('pending', true).delete('error'); case _actionCodes.SEARCH_FULFILLED: return handleSearchFulfilled(state, action); case _actionCodes.SEARCH_REJECTED: return state.delete('pending').set('error', action.payload); case _actionCodes.SET_SEARCH_PAGE_SIZE: return state.set('pageSize', action.payload); case _actionCodes.SET_SEARCH_PARAMS: return state.delete('error').delete('nextOffset').set('params', action.payload).delete('pending'); default: return state; } }; exports.default = _default; const getError = state => state.get('error'); exports.getError = getError; const getOffset = state => state.get('offset') || 0; exports.getOffset = getOffset; const getNextOffset = state => state.get('nextOffset') || 0; exports.getNextOffset = getNextOffset; const getPageSize = state => state.get('pageSize'); exports.getPageSize = getPageSize; const getParams = state => state.get('params'); exports.getParams = getParams; const getResult = state => state.get('result'); exports.getResult = getResult; const hasMore = state => { const result = getResult(state); if (!result) { return true; } const currentParams = getParams(state); const resultParams = result.get('params'); if (currentParams !== resultParams) { return true; } const total = result.get('total'); const nextOffset = getNextOffset(state); return nextOffset < total; }; exports.hasMore = hasMore; const isPending = state => !!state.get('pending'); exports.isPending = isPending;