@promoboxx/use-filter 1.3.0 → 1.5.1
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/dist/lib/buildDefaultFilterInfo.js +1 -1
- package/dist/store/index.d.ts +4 -4
- package/dist/store/memoryStore.js +8 -8
- package/dist/useFilter.d.ts +7 -6
- package/dist/useFilter.js +93 -84
- package/dist/useSimpleFilter.d.ts +29 -0
- package/dist/useSimpleFilter.js +135 -0
- package/package.json +18 -16
- package/CHANGELOG.md +0 -63
|
@@ -21,7 +21,7 @@ function buildDefaultFilterInfo(filterInfo) {
|
|
|
21
21
|
var merged = __assign({
|
|
22
22
|
// Cast here to work around "'T' could be instantiated with an arbitrary
|
|
23
23
|
// type which could be unrelated to '{}'"
|
|
24
|
-
filter: {}, sort: undefined, pageSize: 20, lastRefreshAt: new Date().getTime(), totalResults: 1, totalPages: 1, offset: 0, page: 1 }, filterInfo);
|
|
24
|
+
filter: {}, sort: undefined, pageSize: 20, lastRefreshAt: new Date().getTime(), totalResults: 1, totalPages: 1, offset: 0, page: 1, shouldRunImmediately: false }, filterInfo);
|
|
25
25
|
// If there's a page but no offset, set the offset.
|
|
26
26
|
if (filterInfo.page != null && filterInfo.offset == null) {
|
|
27
27
|
merged.offset = getOffsetFromPage_1.default(filterInfo.page, merged.pageSize);
|
package/dist/store/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { FilterInfo } from '../useFilter';
|
|
2
2
|
export interface FilterStore {
|
|
3
|
-
getFilter(namespace: string): FilterInfo<
|
|
4
|
-
saveFilter(namespace: string, filter: FilterInfo<
|
|
5
|
-
getData(namespace: string):
|
|
6
|
-
saveData(namespace: string, data:
|
|
3
|
+
getFilter<TFilter = any>(namespace: string): FilterInfo<TFilter> | null | undefined;
|
|
4
|
+
saveFilter<TFilter = any>(namespace: string, filter: FilterInfo<TFilter>): void;
|
|
5
|
+
getData<TResult = any>(namespace: string): TResult | null | undefined;
|
|
6
|
+
saveData<TResult = any>(namespace: string, data: TResult): void;
|
|
7
7
|
clear(): void;
|
|
8
8
|
}
|
|
9
9
|
export declare function setFilterStore(newStore: FilterStore): void;
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var cachedFilters = {};
|
|
4
|
+
var cachedData = {};
|
|
5
5
|
var memoryStore = {
|
|
6
6
|
getFilter: function (namespace) {
|
|
7
|
-
return
|
|
7
|
+
return cachedFilters[namespace];
|
|
8
8
|
},
|
|
9
9
|
saveFilter: function (namespace, filter) {
|
|
10
|
-
|
|
10
|
+
cachedFilters[namespace] = filter;
|
|
11
11
|
},
|
|
12
12
|
getData: function (namespace) {
|
|
13
|
-
return
|
|
13
|
+
return cachedData[namespace];
|
|
14
14
|
},
|
|
15
15
|
saveData: function (namespace, data) {
|
|
16
|
-
|
|
16
|
+
cachedData[namespace] = data;
|
|
17
17
|
},
|
|
18
18
|
clear: function () {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
cachedFilters = {};
|
|
20
|
+
cachedData = {};
|
|
21
21
|
},
|
|
22
22
|
};
|
|
23
23
|
exports.default = memoryStore;
|
package/dist/useFilter.d.ts
CHANGED
|
@@ -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
|
|
14
|
-
resetFilter()
|
|
15
|
-
setOffset(offset: number | string)
|
|
16
|
-
setPage(page: number | string)
|
|
17
|
-
setSort(sort: string | undefined)
|
|
18
|
-
forceRefresh()
|
|
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;
|
|
19
19
|
};
|
|
20
20
|
export default useFilter;
|
|
21
21
|
export interface FilterInfo<TFilter> {
|
|
@@ -27,6 +27,7 @@ export interface FilterInfo<TFilter> {
|
|
|
27
27
|
lastRefreshAt: number;
|
|
28
28
|
totalResults: number;
|
|
29
29
|
totalPages: number;
|
|
30
|
+
shouldRunImmediately: boolean;
|
|
30
31
|
}
|
|
31
32
|
declare type UseFilterOnChangeResult<TFilter, TResult> = void | {
|
|
32
33
|
filterInfo?: Partial<Omit<FilterInfo<TFilter>, 'totalResults' | 'offset' | 'pageSize'> & {
|
package/dist/useFilter.js
CHANGED
|
@@ -32,31 +32,23 @@ var getPageFromOffset_1 = __importDefault(require("./lib/getPageFromOffset"));
|
|
|
32
32
|
var shallowEqual_1 = __importDefault(require("./lib/shallowEqual"));
|
|
33
33
|
var store_1 = require("./store");
|
|
34
34
|
function useFilter(namespace, options) {
|
|
35
|
-
var _a = react_1.useState(function () {
|
|
35
|
+
var _a = react_1.useState(function () {
|
|
36
|
+
return store_1.getFilterStore().getFilter(namespace);
|
|
37
|
+
}), filterInfo = _a[0], setFilterInfoState = _a[1];
|
|
36
38
|
var _b = react_1.useState(function () {
|
|
37
39
|
return store_1.getFilterStore().getData(namespace);
|
|
38
40
|
}), data = _b[0], setData = _b[1];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
var lastRefreshAt;
|
|
43
|
-
if (skipFetch) {
|
|
44
|
-
lastRefreshAt = previousFilterInfo === null || previousFilterInfo === void 0 ? void 0 : previousFilterInfo.lastRefreshAt;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
lastRefreshAt = new Date().getTime();
|
|
48
|
-
}
|
|
49
|
-
if (!lastRefreshAt) {
|
|
50
|
-
throw new Error();
|
|
51
|
-
}
|
|
52
|
-
return __assign(__assign({}, filterInfo), { lastRefreshAt: lastRefreshAt });
|
|
53
|
-
});
|
|
54
|
-
}, []);
|
|
55
|
-
var ctxRef = react_1.useRef({
|
|
41
|
+
// Having these types of refs helps get around rules of hooks, and they need
|
|
42
|
+
// to be updated each render.
|
|
43
|
+
var ctxRefValue = {
|
|
56
44
|
namespace: namespace,
|
|
57
45
|
onChange: options.onChange,
|
|
58
46
|
debounceDuration: options.debounceDuration,
|
|
59
47
|
defaultFilterInfo: options.defaultFilterInfo,
|
|
48
|
+
};
|
|
49
|
+
var ctxRef = react_1.useRef(ctxRefValue);
|
|
50
|
+
react_1.useEffect(function () {
|
|
51
|
+
ctxRef.current = ctxRefValue;
|
|
60
52
|
});
|
|
61
53
|
var _c = react_1.useState(!filterInfo), isLoading = _c[0], setIsLoading = _c[1];
|
|
62
54
|
var doesFilterExist = react_1.useRef(!!filterInfo);
|
|
@@ -75,7 +67,7 @@ function useFilter(namespace, options) {
|
|
|
75
67
|
// If there is no existing filter info, set it to the defaults and return.
|
|
76
68
|
// This same effect will trigger next go.
|
|
77
69
|
if (!filterInfo) {
|
|
78
|
-
|
|
70
|
+
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: true }));
|
|
79
71
|
return;
|
|
80
72
|
}
|
|
81
73
|
// If the lastRefreshAt hasn't changed, don't make a request.
|
|
@@ -83,7 +75,7 @@ function useFilter(namespace, options) {
|
|
|
83
75
|
setIsLoading(false);
|
|
84
76
|
return;
|
|
85
77
|
}
|
|
86
|
-
var
|
|
78
|
+
var makeRequest = function () {
|
|
87
79
|
lastRefreshAtRef.current = filterInfo.lastRefreshAt;
|
|
88
80
|
var response = ctxRef.current.onChange(filterInfo);
|
|
89
81
|
store_1.getFilterStore().saveFilter(namespace, filterInfo);
|
|
@@ -92,31 +84,35 @@ function useFilter(namespace, options) {
|
|
|
92
84
|
return;
|
|
93
85
|
}
|
|
94
86
|
function handleResponse(response) {
|
|
95
|
-
if (!filterInfo) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
87
|
if (!response) {
|
|
99
88
|
return;
|
|
100
89
|
}
|
|
101
90
|
if (response.filterInfo) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
91
|
+
setFilterInfoState(function (previous) {
|
|
92
|
+
// Even though we've already checked for response.filterInfo, since
|
|
93
|
+
// we're in a callback TypeScript still considers accessing it
|
|
94
|
+
// unsafe, so do another check.
|
|
95
|
+
invariant(!!response.filterInfo, '');
|
|
96
|
+
invariant(previous != null, 'handleResponse called without filterInfo');
|
|
97
|
+
var extra = {};
|
|
98
|
+
var _a = response.filterInfo, page = _a.page, offset = _a.offset, totalResults = _a.totalResults, pageSize = _a.pageSize, filterInfoFromResponse = __rest(_a, ["page", "offset", "totalResults", "pageSize"]);
|
|
99
|
+
var pageSizeNumber = Number(pageSize || previous.pageSize);
|
|
100
|
+
if (page != null && offset == null) {
|
|
101
|
+
extra.offset = getOffsetFromPage_1.default(page, pageSizeNumber);
|
|
102
|
+
extra.page = page;
|
|
103
|
+
// If there's an offset but no page, set the page.
|
|
104
|
+
}
|
|
105
|
+
else if (page == null && offset != null) {
|
|
106
|
+
var offsetNumber = Number(offset);
|
|
107
|
+
extra.offset = offsetNumber;
|
|
108
|
+
extra.page = getPageFromOffset_1.default(offsetNumber, pageSizeNumber);
|
|
109
|
+
}
|
|
110
|
+
if (totalResults) {
|
|
111
|
+
extra.totalResults = Number(totalResults);
|
|
112
|
+
extra.totalPages = Math.ceil(extra.totalResults / pageSizeNumber);
|
|
113
|
+
}
|
|
114
|
+
return __assign(__assign(__assign({}, previous), filterInfoFromResponse), extra);
|
|
115
|
+
});
|
|
120
116
|
}
|
|
121
117
|
if (response.data) {
|
|
122
118
|
setData(response.data);
|
|
@@ -130,62 +126,75 @@ function useFilter(namespace, options) {
|
|
|
130
126
|
handleResponse(response);
|
|
131
127
|
setIsLoading(false);
|
|
132
128
|
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
};
|
|
130
|
+
var timeout = undefined;
|
|
131
|
+
if (filterInfo.shouldRunImmediately) {
|
|
132
|
+
makeRequest();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
timeout = setTimeout(makeRequest, ctxRef.current.debounceDuration != null
|
|
136
|
+
? ctxRef.current.debounceDuration
|
|
137
|
+
: 500);
|
|
138
|
+
}
|
|
136
139
|
return function () {
|
|
137
140
|
if (timeout) {
|
|
138
141
|
clearTimeout(timeout);
|
|
139
142
|
}
|
|
140
143
|
};
|
|
141
|
-
}, [filterInfo,
|
|
144
|
+
}, [filterInfo, namespace]);
|
|
142
145
|
return {
|
|
143
146
|
isLoading: isLoading,
|
|
144
147
|
data: data,
|
|
145
148
|
doesFilterExist: doesFilterExist.current,
|
|
146
149
|
filterInfo: filterInfo || buildDefaultFilterInfo_1.default(options.defaultFilterInfo),
|
|
147
|
-
updateFilter: function (filter) {
|
|
148
|
-
if (
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
150
|
+
updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
|
|
151
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
152
|
+
setFilterInfoState(function (previous) {
|
|
153
|
+
invariant(previous != null, 'updateFilter called without filterInfo');
|
|
154
|
+
var nextFilter = __assign(__assign({}, previous.filter), filter);
|
|
155
|
+
if (shallowEqual_1.default(previous.filter, nextFilter)) {
|
|
156
|
+
return previous;
|
|
157
|
+
}
|
|
158
|
+
return __assign(__assign({}, previous), { offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
159
|
+
});
|
|
160
|
+
}, []),
|
|
161
|
+
resetFilter: react_1.useCallback(function () {
|
|
162
|
+
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: true, lastRefreshAt: new Date().getTime() }));
|
|
163
|
+
}, []),
|
|
164
|
+
setOffset: react_1.useCallback(function (offset) {
|
|
165
|
+
setFilterInfoState(function (previous) {
|
|
166
|
+
invariant(previous != null, 'setOffset called without filterInfo');
|
|
167
|
+
var offsetNumber = Number(offset);
|
|
168
|
+
return __assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime() });
|
|
169
|
+
});
|
|
170
|
+
}, []),
|
|
171
|
+
setPage: react_1.useCallback(function (page) {
|
|
172
|
+
setFilterInfoState(function (previous) {
|
|
173
|
+
invariant(previous != null, 'setPage called without filterInfo');
|
|
174
|
+
var pageNumber = Number(page);
|
|
175
|
+
return __assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime() });
|
|
176
|
+
});
|
|
177
|
+
}, []),
|
|
178
|
+
setSort: react_1.useCallback(function (sort) {
|
|
179
|
+
setFilterInfoState(function (previous) {
|
|
180
|
+
invariant(previous != null, 'setSort called without filterInfo');
|
|
181
|
+
return __assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime() });
|
|
182
|
+
});
|
|
183
|
+
}, []),
|
|
184
|
+
forceRefresh: react_1.useCallback(function () {
|
|
185
|
+
setFilterInfoState(function (previous) {
|
|
186
|
+
invariant(previous != null, 'forceRefresh called without filterInfo');
|
|
187
|
+
return __assign(__assign({}, previous), { lastRefreshAt: new Date().getTime() });
|
|
188
|
+
});
|
|
189
|
+
}, []),
|
|
186
190
|
};
|
|
187
191
|
}
|
|
188
192
|
exports.default = useFilter;
|
|
193
|
+
function invariant(input, message) {
|
|
194
|
+
if (!input) {
|
|
195
|
+
throw new Error("Invariant error: " + message);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
189
198
|
function isPromise(t) {
|
|
190
199
|
return !!(t === null || t === void 0 ? void 0 : t.then);
|
|
191
200
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
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: SimpleFilterInfo<TFilter>;
|
|
17
|
+
debouncedFilterInfo: SimpleFilterInfo<TFilter>;
|
|
18
|
+
updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: any) => void;
|
|
19
|
+
pagingInfo: (total: string | number | null | undefined) => {
|
|
20
|
+
totalResults: number;
|
|
21
|
+
totalPages: number;
|
|
22
|
+
};
|
|
23
|
+
resetFilter: (shouldRunImmediately?: any) => void;
|
|
24
|
+
setOffset: (offset: number | string, shouldRunImmediately?: any) => void;
|
|
25
|
+
setPage: (page: number | string, shouldRunImmediately?: any) => void;
|
|
26
|
+
setSort: (sort: string, shouldRunImmediately?: any) => void;
|
|
27
|
+
forceRefresh: (shouldRunImmediately?: any) => void;
|
|
28
|
+
};
|
|
29
|
+
export default useSimpleFilter;
|
|
@@ -0,0 +1,135 @@
|
|
|
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 () {
|
|
36
|
+
return store_1.getFilterStore().getFilter(namespace) ||
|
|
37
|
+
buildDefaultFilterInfo(options.defaultFilterInfo);
|
|
38
|
+
}), filterInfo = _b[0], setFilterInfoState = _b[1];
|
|
39
|
+
var _c = react_1.useState(filterInfo), debouncedFilterInfo = _c[0], setDebouncedFilterInfo = _c[1];
|
|
40
|
+
// Not sure this is needed in simple mode?
|
|
41
|
+
var lastRefreshAtRef = react_1.useRef(-1);
|
|
42
|
+
react_1.useEffect(function () {
|
|
43
|
+
var _a;
|
|
44
|
+
setIsLoading(true);
|
|
45
|
+
// If the lastRefreshAt hasn't changed, don't do anything.
|
|
46
|
+
if (lastRefreshAtRef.current === filterInfo.lastRefreshAt) {
|
|
47
|
+
setIsLoading(false);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
var timeout = undefined;
|
|
51
|
+
function makeRequest() {
|
|
52
|
+
lastRefreshAtRef.current = filterInfo.lastRefreshAt;
|
|
53
|
+
store_1.getFilterStore().saveFilter(ctxRef.current.namespace, filterInfo);
|
|
54
|
+
setDebouncedFilterInfo(filterInfo);
|
|
55
|
+
setIsLoading(false);
|
|
56
|
+
}
|
|
57
|
+
if (filterInfo.shouldRunImmediately) {
|
|
58
|
+
makeRequest();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
timeout = setTimeout(makeRequest, (_a = ctxRef.current.debounceDuration) !== null && _a !== void 0 ? _a : 500);
|
|
62
|
+
}
|
|
63
|
+
return function () {
|
|
64
|
+
if (timeout) {
|
|
65
|
+
clearTimeout(timeout);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}, [filterInfo]);
|
|
69
|
+
var previousTotalRef = react_1.useRef(0);
|
|
70
|
+
return {
|
|
71
|
+
isLoading: isLoading,
|
|
72
|
+
filterInfo: filterInfo,
|
|
73
|
+
debouncedFilterInfo: debouncedFilterInfo,
|
|
74
|
+
updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
|
|
75
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
76
|
+
setFilterInfoState(function (previous) {
|
|
77
|
+
var nextFilter = __assign(__assign({}, previous.filter), filter);
|
|
78
|
+
if (shallowEqual_1.default(previous.filter, nextFilter)) {
|
|
79
|
+
return previous;
|
|
80
|
+
}
|
|
81
|
+
return __assign(__assign({}, previous), { shouldRunImmediately: shouldRunImmediately, offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter, lastRefreshAt: new Date().getTime() });
|
|
82
|
+
});
|
|
83
|
+
}, []),
|
|
84
|
+
pagingInfo: react_1.useCallback(function (total) {
|
|
85
|
+
var normalized = Number(
|
|
86
|
+
// Because we accept `null` as an argument, we can't do something as
|
|
87
|
+
// simple as `total ?? ...`
|
|
88
|
+
total == null ? previousTotalRef.current : total);
|
|
89
|
+
previousTotalRef.current = normalized;
|
|
90
|
+
return {
|
|
91
|
+
totalResults: normalized,
|
|
92
|
+
totalPages: Math.ceil(normalized / filterInfo.pageSize),
|
|
93
|
+
};
|
|
94
|
+
}, [filterInfo.pageSize]),
|
|
95
|
+
resetFilter: react_1.useCallback(function (shouldRunImmediately) {
|
|
96
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
97
|
+
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: shouldRunImmediately }));
|
|
98
|
+
}, []),
|
|
99
|
+
setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
|
|
100
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
101
|
+
var offsetNumber = Number(offset);
|
|
102
|
+
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
103
|
+
}, []),
|
|
104
|
+
setPage: react_1.useCallback(function (page, shouldRunImmediately) {
|
|
105
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
106
|
+
var pageNumber = Number(page);
|
|
107
|
+
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
108
|
+
}, []),
|
|
109
|
+
setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
|
|
110
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
111
|
+
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
112
|
+
}, []),
|
|
113
|
+
forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
|
|
114
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
115
|
+
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
116
|
+
}, []),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function buildDefaultFilterInfo(filterInfo) {
|
|
120
|
+
if (filterInfo === void 0) { filterInfo = {}; }
|
|
121
|
+
var merged = __assign({
|
|
122
|
+
// Cast here to work around "'T' could be instantiated with an arbitrary
|
|
123
|
+
// type which could be unrelated to '{}'"
|
|
124
|
+
filter: {}, sort: undefined, pageSize: 20, lastRefreshAt: new Date().getTime(), offset: 0, page: 1, shouldRunImmediately: false }, filterInfo);
|
|
125
|
+
// If there's a page but no offset, set the offset.
|
|
126
|
+
if (filterInfo.page != null && filterInfo.offset == null) {
|
|
127
|
+
merged.offset = getOffsetFromPage_1.default(filterInfo.page, merged.pageSize);
|
|
128
|
+
// If there's an offset but no page, set the page.
|
|
129
|
+
}
|
|
130
|
+
else if (filterInfo.page == null && filterInfo.offset != null) {
|
|
131
|
+
merged.page = getPageFromOffset_1.default(filterInfo.offset, merged.pageSize);
|
|
132
|
+
}
|
|
133
|
+
return merged;
|
|
134
|
+
}
|
|
135
|
+
exports.default = useSimpleFilter;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@promoboxx/use-filter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
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.
|
|
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
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
|
-
|
|
5
|
-
## 1.3.0 (2021-07-18)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
### Features
|
|
9
|
-
|
|
10
|
-
* Redux store ([#5](https://github.com/promoboxx/use-filter/issues/5)) ([f92bee6](https://github.com/promoboxx/use-filter/commit/f92bee6417f78117ab9ca4936c23b24647aac008))
|
|
11
|
-
|
|
12
|
-
### 1.2.1 (2021-07-17)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
### Bug Fixes
|
|
16
|
-
|
|
17
|
-
* some git stuff is needed ([2bb0f21](https://github.com/promoboxx/use-filter/commit/2bb0f2117c79fd1ba0b6a309db4234caf162f57b))
|
|
18
|
-
|
|
19
|
-
## 1.2.0 (2021-07-16)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
### Features
|
|
23
|
-
|
|
24
|
-
* Add localStorageStore ([#4](https://github.com/promoboxx/use-filter/issues/4)) ([a6087e2](https://github.com/promoboxx/use-filter/commit/a6087e2f07a3640799b840e128b96838cd8ef150))
|
|
25
|
-
|
|
26
|
-
## 1.1.0 (2021-07-16)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
### Features
|
|
30
|
-
|
|
31
|
-
* Add concept of data to useFilter ([#2](https://github.com/promoboxx/use-filter/issues/2)) ([563c5a9](https://github.com/promoboxx/use-filter/commit/563c5a959cdc22a0f8eba9dbb3dde7802df02b46))
|
|
32
|
-
|
|
33
|
-
### 1.0.6 (2021-07-16)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
### Bug Fixes
|
|
37
|
-
|
|
38
|
-
* dont deploy test files ([500151c](https://github.com/promoboxx/use-filter/commit/500151c04f75139c71baf29b2ad2dccefcd57db7))
|
|
39
|
-
|
|
40
|
-
### 1.0.5 (2021-07-16)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
### Bug Fixes
|
|
44
|
-
|
|
45
|
-
* declaration files ([4ce29e4](https://github.com/promoboxx/use-filter/commit/4ce29e43469ad4ade2d222c3b09f38ad8f89ca4c))
|
|
46
|
-
|
|
47
|
-
### 1.0.4 (2021-07-16)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
### Bug Fixes
|
|
51
|
-
|
|
52
|
-
* more release prep ([daf06ac](https://github.com/promoboxx/use-filter/commit/daf06acc94668fdc7f0905c120f5541b4b2d16e9))
|
|
53
|
-
|
|
54
|
-
### 1.0.3 (2021-07-16)
|
|
55
|
-
|
|
56
|
-
### 1.0.2 (2021-07-16)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
### Bug Fixes
|
|
60
|
-
|
|
61
|
-
* proper secrets syntax ([afc9fe9](https://github.com/promoboxx/use-filter/commit/afc9fe9b177dda2961d82858ef43cc481f762950))
|
|
62
|
-
|
|
63
|
-
### 1.0.1 (2021-07-16)
|