@promoboxx/use-filter 1.5.0 → 1.5.3

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.
@@ -10,12 +10,12 @@ declare function useFilter<TFilter, TResult>(namespace: string, options: UseFilt
10
10
  data: TResult | null | undefined;
11
11
  doesFilterExist: boolean;
12
12
  filterInfo: FilterInfo<TFilter>;
13
- updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: any) => void;
14
- resetFilter: () => void;
15
- setOffset: (offset: number | string) => void;
16
- setPage: (page: number | string) => void;
17
- setSort: (sort: string | undefined) => void;
18
- forceRefresh: () => void;
13
+ updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: boolean) => void;
14
+ resetFilter: (shouldRunImmediately?: boolean) => void;
15
+ setOffset: (offset: number | string, shouldRunImmediately?: boolean) => void;
16
+ setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
17
+ setSort: (sort: string | undefined, shouldRunImmediately?: boolean) => void;
18
+ forceRefresh: (shouldRunImmediately?: boolean) => void;
19
19
  };
20
20
  export default useFilter;
21
21
  export interface FilterInfo<TFilter> {
package/dist/useFilter.js CHANGED
@@ -158,33 +158,38 @@ function useFilter(namespace, options) {
158
158
  return __assign(__assign({}, previous), { offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
159
159
  });
160
160
  }, []),
161
- resetFilter: react_1.useCallback(function () {
162
- setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: true, lastRefreshAt: new Date().getTime() }));
161
+ resetFilter: react_1.useCallback(function (shouldRunImmediately) {
162
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
163
+ setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately }));
163
164
  }, []),
164
- setOffset: react_1.useCallback(function (offset) {
165
+ setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
166
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
165
167
  setFilterInfoState(function (previous) {
166
168
  invariant(previous != null, 'setOffset called without filterInfo');
167
169
  var offsetNumber = Number(offset);
168
- return __assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime() });
170
+ return __assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
169
171
  });
170
172
  }, []),
171
- setPage: react_1.useCallback(function (page) {
173
+ setPage: react_1.useCallback(function (page, shouldRunImmediately) {
174
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
172
175
  setFilterInfoState(function (previous) {
173
176
  invariant(previous != null, 'setPage called without filterInfo');
174
177
  var pageNumber = Number(page);
175
- return __assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime() });
178
+ return __assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
176
179
  });
177
180
  }, []),
178
- setSort: react_1.useCallback(function (sort) {
181
+ setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
182
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
179
183
  setFilterInfoState(function (previous) {
180
184
  invariant(previous != null, 'setSort called without filterInfo');
181
- return __assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime() });
185
+ return __assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
182
186
  });
183
187
  }, []),
184
- forceRefresh: react_1.useCallback(function () {
188
+ forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
189
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
185
190
  setFilterInfoState(function (previous) {
186
191
  invariant(previous != null, 'forceRefresh called without filterInfo');
187
- return __assign(__assign({}, previous), { lastRefreshAt: new Date().getTime() });
192
+ return __assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
188
193
  });
189
194
  }, []),
190
195
  };
