@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.
- package/dist/useFilter.d.ts +6 -6
- package/dist/useFilter.js +15 -10
- package/dist/useSimpleFilter.d.ts +45 -0
- package/dist/useSimpleFilter.js +133 -0
- package/package.json +18 -16
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>, shouldRunImmediately?:
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
}
|