UNPKG

2.99 kBJavaScriptView Raw
1// @flow
2/* eslint-disable no-undefined */
3
4import type { State, PagesState } from "./types";
5
6import * as Immutable from "immutable";
7import { createSelector } from "reselect";
8
9const pagesSelector = (state : State) => state;
10
11const rowsPerPage = 50;
12
13const pageSelector = createSelector(
14 pagesSelector,
15 (state : State, token : string) => token,
16 (pages : PagesState, token : string) => pages.get(token)
17);
18
19const 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
31const 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
47const getCurrentTotalResultsCount = createSelector(
48 pageSelector,
49 (page) => {
50 if (typeof page === "undefined") {
51 return 0;
52 }
53
54 return page.get("total");
55 }
56);
57
58const 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
73const 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
88const hasPageProblems = createSelector(
89 pageSelector,
90 (page) => {
91 if (typeof page === "undefined") {
92 return false;
93 }
94
95 return page.get("error");
96 }
97);
98
99const 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// these selectors are used for the entire app
112const
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
130export default {
131 getAllResults,
132 getCurrentTotalResultsCount,
133 getResultsUpToPage,
134 isPageFetching,
135 isPageFetched,
136 hasPageProblems,
137 getCurrentView,
138
139 // for state
140 getPaginatorPaginations,
141 getPaginatorEntities,
142 getPaginators,
143};