@promoboxx/use-filter 1.6.0 → 1.8.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/dist/useFilter.d.ts +6 -1
- package/dist/useFilter.js +22 -2
- package/dist/useSimpleFilter.d.ts +6 -0
- package/dist/useSimpleFilter.js +14 -0
- package/package.json +1 -1
package/dist/useFilter.d.ts
CHANGED
|
@@ -2,20 +2,23 @@ declare type MaybePromise<T> = T | Promise<T>;
|
|
|
2
2
|
interface UseFilterOptions<TFilter, TResult> {
|
|
3
3
|
defaultFilterInfo?: Partial<FilterInfo<TFilter>>;
|
|
4
4
|
shouldForceRunOnMount?: boolean;
|
|
5
|
-
onChange: (filterInfo: FilterInfo<TFilter
|
|
5
|
+
onChange: (filterInfo: FilterInfo<TFilter>, reason: UseFilterUpdateReason) => MaybePromise<UseFilterOnChangeResult<TFilter, TResult>>;
|
|
6
6
|
debounceDuration?: number;
|
|
7
7
|
}
|
|
8
|
+
export declare type UseFilterUpdateReason = 'initial' | 'filter' | 'pagination';
|
|
8
9
|
declare function useFilter<TFilter, TResult>(namespace: string, options: UseFilterOptions<TFilter, TResult>): {
|
|
9
10
|
isLoading: boolean;
|
|
10
11
|
data: TResult | null | undefined;
|
|
11
12
|
doesFilterExist: boolean;
|
|
12
13
|
filterInfo: FilterInfo<TFilter>;
|
|
14
|
+
updateReason: UseFilterUpdateReason;
|
|
13
15
|
updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: boolean) => void;
|
|
14
16
|
resetFilter: (shouldRunImmediately?: boolean) => void;
|
|
15
17
|
setOffset: (offset: number | string, shouldRunImmediately?: boolean) => void;
|
|
16
18
|
setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
|
|
17
19
|
setPageSize: (pageSize: number | string, shouldRunImmediately?: boolean) => void;
|
|
18
20
|
setSort: (sort: string | undefined, shouldRunImmediately?: boolean) => void;
|
|
21
|
+
setCursor: (cursor: string | null | undefined, shouldRunImmediately?: boolean) => void;
|
|
19
22
|
forceRefresh: (shouldRunImmediately?: boolean) => void;
|
|
20
23
|
};
|
|
21
24
|
export default useFilter;
|
|
@@ -29,6 +32,8 @@ export interface FilterInfo<TFilter> {
|
|
|
29
32
|
totalResults: number;
|
|
30
33
|
totalPages: number;
|
|
31
34
|
shouldRunImmediately: boolean;
|
|
35
|
+
cursor?: string | null;
|
|
36
|
+
nextCursor?: string | null;
|
|
32
37
|
}
|
|
33
38
|
declare type UseFilterOnChangeResult<TFilter, TResult> = void | {
|
|
34
39
|
filterInfo?: Partial<Omit<FilterInfo<TFilter>, 'totalResults' | 'offset' | 'pageSize'> & {
|
package/dist/useFilter.js
CHANGED
|
@@ -64,6 +64,7 @@ function useFilter(namespace, options) {
|
|
|
64
64
|
: filterInfo
|
|
65
65
|
? filterInfo.lastRefreshAt
|
|
66
66
|
: -1);
|
|
67
|
+
var updateReasonRef = react_1.useRef('initial');
|
|
67
68
|
// Call onChange when data changes.
|
|
68
69
|
react_1.useEffect(function () {
|
|
69
70
|
setIsLoading(true);
|
|
@@ -80,7 +81,7 @@ function useFilter(namespace, options) {
|
|
|
80
81
|
}
|
|
81
82
|
var makeRequest = function () {
|
|
82
83
|
lastRefreshAtRef.current = filterInfo.lastRefreshAt;
|
|
83
|
-
var response = ctxRef.current.onChange(filterInfo);
|
|
84
|
+
var response = ctxRef.current.onChange(filterInfo, updateReasonRef.current);
|
|
84
85
|
store_1.getFilterStore().saveFilter(namespace, filterInfo);
|
|
85
86
|
if (!response) {
|
|
86
87
|
setIsLoading(false);
|
|
@@ -98,7 +99,7 @@ function useFilter(namespace, options) {
|
|
|
98
99
|
invariant(!!response.filterInfo, '');
|
|
99
100
|
invariant(previous != null, 'handleResponse called without filterInfo');
|
|
100
101
|
var extra = {};
|
|
101
|
-
var _a = response.filterInfo, page = _a.page, offset = _a.offset, totalResults = _a.totalResults, pageSize = _a.pageSize, filterInfoFromResponse = __rest(_a, ["page", "offset", "totalResults", "pageSize"]);
|
|
102
|
+
var _a = response.filterInfo, page = _a.page, offset = _a.offset, totalResults = _a.totalResults, pageSize = _a.pageSize, nextCursor = _a.nextCursor, filterInfoFromResponse = __rest(_a, ["page", "offset", "totalResults", "pageSize", "nextCursor"]);
|
|
102
103
|
var pageSizeNumber = Number(pageSize || previous.pageSize);
|
|
103
104
|
if (page != null && offset == null) {
|
|
104
105
|
extra.offset = getOffsetFromPage_1.default(page, pageSizeNumber);
|
|
@@ -114,6 +115,9 @@ function useFilter(namespace, options) {
|
|
|
114
115
|
extra.totalResults = Number(totalResults);
|
|
115
116
|
extra.totalPages = Math.ceil(extra.totalResults / pageSizeNumber);
|
|
116
117
|
}
|
|
118
|
+
if (nextCursor) {
|
|
119
|
+
extra.nextCursor = nextCursor;
|
|
120
|
+
}
|
|
117
121
|
return __assign(__assign(__assign({}, previous), filterInfoFromResponse), extra);
|
|
118
122
|
});
|
|
119
123
|
}
|
|
@@ -150,8 +154,10 @@ function useFilter(namespace, options) {
|
|
|
150
154
|
data: data,
|
|
151
155
|
doesFilterExist: doesFilterExist.current,
|
|
152
156
|
filterInfo: filterInfo || buildDefaultFilterInfo_1.default(options.defaultFilterInfo),
|
|
157
|
+
updateReason: updateReasonRef.current,
|
|
153
158
|
updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
|
|
154
159
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
160
|
+
updateReasonRef.current = 'filter';
|
|
155
161
|
setFilterInfoState(function (previous) {
|
|
156
162
|
invariant(previous != null, 'updateFilter called without filterInfo');
|
|
157
163
|
var nextFilter = __assign(__assign({}, previous.filter), filter);
|
|
@@ -163,10 +169,12 @@ function useFilter(namespace, options) {
|
|
|
163
169
|
}, []),
|
|
164
170
|
resetFilter: react_1.useCallback(function (shouldRunImmediately) {
|
|
165
171
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
172
|
+
updateReasonRef.current = 'filter';
|
|
166
173
|
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately }));
|
|
167
174
|
}, []),
|
|
168
175
|
setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
|
|
169
176
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
177
|
+
updateReasonRef.current = 'pagination';
|
|
170
178
|
setFilterInfoState(function (previous) {
|
|
171
179
|
invariant(previous != null, 'setOffset called without filterInfo');
|
|
172
180
|
var offsetNumber = Number(offset);
|
|
@@ -175,6 +183,7 @@ function useFilter(namespace, options) {
|
|
|
175
183
|
}, []),
|
|
176
184
|
setPage: react_1.useCallback(function (page, shouldRunImmediately) {
|
|
177
185
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
186
|
+
updateReasonRef.current = 'pagination';
|
|
178
187
|
setFilterInfoState(function (previous) {
|
|
179
188
|
invariant(previous != null, 'setPage called without filterInfo');
|
|
180
189
|
var pageNumber = Number(page);
|
|
@@ -183,6 +192,7 @@ function useFilter(namespace, options) {
|
|
|
183
192
|
}, []),
|
|
184
193
|
setPageSize: react_1.useCallback(function (pageSize, shouldRunImmediately) {
|
|
185
194
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
195
|
+
updateReasonRef.current = 'pagination';
|
|
186
196
|
setFilterInfoState(function (previous) {
|
|
187
197
|
invariant(previous != null, 'setPageSize called without filterInfo');
|
|
188
198
|
var pageSizeNumber = Number(pageSize);
|
|
@@ -193,13 +203,23 @@ function useFilter(namespace, options) {
|
|
|
193
203
|
}, []),
|
|
194
204
|
setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
|
|
195
205
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
206
|
+
updateReasonRef.current = 'filter';
|
|
196
207
|
setFilterInfoState(function (previous) {
|
|
197
208
|
invariant(previous != null, 'setSort called without filterInfo');
|
|
198
209
|
return __assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
199
210
|
});
|
|
200
211
|
}, []),
|
|
212
|
+
setCursor: react_1.useCallback(function (cursor, shouldRunImmediately) {
|
|
213
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
214
|
+
setFilterInfoState(function (previous) {
|
|
215
|
+
updateReasonRef.current = 'pagination';
|
|
216
|
+
invariant(previous != null, 'setCursor called without filterInfo');
|
|
217
|
+
return __assign(__assign({}, previous), { cursor: cursor, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
218
|
+
});
|
|
219
|
+
}, []),
|
|
201
220
|
forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
|
|
202
221
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
222
|
+
updateReasonRef.current = 'filter';
|
|
203
223
|
setFilterInfoState(function (previous) {
|
|
204
224
|
invariant(previous != null, 'forceRefresh called without filterInfo');
|
|
205
225
|
return __assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UseFilterUpdateReason } from './useFilter';
|
|
1
2
|
export interface SimpleFilterInfo<TFilter> {
|
|
2
3
|
filter: TFilter;
|
|
3
4
|
sort?: string;
|
|
@@ -5,6 +6,7 @@ export interface SimpleFilterInfo<TFilter> {
|
|
|
5
6
|
page: number;
|
|
6
7
|
pageSize: number;
|
|
7
8
|
lastRefreshAt: number;
|
|
9
|
+
cursor?: string | null;
|
|
8
10
|
shouldRunImmediately: boolean;
|
|
9
11
|
}
|
|
10
12
|
interface UseSimpleFilterOptions<TFilter> {
|
|
@@ -21,6 +23,7 @@ declare function useSimpleFilter<TFilter>(namespace: string, options: UseSimpleF
|
|
|
21
23
|
page: number;
|
|
22
24
|
pageSize: number;
|
|
23
25
|
lastRefreshAt: number;
|
|
26
|
+
cursor?: string | null | undefined;
|
|
24
27
|
};
|
|
25
28
|
debouncedFilterInfo: {
|
|
26
29
|
shouldRunImmediately: boolean;
|
|
@@ -30,7 +33,9 @@ declare function useSimpleFilter<TFilter>(namespace: string, options: UseSimpleF
|
|
|
30
33
|
page: number;
|
|
31
34
|
pageSize: number;
|
|
32
35
|
lastRefreshAt: number;
|
|
36
|
+
cursor?: string | null | undefined;
|
|
33
37
|
};
|
|
38
|
+
updateReason: UseFilterUpdateReason;
|
|
34
39
|
updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: any) => void;
|
|
35
40
|
pagingInfo: (total: string | number | null | undefined) => {
|
|
36
41
|
totalResults: number;
|
|
@@ -41,6 +46,7 @@ declare function useSimpleFilter<TFilter>(namespace: string, options: UseSimpleF
|
|
|
41
46
|
setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
|
|
42
47
|
setPageSize: (pageSize: number | string, shouldRunImmediately?: boolean) => void;
|
|
43
48
|
setSort: (sort: string, shouldRunImmediately?: boolean) => void;
|
|
49
|
+
setCursor: (cursor: string | null | undefined, shouldRunImmediately?: boolean) => void;
|
|
44
50
|
forceRefresh: (shouldRunImmediately?: boolean) => void;
|
|
45
51
|
};
|
|
46
52
|
export default useSimpleFilter;
|
package/dist/useSimpleFilter.js
CHANGED
|
@@ -37,6 +37,7 @@ function useSimpleFilter(namespace, options) {
|
|
|
37
37
|
var _c = react_1.useState(filterInfo), debouncedFilterInfo = _c[0], setDebouncedFilterInfo = _c[1];
|
|
38
38
|
// Not sure this is needed in simple mode?
|
|
39
39
|
var lastRefreshAtRef = react_1.useRef(-1);
|
|
40
|
+
var updateReasonRef = react_1.useRef('initial');
|
|
40
41
|
react_1.useEffect(function () {
|
|
41
42
|
var _a;
|
|
42
43
|
setIsLoading(true);
|
|
@@ -69,8 +70,10 @@ function useSimpleFilter(namespace, options) {
|
|
|
69
70
|
isLoading: isLoading,
|
|
70
71
|
filterInfo: filterInfo,
|
|
71
72
|
debouncedFilterInfo: debouncedFilterInfo,
|
|
73
|
+
updateReason: updateReasonRef.current,
|
|
72
74
|
updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
|
|
73
75
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
76
|
+
updateReasonRef.current = 'filter';
|
|
74
77
|
setFilterInfoState(function (previous) {
|
|
75
78
|
var nextFilter = __assign(__assign({}, previous.filter), filter);
|
|
76
79
|
if (shallowEqual_1.default(previous.filter, nextFilter)) {
|
|
@@ -92,20 +95,24 @@ function useSimpleFilter(namespace, options) {
|
|
|
92
95
|
}, [filterInfo.pageSize]),
|
|
93
96
|
resetFilter: react_1.useCallback(function (shouldRunImmediately) {
|
|
94
97
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
98
|
+
updateReasonRef.current = 'filter';
|
|
95
99
|
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: shouldRunImmediately }));
|
|
96
100
|
}, []),
|
|
97
101
|
setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
|
|
98
102
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
103
|
+
updateReasonRef.current = 'pagination';
|
|
99
104
|
var offsetNumber = Number(offset);
|
|
100
105
|
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
101
106
|
}, []),
|
|
102
107
|
setPage: react_1.useCallback(function (page, shouldRunImmediately) {
|
|
103
108
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
109
|
+
updateReasonRef.current = 'pagination';
|
|
104
110
|
var pageNumber = Number(page);
|
|
105
111
|
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
106
112
|
}, []),
|
|
107
113
|
setPageSize: react_1.useCallback(function (pageSize, shouldRunImmediately) {
|
|
108
114
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
115
|
+
updateReasonRef.current = 'pagination';
|
|
109
116
|
setFilterInfoState(function (previous) {
|
|
110
117
|
var pageSizeNumber = Number(pageSize);
|
|
111
118
|
var page = getPageFromOffset_1.default(previous.offset, pageSizeNumber);
|
|
@@ -115,10 +122,17 @@ function useSimpleFilter(namespace, options) {
|
|
|
115
122
|
}, []),
|
|
116
123
|
setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
|
|
117
124
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
125
|
+
updateReasonRef.current = 'filter';
|
|
118
126
|
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
119
127
|
}, []),
|
|
128
|
+
setCursor: react_1.useCallback(function (cursor, shouldRunImmediately) {
|
|
129
|
+
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
130
|
+
updateReasonRef.current = 'pagination';
|
|
131
|
+
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { cursor: cursor, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
132
|
+
}, []),
|
|
120
133
|
forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
|
|
121
134
|
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
135
|
+
updateReasonRef.current = 'filter';
|
|
122
136
|
setFilterInfoState(function (previous) { return (__assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately })); });
|
|
123
137
|
}, []),
|
|
124
138
|
};
|