@@ -0,0 +1,45 @@
1
+ export interface SimpleFilterInfo<TFilter> {
2
+ filter: TFilter;
3
+ sort?: string;
4
+ offset: number;
5
+ page: number;
6
+ pageSize: number;
7
+ lastRefreshAt: number;
8
+ shouldRunImmediately: boolean;
9
+ }
10
+ interface UseSimpleFilterOptions<TFilter> {
11
+ defaultFilterInfo?: Partial<SimpleFilterInfo<TFilter>>;
12
+ debounceDuration?: number;
13
+ }
14
+ declare function useSimpleFilter<TFilter>(namespace: string, options: UseSimpleFilterOptions<TFilter>): {
15
+ isLoading: boolean;
16
+ filterInfo: {
17
+ shouldRunImmediately: boolean;
18
+ filter: TFilter;
19
+ sort?: string | undefined;
20
+ offset: number;
21
+ page: number;
22
+ pageSize: number;
23
+ lastRefreshAt: number;
24
+ };
25
+ debouncedFilterInfo: {
26
+ shouldRunImmediately: boolean;
27
+ filter: TFilter;
28
+ sort?: string | undefined;
29
+ offset: number;
30
+ page: number;
31
+ pageSize: number;
32
+ lastRefreshAt: number;
33
+ };
34
+ updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: any) => void;
35
+ pagingInfo: (total: string | number | null | undefined) => {
36
+ totalResults: number;
37
+ totalPages: number;
38
+ };
39
+ resetFilter: (shouldRunImmediately?: boolean) => void;
40
+ setOffset: (offset: number | string, shouldRunImmediately?: boolean) => void;
41
+ setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
42
+ setSort: (sort: string, shouldRunImmediately?: boolean) => void;
43
+ forceRefresh: (shouldRunImmediately?: boolean) => void;
44
+ };
45
+ export default useSimpleFilter;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var react_1 = require("react");
18
+ var getOffsetFromPage_1 = __importDefault(require("./lib/getOffsetFromPage"));
19
+ var getPageFromOffset_1 = __importDefault(require("./lib/getPageFromOffset"));
20
+ var shallowEqual_1 = __importDefault(require("./lib/shallowEqual"));
21
+ var store_1 = require("./store");
22
+ function useSimpleFilter(namespace, options) {
23
+ // Having these types of refs helps get around rules of hooks, and they need
24
+ // to be updated each render.
25
+ var ctxRefValue = {
26
+ namespace: namespace,
27
+ debounceDuration: options.debounceDuration,
28
+ defaultFilterInfo: options.defaultFilterInfo,
29
+ };
30
+ var ctxRef = react_1.useRef(ctxRefValue);
31
+ react_1.useEffect(function () {
32
+ ctxRef.current = ctxRefValue;
33
+ });
34
+ var _a = react_1.useState(false), isLoading = _a[0], setIsLoading = _a[1];
35
+ var _b = react_1.useState(function () { return (__assign(__assign({}, (store_1.getFilterStore().getFilter(namespace) ||
36
+ buildDefaultFilterInfo(options.defaultFilterInfo))), { shouldRunImmediately: true })); }), filterInfo = _b[0], setFilterInfoState = _b[1];
37
+ var _c = react_1.useState(filterInfo), debouncedFilterInfo = _c[0], setDebouncedFilterInfo = _c[1];
38
+ // Not sure this is needed in simple mode?
39
+ var lastRefreshAtRef = react_1.useRef(-1);
40
+ react_1.useEffect(function () {
41
+ var _a;
42
+ setIsLoading(true);
43
+ // If the lastRefreshAt hasn't changed, don't do anything.
44
+ if (lastRefreshAtRef.current === filterInfo.lastRefreshAt) {
45
+ setIsLoading(false);
46
+ return;
47
+ }
48
+ var timeout = undefined;
49
+ function makeRequest() {
50
+ lastRefreshAtRef.current = filterInfo.lastRefreshAt;
51
+ store_1.getFilterStore().saveFilter(ctxRef.current.namespace, filterInfo);
52
+ setDebouncedFilterInfo(filterInfo);
53
+ setIsLoading(false);
54
+ }
55
+ if (filterInfo.shouldRunImmediately) {
56
+ makeRequest();
57
+ }
58
+ else {
59
+ timeout = setTimeout(makeRequest, (_a = ctxRef.current.debounceDuration) !== null && _a !== void 0 ? _a : 500);
60
+ }
61
+ return function () {
62
+ if (timeout) {
63
+ clearTimeout(timeout);
64
+ }
65
+ };
66
+ }, [filterInfo]);
67
+ var previousTotalRef = react_1.useRef(0);
68
+ return {
69
+ isLoading: isLoading,
70
+ filterInfo: filterInfo,
71
+ debouncedFilterInfo: debouncedFilterInfo,
72
+ updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
73
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
74
+ setFilterInfoState(function (previous) {
75
+ var nextFilter = __assign(__assign({}, previous.filter), filter);
76
+ if (shallowEqual_1.default(previous.filter, nextFilter)) {
77
+ return previous;
78
+ }
79
+ return __assign(__assign({}, previous), { shouldRunImmediately: shouldRunImmediately, offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter, lastRefreshAt: new Date().getTime() });
80
+ });
81
+ }, []),
82
+ pagingInfo: react_1.useCallback(function (total) {
83
+ var normalized = Number(
84
+ // Because we accept `null` as an argument, we can't do something as
85
+ // simple as `total ?? ...`
86
+ total == null ? previousTotalRef.current : total);
87
+ previousTotalRef.current = normalized;
88
+ return {
89
+ totalResults: normalized,
90
+ totalPages: Math.ceil(normalized / filterInfo.pageSize),
91
+ };
92
+ }, [filterInfo.pageSize]),
93
+ resetFilter: react_1.useCallback(function (shouldRunImmediately) {
94
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
95
+ setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: shouldRunImmediately }));
96
+ }, []),
97
+ setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
98
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
99
+ var offsetNumber = Number(offset);
100
+ setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
101
+ }, []),
102
+ setPage: react_1.useCallback(function (page, shouldRunImmediately) {
103
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
104
+ var pageNumber = Number(page);
105
+ setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
106
+ }, []),
107
+ setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
108
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
109
+ setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
110
+ }, []),
111
+ forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
112
+ if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
113
+ setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
114
+ }, []),
115
+ };
116
+ }
117
+ function buildDefaultFilterInfo(filterInfo) {
118
+ if (filterInfo === void 0) { filterInfo = {}; }
119
+ var merged = __assign({
120
+ // Cast here to work around "'T' could be instantiated with an arbitrary
121
+ // type which could be unrelated to '{}'"
122
+ filter: {}, sort: undefined, pageSize: 20, lastRefreshAt: new Date().getTime(), offset: 0, page: 1, shouldRunImmediately: false }, filterInfo);
123
+ // If there's a page but no offset, set the offset.
124
+ if (filterInfo.page != null && filterInfo.offset == null) {
125
+ merged.offset = getOffsetFromPage_1.default(filterInfo.page, merged.pageSize);
126
+ // If there's an offset but no page, set the page.
127
+ }
128
+ else if (filterInfo.page == null && filterInfo.offset != null) {
129
+ merged.page = getPageFromOffset_1.default(filterInfo.offset, merged.pageSize);
130
+ }
131
+ return merged;
132
+ }
133
+ exports.default = useSimpleFilter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promoboxx/use-filter",
3
- "version": "1.5.0",
3
+ "version": "1.5.3",
4
4
  "description": "",
