Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import * as R from 'ramda';
- import { mergeEntities } from 'lib/ducks/entities';
- import * as metaActions from 'lib/ducks/meta';
- import * as schemaHelpers from 'lib/utils/schema';
- const consoleError = (...args) => {
- if (process.env.NODE_ENV !== 'production') {
- console.error(...args); // eslint-disable-line no-console
- }
- };
- export const loadEntities = (idKey, apiDescriptor, schema, page = 1, transformFn = R.identity) => {
- if (!schema) {
- consoleError(`ERROR: no schema supplied for key: ${idKey}`);
- }
- return async (dispatch, getState, callApi) => {
- dispatch(metaActions.pending(idKey));
- try {
- const requestWithPage = R.assocPath(['params', 'page'], page, apiDescriptor);
- const result = await callApi(requestWithPage);
- if (Array.isArray(result.data) && !Array.isArray(schema)) {
- consoleError(
- `WARN: api call returned array but supplied schema is not array type for key: ${idKey}`,
- );
- }
- if (!Array.isArray(result.data) && Array.isArray(schema)) {
- consoleError(
- `WARN: supplied schema is array but api call did not return array for key: ${idKey}`,
- );
- }
- const transformedData = transformFn(result.data);
- const data = schemaHelpers.normalizeData(R.objOf('data', transformedData), schema);
- dispatch(mergeEntities(data));
- const key = schemaHelpers.getSchemaKey(schema);
- if (Array.isArray(data.result)) {
- dispatch(metaActions.setIds(idKey, data.result));
- } else if (data.result[key]) {
- dispatch(metaActions.setIds(idKey, data.result[key]));
- } else {
- dispatch(metaActions.setIds(idKey, [data.result]));
- }
- dispatch(metaActions.success(idKey));
- return {
- result,
- normalized: data,
- };
- } catch (error) {
- dispatch(metaActions.failure(idKey, error));
- return null;
- }
- };
- };
- export const getNextPage = (idKey, request, schema, page) =>
- async (dispatch) => {
- const { result } = await dispatch(loadEntities(idKey, request, schema, page));
- if (result.paging.nextPage) {
- const rest = await dispatch(getNextPage(idKey, request, schema, page + 1));
- return [result, ...rest];
- }
- return [result];
- };
- export const loadAllPages = (idKey, request, schema) =>
- dispatch => (
- dispatch(getNextPage(idKey, request, schema, 1))
- );
Add Comment
Please, Sign In to add comment