1 |
|
2 |
|
3 |
|
4 | import type { PaginatorSettings } from "./types";
|
5 |
|
6 | import { createSelector } from "reselect";
|
7 | import * as Immutable from "immutable";
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | const createDataReducer = ({ key } : PaginatorSettings) => {
|
15 | const
|
16 | getItems = (state : any) => state.getIn([
|
17 | "entities",
|
18 | key,
|
19 | ]),
|
20 | getItem = createSelector(
|
21 | getItems,
|
22 | (state, id) => id,
|
23 | (data, id) => data.get(id) || Immutable.Map()
|
24 | ),
|
25 | getItemsList = createSelector(
|
26 | getItems,
|
27 | (data) => data.map((current) => current.get("Data")).toList()
|
28 | ),
|
29 | getItemData = createSelector(
|
30 | getItems,
|
31 | (state, id) => id,
|
32 | (data, id) => {
|
33 | if (typeof data === "undefined") {
|
34 | return Immutable.Map();
|
35 | }
|
36 |
|
37 | return data.getIn([
|
38 | id,
|
39 | "Data",
|
40 | ]);
|
41 | }
|
42 | ),
|
43 | getItemHasError = createSelector(
|
44 | getItem,
|
45 | (data) => {
|
46 | if (typeof data === "undefined") {
|
47 | return false;
|
48 | }
|
49 |
|
50 | return data.get("error") === true;
|
51 | }
|
52 | ),
|
53 | getIsFetchingItemInfo = createSelector(
|
54 | getItem,
|
55 | (data) => {
|
56 | if (typeof data === "undefined") {
|
57 | return false;
|
58 | }
|
59 |
|
60 | return data.get("fetching");
|
61 | }
|
62 | ),
|
63 | getItemIsFetched = createSelector(
|
64 | getItem,
|
65 | (data) => {
|
66 | if (typeof data === "undefined") {
|
67 | return false;
|
68 | }
|
69 |
|
70 | return data.get("fetched");
|
71 | }
|
72 | ),
|
73 | getShouldFetchItemInfo = createSelector(
|
74 | getIsFetchingItemInfo,
|
75 | getItemIsFetched,
|
76 | getItemHasError,
|
77 | (isFetching, isFetched, hasError) => (
|
78 | !isFetched && !isFetching && !hasError
|
79 | )
|
80 | );
|
81 |
|
82 | return {
|
83 | getItems,
|
84 | getItem,
|
85 | getItemsList,
|
86 | getItemData,
|
87 | getItemHasError,
|
88 | getIsFetchingItemInfo,
|
89 | getItemIsFetched,
|
90 | getShouldFetchItemInfo,
|
91 | };
|
92 | };
|
93 |
|
94 | export default createDataReducer;
|