UNPKG

2.18 kBJavaScriptView Raw
1// @flow
2/* eslint-disable max-lines-per-function, */
3
4import type { PaginatorSettings } from "./types";
5
6import { createSelector } from "reselect";
7import * as Immutable from "immutable";
8
9/*
10 Use to create a complex list where you need more information about
11 the item. For instance, if you DO need to fetch more data or to
12 manipulate it
13*/
14const 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
94export default createDataReducer;