redux-paginator-immutable 19.0.2 → 19.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/agent.d.ts CHANGED
@@ -4,5 +4,5 @@ type FetchPageArgs = {
4
4
  page: number;
5
5
  token: string;
6
6
  };
7
- export declare const buildSuffix: (pageArgName: string, page: number, params: string) => string, fetchPage: ({ endpoint, pageArgName, page, token, }: FetchPageArgs) => any;
7
+ export declare const fetchPage: ({ endpoint, pageArgName, page, token, }: FetchPageArgs) => any;
8
8
  export {};
package/agent.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable no-bitwise*/
2
2
  import qs from "query-string";
3
3
  import agent from "superagent";
4
- export const buildSuffix = (pageArgName, page, params) => {
4
+ const buildSuffix = (pageArgName, page, params) => {
5
5
  const parsedParams = qs.parse(params);
6
6
  let finalParsedParams = {}, startString = "";
7
7
  for (const key of Object.keys(parsedParams)) {
@@ -19,7 +19,8 @@ export const buildSuffix = (pageArgName, page, params) => {
19
19
  return startString + qs.stringify(Object.assign(Object.assign({}, finalParsedParams), { [pageArgName]: page }), {
20
20
  encode: false,
21
21
  }).replace(startString, "");
22
- }, fetchPage = ({ endpoint, pageArgName, page, token, }) => {
22
+ };
23
+ export const fetchPage = ({ endpoint, pageArgName, page, token, }) => {
23
24
  const suffix = buildSuffix(pageArgName, page, token), url = endpoint + suffix, promise = new Promise((resolve, reject) => (agent.
24
25
  get(url).
25
26
  end((err, res) => err ? reject(err) : resolve(res))));
package/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAS9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,CAAC,MACL,WAAW,GAAG,CAAC,WAAmB,EAAE,IAAY,EAAE,MAAc,EAAE,EAAE;IAClE,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,iBAAiB,GAAG,EAAE,EACxB,WAAW,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,WAAW,IAAI,GAAG,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,iBAAiB,mCAAQ,iBAAiB,KACxC,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,WAAW,GAAG,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC;IAE3D,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3E,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,WAAW,GAAG,EAAE,CAAC,SAAS,iCAAM,iBAAiB,KACtD,CAAC,WAAW,CAAC,EAAE,IAAI,KAClB;QACD,MAAM,EAAE,KAAK;KACd,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC,EACD,SAAS,GAAG,CAAC,EACX,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,KAAK,GACS,EAAE,EAAE;IAClB,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,EAClD,GAAG,GAAG,QAAQ,GAAG,MAAM,EACvB,OAAO,GAAQ,IAAI,OAAO,CACxB,CAAC,OAAY,EAAE,MAAW,EAAE,EAAE,CAAC,CAC7B,KAAK;QACH,GAAG,CAAC,GAAG,CAAC;QACR,GAAG,CAAC,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAChE,CACF,CAAC;IAEJ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAEpB,EAAE,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,GAAG,CAAC,IAAI;KACnB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAS9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MACE,WAAW,GAAG,CAAC,WAAmB,EAAE,IAAY,EAAE,MAAc,EAAE,EAAE;IAClE,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,iBAAiB,GAAG,EAAE,EACxB,WAAW,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,WAAW,IAAI,GAAG,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,iBAAiB,mCAAQ,iBAAiB,KACxC,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,WAAW,GAAG,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC;IAE3D,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3E,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,WAAW,GAAG,EAAE,CAAC,SAAS,iCAAM,iBAAiB,KACtD,CAAC,WAAW,CAAC,EAAE,IAAI,KAClB;QACD,MAAM,EAAE,KAAK;KACd,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEJ,MAAM,CAAC,MACL,SAAS,GAAG,CAAC,EACX,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,KAAK,GACS,EAAE,EAAE;IAClB,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,EAClD,GAAG,GAAG,QAAQ,GAAG,MAAM,EACvB,OAAO,GAAQ,IAAI,OAAO,CACxB,CAAC,OAAY,EAAE,MAAW,EAAE,EAAE,CAAC,CAC7B,KAAK;QACH,GAAG,CAAC,GAAG,CAAC;QACR,GAAG,CAAC,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAChE,CACF,CAAC;IAEJ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAEpB,EAAE,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,GAAG,CAAC,IAAI;KACnB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  const defaultRowsPerLoad = 25;
2
2
  import * as Immutable from "immutable";
3
3
  import actions from "./actions.js";
4
+ import { registerFetcher } from "./fetcherRegistry.js";
4
5
  import { dataItems as dataItemsReducer, items as itemsReducer, pages as pagesReducer } from "./reducers.js";
5
6
  const getEndpoint = (data) => {
6
7
  if (typeof data === "object") {
@@ -20,7 +21,7 @@ const getEndpoint = (data) => {
20
21
  return reducer(state, action);
21
22
  };
22
23
  export const createPaginator = (endpointData, settings) => {
23
- const { path: endpoint, cb: endpointCb, } = getEndpoint(endpointData), { key, normalizeDataItem, dataItemURL, manageEntity, resultsKey, totalKey = "Total", pageArgName = "page", idKey = "ID", rowsPerLoad = defaultRowsPerLoad, manipulateItems = (items) => items, } = settings, endpointedActions = {
24
+ const { path: endpoint, cb: endpointCb, } = getEndpoint(endpointData), { key, normalizeDataItem, dataItemURL, manageEntity, resultsKey, totalKey = "Total", pageArgName = "page", idKey = "ID", rowsPerLoad = defaultRowsPerLoad, manipulateItems = (items) => items, fetcher, } = settings, endpointedActions = {
24
25
  requestPage: (page, token) => actions.requestPage({
25
26
  endpoint,
26
27
  endpointCb,
@@ -45,6 +46,9 @@ export const createPaginator = (endpointData, settings) => {
45
46
  return actions.clearData(endpoint);
46
47
  },
47
48
  };
49
+ if (typeof fetcher === "function") {
50
+ registerFetcher(endpoint, fetcher);
51
+ }
48
52
  return Object.assign({ key,
49
53
  normalizeDataItem,
50
54
  dataItemURL,
@@ -1 +1 @@
1
- {"version":3,"file":"createPaginator.js","sourceRoot":"","sources":["../src/createPaginator.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AACvC,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,KAAK,IAAI,YAAY,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAgBzG,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,EAAE;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAG,IAAI,CAAC,IAAI;YAChB,EAAE,EAAK,IAAI,CAAC,EAAE;SACf,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAG,IAAI;QACX,EAAE,EAAK,IAAI;KACZ,CAAC;AACJ,CAAC,EACD,eAAe,GAAG,CAAC,QAAiB,EAAE,OAAa,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,MAAe,EAAE,EAAE;IACnG,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC;AAEJ,MAAM,CAAC,MACL,eAAe,GAAG,CAAC,YAAsB,EAAE,QAA2B,EAAE,EAAE;IACxE,MACE,EACE,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,UAAU,GACf,GAAG,WAAW,CAAC,YAAY,CAAC,EAC7B,EACE,GAAG,EACH,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,GAAG,OAAO,EAClB,WAAW,GAAG,MAAM,EACpB,KAAK,GAAG,IAAI,EACZ,WAAW,GAAG,kBAAkB,EAChC,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GACnC,GAAG,QAAQ,EACZ,iBAAiB,GAAG;QAClB,WAAW,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAChE,QAAQ;YACR,UAAU;YACV,YAAY;YACZ,UAAU;YACV,QAAQ;YACR,WAAW;YACX,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC;QAEF,SAAS,CAAE,KAAW;YACpB,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,UAAU,CAAE,EAAE,IAAI,EAAE,KAAK,EAAoC;YAC3D,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;gBAClC,IAAI;gBACJ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,SAAS;YACP,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;IAEJ,uBACE,GAAG;QACH,iBAAiB;QACjB,WAAW;QACX,eAAe;QACf,WAAW;QACX,YAAY;QACZ,UAAU;QACV,QAAQ,EACR,YAAY,EAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,EAC1D,YAAY,EAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,EAC1D,gBAAgB,EAAG,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAC3D,iBAAiB,EACpB;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"createPaginator.js","sourceRoot":"","sources":["../src/createPaginator.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AACvC,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,KAAK,IAAI,YAAY,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAgBzG,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,EAAE;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAG,IAAI,CAAC,IAAI;YAChB,EAAE,EAAK,IAAI,CAAC,EAAE;SACf,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAG,IAAI;QACX,EAAE,EAAK,IAAI;KACZ,CAAC;AACJ,CAAC,EACD,eAAe,GAAG,CAAC,QAAiB,EAAE,OAAa,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,MAAe,EAAE,EAAE;IACnG,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC;AAEJ,MAAM,CAAC,MACL,eAAe,GAAG,CAAC,YAAsB,EAAE,QAA2B,EAAE,EAAE;IACxE,MACE,EACE,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,UAAU,GACf,GAAG,WAAW,CAAC,YAAY,CAAC,EAC7B,EACE,GAAG,EACH,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,GAAG,OAAO,EAClB,WAAW,GAAG,MAAM,EACpB,KAAK,GAAG,IAAI,EACZ,WAAW,GAAG,kBAAkB,EAChC,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAClC,OAAO,GACR,GAAG,QAAQ,EACZ,iBAAiB,GAAG;QAClB,WAAW,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAChE,QAAQ;YACR,UAAU;YACV,YAAY;YACZ,UAAU;YACV,QAAQ;YACR,WAAW;YACX,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC;QAEF,SAAS,CAAE,KAAW;YACpB,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,UAAU,CAAE,EAAE,IAAI,EAAE,KAAK,EAAoC;YAC3D,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;gBAClC,IAAI;gBACJ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,SAAS;YACP,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;IAEJ,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,uBACE,GAAG;QACH,iBAAiB;QACjB,WAAW;QACX,eAAe;QACf,WAAW;QACX,YAAY;QACZ,UAAU;QACV,QAAQ,EACR,YAAY,EAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,EAC1D,YAAY,EAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,EAC1D,gBAAgB,EAAG,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAC3D,iBAAiB,EACpB;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Fetcher } from "./types";
2
+ export declare const registerFetcher: (endpoint: string, fetcher: Fetcher) => void, getFetcher: (endpoint: string) => Fetcher | undefined;
@@ -0,0 +1,10 @@
1
+ // Endpoint → custom fetcher. A paginator created with a `fetcher` setting
2
+ // registers it here; paginatorMiddleware uses it instead of the built-in
3
+ // superagent HTTP call. Lets non-HTTP transports (e.g. Wails IPC) plug in
4
+ // without replacing the middleware. Endpoints without a registered fetcher
5
+ // keep the original superagent behaviour unchanged.
6
+ const registry = new Map();
7
+ export const registerFetcher = (endpoint, fetcher) => {
8
+ registry.set(endpoint, fetcher);
9
+ }, getFetcher = (endpoint) => registry.get(endpoint);
10
+ //# sourceMappingURL=fetcherRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcherRegistry.js","sourceRoot":"","sources":["../src/fetcherRegistry.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,oDAAoD;AAEpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;AAE5C,MAAM,CAAC,MACL,eAAe,GAAG,CAAC,QAAgB,EAAE,OAAgB,EAAQ,EAAE;IAC7D,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC,EACD,UAAU,GAAG,CAAC,QAAgB,EAAuB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC"}
package/index.d.ts CHANGED
@@ -9,3 +9,4 @@ export { default as paginatorMiddleware } from "./paginatorMiddleware";
9
9
  export { default as reducerOperations } from "./reducerOperations";
10
10
  export { default as paginatorSelectors } from "./selectors";
11
11
  export { manageDataEntity, manageEntity, manipulateDataItems, manipulateItems } from "./util";
12
+ export type { Fetcher, PaginatorSettings } from "./types";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redux-paginator-immutable",
3
- "version": "19.0.2",
3
+ "version": "19.1.0",
4
4
  "type": "module",
5
5
  "description": "redux-paginator-immutable",
6
6
  "main": "./index.js",
@@ -1,33 +1,57 @@
1
1
  /* eslint-disable no-console, max-lines-per-function */
2
- import { REQUEST_PAGE } from "./actionTypes.js";
2
+ import { CLEAR_DATA, REQUEST_PAGE } from "./actionTypes.js";
3
3
  import actions from "./actions.js";
4
4
  import { fetchPage } from "./agent.js";
5
- const { receivePage } = actions, paginatorMiddleware = ({ dispatch }) => (next) => (action) => {
5
+ import { getFetcher } from "./fetcherRegistry.js";
6
+ const { receivePage } = actions,
7
+ // (endpoint|page|token) of fetches currently in flight. Guards against a
8
+ // remount / fast-nav race firing the same fetch twice (the pages reducer
9
+ // concats ids on RECEIVE_PAGE → duplicate rows). Transparent on the happy
10
+ // path: a single REQUEST_PAGE adds then removes its own key.
11
+ inFlight = new Set(),
12
+ // Per-endpoint generation. CLEAR_DATA bumps it; a fetch started before the
13
+ // clear is discarded on resolve, so a stale response cannot refill a list
14
+ // the caller just cleared (and the post-clear refetch is free to run).
15
+ epochs = new Map(), epochOf = (endpoint) => epochs.get(endpoint) || 0, clearEndpoint = (endpoint) => {
16
+ epochs.set(endpoint, epochOf(endpoint) + 1);
17
+ Array.from(inFlight).forEach((key) => {
18
+ if (key.startsWith(`${endpoint}|`)) {
19
+ inFlight.delete(key);
20
+ }
21
+ });
22
+ }, paginatorMiddleware = ({ dispatch }) => (next) => (action) => {
23
+ if (action.type === CLEAR_DATA) {
24
+ if (action.meta && typeof action.meta.endpoint === "string") {
25
+ clearEndpoint(action.meta.endpoint);
26
+ }
27
+ return next(action);
28
+ }
6
29
  if (action.type === REQUEST_PAGE) {
7
- const { meta: { endpoint, endpointCb, manageEntity, resultsKey, totalKey, pageArgName, idKey, }, payload: { page, token, }, } = action;
8
- dispatch((dispatch2) => {
9
- const markAsError = () => {
10
- dispatch2(receivePage({
11
- endpoint,
12
- endpointCb,
13
- manageEntity,
14
- pageArgName,
15
- idKey,
16
- page,
17
- error: true,
18
- token,
19
- items: [],
20
- total: 0,
21
- }));
22
- }, rawPath = typeof endpointCb === "function" ? endpointCb(token) : endpoint, path = rawPath === null ? "" : rawPath;
23
- try {
24
- fetchPage({
25
- endpoint: path,
26
- pageArgName,
27
- page,
28
- token,
29
- }).then((res) => {
30
- const { response } = res;
30
+ const { meta: { endpoint, endpointCb, manageEntity, resultsKey, totalKey, pageArgName, idKey, }, payload: { page, token, }, } = action, dedupeKey = `${endpoint}|${page}|${token}`;
31
+ if (!inFlight.has(dedupeKey)) {
32
+ inFlight.add(dedupeKey);
33
+ const requestEpoch = epochOf(endpoint);
34
+ dispatch((dispatch2) => {
35
+ const isStale = () => epochOf(endpoint) !== requestEpoch, markAsError = () => {
36
+ if (isStale()) {
37
+ return;
38
+ }
39
+ dispatch2(receivePage({
40
+ endpoint,
41
+ endpointCb,
42
+ manageEntity,
43
+ pageArgName,
44
+ idKey,
45
+ page,
46
+ error: true,
47
+ token,
48
+ items: [],
49
+ total: 0,
50
+ }));
51
+ }, onResponse = (response) => {
52
+ if (isStale()) {
53
+ return;
54
+ }
31
55
  let results = [], total = 0;
32
56
  if (typeof resultsKey === "undefined") {
33
57
  results = response;
@@ -48,14 +72,29 @@ const { receivePage } = actions, paginatorMiddleware = ({ dispatch }) => (next)
48
72
  items: results,
49
73
  total,
50
74
  }));
51
- }).catch(() => {
75
+ }, settle = () => {
76
+ inFlight.delete(dedupeKey);
77
+ }, fetcher = getFetcher(endpoint), rawPath = typeof endpointCb === "function" ? endpointCb(token) : endpoint, path = rawPath === null ? "" : rawPath;
78
+ try {
79
+ const run = typeof fetcher === "function"
80
+ ? fetcher(token, page)
81
+ : fetchPage({
82
+ endpoint: path,
83
+ pageArgName,
84
+ page,
85
+ token,
86
+ }).then((res) => res.response);
87
+ run.
88
+ then(onResponse).
89
+ catch(markAsError).
90
+ finally(settle);
91
+ }
92
+ catch (err) {
93
+ settle();
52
94
  markAsError();
53
- });
54
- }
55
- catch (err) {
56
- markAsError();
57
- }
58
- });
95
+ }
96
+ });
97
+ }
59
98
  }
60
99
  return next(action);
61
100
  };
@@ -1 +1 @@
1
- {"version":3,"file":"paginatorMiddleware.js","sourceRoot":"","sources":["../src/paginatorMiddleware.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MACE,EAAE,WAAW,EAAE,GAAG,OAAO,EAEzB,mBAAmB,GAAG,CAAC,EAAE,QAAQ,EAA0B,EAAE,EAAE,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE;IAChG,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,MAAM,EACJ,IAAI,EAAE,EACJ,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,KAAK,GACN,EACD,OAAO,EAAE,EACP,IAAI,EACJ,KAAK,GACN,GACF,GAAG,MAAM,CAAC;QAEX,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE;YACrB,MACE,WAAW,GAAG,GAAG,EAAE;gBACjB,SAAS,CAAC,WAAW,CAAC;oBACpB,QAAQ;oBACR,UAAU;oBACV,YAAY;oBACZ,WAAW;oBACX,KAAK;oBACL,IAAI;oBACJ,KAAK,EAAG,IAAI;oBACZ,KAAK;oBACL,KAAK,EAAG,EAAE;oBACV,KAAK,EAAG,CAAC;iBACV,CAAC,CAAC,CAAC;YACN,CAAC,EAED,OAAO,GAAG,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EACzE,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAEzC,IAAI,CAAC;gBACH,SAAS,CAAC;oBACR,QAAQ,EAAE,IAAI;oBACd,WAAW;oBACX,IAAI;oBACJ,KAAK;iBACN,CAAC,CAAC,IAAI,CAAC,CAAC,GAAuB,EAAE,EAAE;oBAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;oBAEzB,IACE,OAAO,GAAG,EAAE,EACZ,KAAK,GAAG,CAAC,CAAC;oBAEZ,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;wBACtC,OAAO,GAAG,QAAQ,CAAC;oBACrB,CAAC;yBAAM,CAAC;wBACN,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;wBAC/B,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC7B,CAAC;oBAED,SAAS,CAAC,WAAW,CAAC;wBACpB,QAAQ;wBACR,UAAU;wBACV,YAAY;wBACZ,WAAW;wBACX,KAAK;wBACL,IAAI;wBACJ,KAAK,EAAG,KAAK;wBACb,KAAK;wBACL,KAAK,EAAG,OAAO;wBACf,KAAK;qBACN,CAAC,CAAC,CAAC;gBACN,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACZ,WAAW,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AAEJ,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"paginatorMiddleware.js","sourceRoot":"","sources":["../src/paginatorMiddleware.ts"],"names":[],"mappings":"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"}
package/types.d.ts CHANGED
@@ -9,10 +9,12 @@ type PromiseAction = Promise<Action>;
9
9
  type ThunkAction = (dispatch: Dispatch, getState: GetState) => any;
10
10
  export type Dispatch = (action: Action | ThunkAction | PromiseAction | Array<Action>) => any;
11
11
  export type EndPointCb = ((token?: string) => string) | null;
12
+ export type Fetcher = (token: string, page: number) => Promise<any>;
12
13
  export type PaginatorSettings = {
13
14
  key: string;
14
15
  manageEntity: any;
15
16
  resultsKey: string;
17
+ fetcher?: Fetcher;
16
18
  rowsPerLoad?: number;
17
19
  manipulateItems?: (items: any) => any;
18
20
  totalKey?: string;