@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.
@@ -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>) => MaybePromise<UseFilterOnChangeResult<TFilter, TResult>>;
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;
@@ -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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promoboxx/use-filter",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "",
5
5
  "main": "dist/useFilter.js",
6
6
  "keywords": [],