1 |
|
2 |
|
3 |
|
4 | import type { State, PagesState } from "./types";
|
5 |
|
6 | import * as Immutable from "immutable";
|
7 | import { createSelector } from "reselect";
|
8 |
|
9 | const pagesSelector = (state : State) => state;
|
10 |
|
11 | const rowsPerPage = 50;
|
12 |
|
13 | const pageSelector = createSelector(
|
14 | pagesSelector,
|
15 | (state : State, token : string) => token,
|
16 | (pages : PagesState, token : string) => pages.get(token)
|
17 | );
|
18 |
|
19 | const getAllResults = createSelector(
|
20 | pageSelector,
|
21 | (state, token, items) => items,
|
22 | (page, items) => {
|
23 | if (typeof page === "undefined") {
|
24 | return Immutable.List();
|
25 | }
|
26 |
|
27 | return page.get("ids").map((id) => items.get(String(id)));
|
28 | }
|
29 | );
|
30 |
|
31 | const getResultsUpToPage = createSelector(
|
32 | pageSelector,
|
33 | (state, token, items) => items,
|
34 | (state, token, items, target) => target,
|
35 | (state, token, items, target, perPage) => perPage || rowsPerPage,
|
36 | (page, items, target, perPage) => {
|
37 | if (typeof page === "undefined") {
|
38 | return Immutable.List();
|
39 | }
|
40 |
|
41 | const ids = page.get("ids").slice(0, (perPage * target));
|
42 |
|
43 | return ids.map((id) => items.get(String(id)));
|
44 | }
|
45 | );
|
46 |
|
47 | const getCurrentTotalResultsCount = createSelector(
|
48 | pageSelector,
|
49 | (page) => {
|
50 | if (typeof page === "undefined") {
|
51 | return 0;
|
52 | }
|
53 |
|
54 | return page.get("total");
|
55 | }
|
56 | );
|
57 |
|
58 | const isPageFetching = createSelector(
|
59 | pageSelector,
|
60 | (state, token, target) => target,
|
61 | (page, target) => {
|
62 | if (typeof page === "undefined") {
|
63 | return false;
|
64 | }
|
65 |
|
66 | return (
|
67 | page.get("fetching") &&
|
68 | target === page.get("page")
|
69 | );
|
70 | }
|
71 | );
|
72 |
|
73 | const isPageFetched = createSelector(
|
74 | pageSelector,
|
75 | (state, token, target) => target,
|
76 | (page, target) => {
|
77 | if (typeof page === "undefined") {
|
78 | return false;
|
79 | }
|
80 |
|
81 | return (
|
82 | page.get("fetched") &&
|
83 | target <= page.get("page")
|
84 | );
|
85 | }
|
86 | );
|
87 |
|
88 | const hasPageProblems = createSelector(
|
89 | pageSelector,
|
90 | (page) => {
|
91 | if (typeof page === "undefined") {
|
92 | return false;
|
93 | }
|
94 |
|
95 | return page.get("error");
|
96 | }
|
97 | );
|
98 |
|
99 | const getCurrentView = createSelector(
|
100 | pageSelector,
|
101 | (page) => {
|
102 | if (typeof page === "undefined") {
|
103 | return 1;
|
104 | }
|
105 |
|
106 | return page.get("view");
|
107 | }
|
108 | );
|
109 |
|
110 |
|
111 |
|
112 | const
|
113 | getPaginatorPaginations = (state : any, name : string) => state.getIn([
|
114 | "paginations",
|
115 | name,
|
116 | ]),
|
117 | getPaginatorEntities = (state : any, name : string) => state.getIn([
|
118 | "entities",
|
119 | name,
|
120 | ]),
|
121 | getPaginators = createSelector(
|
122 | getPaginatorPaginations,
|
123 | getPaginatorEntities,
|
124 | (list, entities) => ({
|
125 | list,
|
126 | entities,
|
127 | })
|
128 | );
|
129 |
|
130 | export default {
|
131 | getAllResults,
|
132 | getCurrentTotalResultsCount,
|
133 | getResultsUpToPage,
|
134 | isPageFetching,
|
135 | isPageFetched,
|
136 | hasPageProblems,
|
137 | getCurrentView,
|
138 |
|
139 |
|
140 | getPaginatorPaginations,
|
141 | getPaginatorEntities,
|
142 | getPaginators,
|
143 | };
|