5
5
  "main": "dist/useFilter.js",
6
6
  "keywords": [],
@@ -21,27 +21,29 @@
21
21
  "typescript": "^4.3.5"
22
22
  },
23
23
  "files": [
24
+ "dist/lib/getOffsetFromPage.d.ts",
25
+ "dist/lib/getPageFromOffset.d.ts",
26
+ "dist/lib/getPageFromOffset.js",
27
+ "dist/lib/shallowEqual.d.ts",
28
+ "dist/lib/shallowEqual.js",
29
+ "dist/lib/buildDefaultFilterInfo.d.ts",
30
+ "dist/lib/getOffsetFromPage.js",
31
+ "dist/lib/buildDefaultFilterInfo.js",
24
32
  "dist/useFilter.d.ts",
33
+ "dist/useFilter.js",
34
+ "dist/useSimpleFilter.d.ts",
35
+ "dist/useSimpleFilter.js",
36
+ "dist/store/memoryStore.d.ts",
37
+ "dist/store/reduxStore.d.ts",
38
+ "dist/store/localStorageStore.d.ts",
39
+ "dist/store/reduxHelpers/createReducer.d.ts",
25
40
  "dist/store/reduxHelpers/createActions.d.ts",
26
- "dist/store/reduxHelpers/createReducer.js",
27
41
  "dist/store/reduxHelpers/createActions.js",
28
- "dist/store/reduxHelpers/createReducer.d.ts",
29
- "dist/store/reduxStore.d.ts",
42
+ "dist/store/reduxHelpers/createReducer.js",
30
43
  "dist/store/index.d.ts",
31
44
  "dist/store/index.js",
32
45
  "dist/store/localStorageStore.js",
33
46
  "dist/store/memoryStore.js",
34
- "dist/store/reduxStore.js",
35
- "dist/store/memoryStore.d.ts",
36
- "dist/store/localStorageStore.d.ts",
37
- "dist/useFilter.js",
38
- "dist/lib/buildDefaultFilterInfo.js",
39
- "dist/lib/shallowEqual.js",
40
- "dist/lib/getOffsetFromPage.js",
41
- "dist/lib/buildDefaultFilterInfo.d.ts",
42
- "dist/lib/getOffsetFromPage.d.ts",
43
- "dist/lib/getPageFromOffset.js",
44
- "dist/lib/shallowEqual.d.ts",
45
- "dist/lib/getPageFromOffset.d.ts"
47
+ "dist/store/reduxStore.js"
46
48
  ]
47
49
  }