@collectionspace/cspace-public-browser
Version:
CollectionSpace public browser
86 lines (85 loc) • 3.35 kB
JavaScript
;
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;