Guest User

Untitled

a guest
Jan 19th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. import * as R from 'ramda';
  2. import { mergeEntities } from 'lib/ducks/entities';
  3. import * as metaActions from 'lib/ducks/meta';
  4. import * as schemaHelpers from 'lib/utils/schema';
  5.  
  6. const consoleError = (...args) => {
  7. if (process.env.NODE_ENV !== 'production') {
  8. console.error(...args); // eslint-disable-line no-console
  9. }
  10. };
  11.  
  12. export const loadEntities = (idKey, apiDescriptor, schema, page = 1, transformFn = R.identity) => {
  13. if (!schema) {
  14. consoleError(`ERROR: no schema supplied for key: ${idKey}`);
  15. }
  16.  
  17. return async (dispatch, getState, callApi) => {
  18. dispatch(metaActions.pending(idKey));
  19. try {
  20. const requestWithPage = R.assocPath(['params', 'page'], page, apiDescriptor);
  21. const result = await callApi(requestWithPage);
  22.  
  23. if (Array.isArray(result.data) && !Array.isArray(schema)) {
  24. consoleError(
  25. `WARN: api call returned array but supplied schema is not array type for key: ${idKey}`,
  26. );
  27. }
  28.  
  29. if (!Array.isArray(result.data) && Array.isArray(schema)) {
  30. consoleError(
  31. `WARN: supplied schema is array but api call did not return array for key: ${idKey}`,
  32. );
  33. }
  34.  
  35. const transformedData = transformFn(result.data);
  36. const data = schemaHelpers.normalizeData(R.objOf('data', transformedData), schema);
  37. dispatch(mergeEntities(data));
  38.  
  39. const key = schemaHelpers.getSchemaKey(schema);
  40. if (Array.isArray(data.result)) {
  41. dispatch(metaActions.setIds(idKey, data.result));
  42. } else if (data.result[key]) {
  43. dispatch(metaActions.setIds(idKey, data.result[key]));
  44. } else {
  45. dispatch(metaActions.setIds(idKey, [data.result]));
  46. }
  47.  
  48. dispatch(metaActions.success(idKey));
  49. return {
  50. result,
  51. normalized: data,
  52. };
  53. } catch (error) {
  54. dispatch(metaActions.failure(idKey, error));
  55. return null;
  56. }
  57. };
  58. };
  59.  
  60. export const getNextPage = (idKey, request, schema, page) =>
  61. async (dispatch) => {
  62. const { result } = await dispatch(loadEntities(idKey, request, schema, page));
  63. if (result.paging.nextPage) {
  64. const rest = await dispatch(getNextPage(idKey, request, schema, page + 1));
  65. return [result, ...rest];
  66. }
  67.  
  68. return [result];
  69. };
  70.  
  71. export const loadAllPages = (idKey, request, schema) =>
  72. dispatch => (
  73. dispatch(getNextPage(idKey, request, schema, 1))
  74. );
Add Comment
Please, Sign In to add comment