UNPKG

938 BJavaScriptView Raw
1import { get } from "lodash";
2import { createSelector } from "reselect";
3import { denormalize } from "normalizr";
4import { initState } from "./reducer";
5import { camelCaseKey } from "./lib";
6
7const entitiesSelector = state => state.entities;
8
9export const makeStateSelector = path => state =>
10 get(state.apis, path) || initState;
11
12/**
13 *
14 * @param {string} key api key or redux state key
15 * @param {object} schema output data schema
16 * @returns {function(object) => object} selector
17 */
18const makeApiSelector = (key, schema) => {
19 const path = camelCaseKey(key);
20 const stateSelector = makeStateSelector(path);
21
22 return createSelector(
23 stateSelector,
24 entitiesSelector,
25 (state, entities) => {
26 const { result } = state;
27 if (!result || !schema) return state;
28 const deResult = denormalize(result, schema, entities);
29 return { ...state, result: deResult };
30 }
31 );
32};
33
34export default makeApiSelector;