1 | import { get } from "lodash";
|
2 | import { createSelector } from "reselect";
|
3 | import { denormalize } from "normalizr";
|
4 | import { initState } from "./reducer";
|
5 | import { camelCaseKey } from "./lib";
|
6 |
|
7 | const entitiesSelector = state => state.entities;
|
8 |
|
9 | export 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 | */
|
18 | const 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 |
|
34 | export default makeApiSelector;
|