@promoboxx/use-filter 1.11.2 → 2.0.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/cjs/_virtual/_rolldown/runtime.js +29 -0
- package/dist/cjs/lib/buildDefaultFilterInfo.d.ts +5 -0
- package/dist/cjs/lib/buildDefaultFilterInfo.js +27 -0
- package/dist/{lib → cjs/lib}/getOffsetFromPage.d.ts +2 -1
- package/dist/cjs/lib/getOffsetFromPage.js +8 -0
- package/dist/{lib → cjs/lib}/getPageFromOffset.d.ts +2 -1
- package/dist/cjs/lib/getPageFromOffset.js +8 -0
- package/dist/{lib → cjs/lib}/shallowEqual.d.ts +2 -1
- package/dist/cjs/lib/shallowEqual.js +24 -0
- package/dist/cjs/store/index.d.ts +14 -0
- package/dist/cjs/store/index.js +18 -0
- package/dist/cjs/store/localStorageStore.d.ts +5 -0
- package/dist/cjs/store/localStorageStore.js +33 -0
- package/dist/cjs/store/memoryStore.d.ts +5 -0
- package/dist/cjs/store/memoryStore.js +25 -0
- package/dist/cjs/store/reduxHelpers/createActions.d.ts +16 -0
- package/dist/cjs/store/reduxHelpers/createActions.js +16 -0
- package/dist/cjs/store/reduxHelpers/createReducer.d.ts +10 -0
- package/dist/cjs/store/reduxHelpers/createReducer.js +25 -0
- package/dist/cjs/store/reduxStore.d.ts +18 -0
- package/dist/cjs/store/reduxStore.js +63 -0
- package/dist/cjs/store/urlParamStore.d.ts +8 -0
- package/dist/cjs/store/urlParamStore.js +68 -0
- package/dist/cjs/useFilter.d.ts +106 -0
- package/dist/cjs/useFilter.js +251 -0
- package/dist/cjs/useSimpleFilter.d.ts +89 -0
- package/dist/cjs/useSimpleFilter.js +198 -0
- package/dist/esm/lib/buildDefaultFilterInfo.d.mts +6 -0
- package/dist/esm/lib/buildDefaultFilterInfo.mjs +27 -0
- package/dist/esm/lib/getOffsetFromPage.d.mts +4 -0
- package/dist/esm/lib/getOffsetFromPage.mjs +7 -0
- package/dist/esm/lib/getPageFromOffset.d.mts +4 -0
- package/dist/esm/lib/getPageFromOffset.mjs +7 -0
- package/dist/esm/lib/shallowEqual.d.mts +4 -0
- package/dist/esm/lib/shallowEqual.mjs +23 -0
- package/dist/esm/store/index.d.mts +14 -0
- package/dist/esm/store/index.mjs +15 -0
- package/dist/esm/store/localStorageStore.d.mts +6 -0
- package/dist/esm/store/localStorageStore.mjs +32 -0
- package/dist/esm/store/memoryStore.d.mts +6 -0
- package/dist/esm/store/memoryStore.mjs +24 -0
- package/dist/esm/store/reduxHelpers/createActions.d.mts +16 -0
- package/dist/esm/store/reduxHelpers/createActions.mjs +15 -0
- package/dist/esm/store/reduxHelpers/createReducer.d.mts +11 -0
- package/dist/esm/store/reduxHelpers/createReducer.mjs +24 -0
- package/dist/esm/store/reduxStore.d.mts +18 -0
- package/dist/esm/store/reduxStore.mjs +61 -0
- package/dist/esm/store/urlParamStore.d.mts +8 -0
- package/dist/esm/store/urlParamStore.mjs +63 -0
- package/dist/esm/useFilter.d.mts +106 -0
- package/dist/esm/useFilter.mjs +251 -0
- package/dist/esm/useSimpleFilter.d.mts +89 -0
- package/dist/esm/useSimpleFilter.mjs +198 -0
- package/package.json +33 -43
- package/dist/lib/buildDefaultFilterInfo.d.ts +0 -3
- package/dist/lib/buildDefaultFilterInfo.js +0 -35
- package/dist/lib/getOffsetFromPage.js +0 -6
- package/dist/lib/getPageFromOffset.js +0 -6
- package/dist/lib/shallowEqual.js +0 -23
- package/dist/store/index.d.ts +0 -10
- package/dist/store/index.js +0 -16
- package/dist/store/localStorageStore.d.ts +0 -3
- package/dist/store/localStorageStore.js +0 -31
- package/dist/store/memoryStore.d.ts +0 -3
- package/dist/store/memoryStore.js +0 -23
- package/dist/store/reduxHelpers/createActions.d.ts +0 -16
- package/dist/store/reduxHelpers/createActions.js +0 -27
- package/dist/store/reduxHelpers/createReducer.d.ts +0 -8
- package/dist/store/reduxHelpers/createReducer.js +0 -26
- package/dist/store/reduxStore.d.ts +0 -15
- package/dist/store/reduxStore.js +0 -67
- package/dist/store/urlParamStore.d.ts +0 -4
- package/dist/store/urlParamStore.js +0 -91
- package/dist/useFilter.d.ts +0 -103
- package/dist/useFilter.js +0 -254
- package/dist/useSimpleFilter.d.ts +0 -86
- package/dist/useSimpleFilter.js +0 -173
package/dist/store/reduxStore.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
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
|
-
exports.useFilterReduxReducer = exports.createReduxStore = void 0;
|
|
18
|
-
var createActions_1 = __importDefault(require("./reduxHelpers/createActions"));
|
|
19
|
-
var createReducer_1 = __importDefault(require("./reduxHelpers/createReducer"));
|
|
20
|
-
function createReduxStore(config) {
|
|
21
|
-
var reduxStoreStore = {
|
|
22
|
-
getFilter: function (namespace) {
|
|
23
|
-
return config.store.getState().useFilter.filters[namespace];
|
|
24
|
-
},
|
|
25
|
-
saveFilter: function (namespace, filter) {
|
|
26
|
-
config.store.dispatch(actions.saveFilter(namespace, filter));
|
|
27
|
-
},
|
|
28
|
-
getData: function (namespace) {
|
|
29
|
-
return config.store.getState().useFilter.data[namespace];
|
|
30
|
-
},
|
|
31
|
-
saveData: function (namespace, data) {
|
|
32
|
-
config.store.dispatch(actions.saveData(namespace, data));
|
|
33
|
-
},
|
|
34
|
-
clear: function () {
|
|
35
|
-
config.store.dispatch(actions.clear());
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
return reduxStoreStore;
|
|
39
|
-
}
|
|
40
|
-
exports.createReduxStore = createReduxStore;
|
|
41
|
-
var actions = createActions_1.default('useFilter', {
|
|
42
|
-
saveData: function (namespace, data) { return ({
|
|
43
|
-
namespace: namespace,
|
|
44
|
-
data: data,
|
|
45
|
-
}); },
|
|
46
|
-
saveFilter: function (namespace, filter) { return ({
|
|
47
|
-
namespace: namespace,
|
|
48
|
-
filter: filter,
|
|
49
|
-
}); },
|
|
50
|
-
clear: function () { return undefined; },
|
|
51
|
-
});
|
|
52
|
-
var initialState = {
|
|
53
|
-
data: {},
|
|
54
|
-
filters: {},
|
|
55
|
-
};
|
|
56
|
-
exports.useFilterReduxReducer = createReducer_1.default(initialState, function (builder) {
|
|
57
|
-
builder
|
|
58
|
-
.addHandler(actions.saveFilter, function (state, action) {
|
|
59
|
-
var _a;
|
|
60
|
-
return (__assign(__assign({}, state), { filters: __assign(__assign({}, state.filters), (_a = {}, _a[action.payload.namespace] = action.payload.filter, _a)) }));
|
|
61
|
-
})
|
|
62
|
-
.addHandler(actions.saveData, function (state, action) {
|
|
63
|
-
var _a;
|
|
64
|
-
return (__assign(__assign({}, state), { data: __assign(__assign({}, state.data), (_a = {}, _a[action.payload.namespace] = action.payload.data, _a)) }));
|
|
65
|
-
})
|
|
66
|
-
.addHandler(actions.clear, function (state) { return (__assign(__assign({}, state), { filters: {}, data: {} })); });
|
|
67
|
-
});
|
|
@@ -1,91 +0,0 @@
|
|
|
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 __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
25
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
26
|
-
};
|
|
27
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.naivelyParseExistingParams = exports.replaceQueryParams = exports.createUrlParamStore = void 0;
|
|
29
|
-
var qs_1 = __importDefault(require("qs"));
|
|
30
|
-
var createUrlParamStore = function () {
|
|
31
|
-
var urlParamStore = {
|
|
32
|
-
getFilter: function (namespace) {
|
|
33
|
-
var parsed = naivelyParseExistingParams();
|
|
34
|
-
var parsedInfo = parsed["info." + namespace];
|
|
35
|
-
var parsedFilter = parsed["filter." + namespace];
|
|
36
|
-
// useFilter doesn't really support returning a partial FilterInfo, so both
|
|
37
|
-
// need to be present,
|
|
38
|
-
if (parsedInfo || parsedFilter) {
|
|
39
|
-
var _a = parsedInfo || {}, page = _a.page, offset = _a.offset, pageSize = _a.pageSize, rest = __rest(_a, ["page", "offset", "pageSize"]);
|
|
40
|
-
return __assign(__assign({}, __assign({ page: 1 / page ? +page : undefined, pageSize: 1 / pageSize ? +pageSize : undefined, offset: 1 / offset ? +offset : undefined }, rest)), { filter: parsedFilter });
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
saveFilter: function (namespace, filterInfo) {
|
|
44
|
-
var parsed = naivelyParseExistingParams();
|
|
45
|
-
// Setting the params to the equivalent of { [namespace]: filterInfo }
|
|
46
|
-
// takes up more room. The idea is that this ...
|
|
47
|
-
// 'filter.filterName%5BfilterValueKey%5D=filterValueValue'
|
|
48
|
-
// ... is smaller than ...
|
|
49
|
-
// filterName%5Bfilter%5D%5BfilterValueKey%5D=filterValueValue
|
|
50
|
-
// ... by 5 characters per value in a filter. So excuse us for a second ...
|
|
51
|
-
var clonedInfo = __assign({}, filterInfo);
|
|
52
|
-
var clonedFilter = filterInfo.filter;
|
|
53
|
-
delete clonedInfo.filter;
|
|
54
|
-
delete clonedInfo.lastRefreshAt;
|
|
55
|
-
delete clonedInfo.shouldRunImmediately;
|
|
56
|
-
delete clonedInfo.totalResults;
|
|
57
|
-
delete clonedInfo.totalPages;
|
|
58
|
-
delete clonedInfo.nextCursor;
|
|
59
|
-
parsed["filter." + namespace] = clonedFilter;
|
|
60
|
-
parsed["info." + namespace] = clonedInfo;
|
|
61
|
-
replaceQueryParams(qs_1.default.stringify(parsed));
|
|
62
|
-
},
|
|
63
|
-
clear: function () {
|
|
64
|
-
var parsed = naivelyParseExistingParams();
|
|
65
|
-
for (var key in parsed) {
|
|
66
|
-
if (key.startsWith('filter.') || key.startsWith('info.')) {
|
|
67
|
-
delete parsed[key];
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
replaceQueryParams(qs_1.default.stringify(parsed));
|
|
71
|
-
},
|
|
72
|
-
getData: function () {
|
|
73
|
-
return undefined;
|
|
74
|
-
},
|
|
75
|
-
saveData: function () { },
|
|
76
|
-
};
|
|
77
|
-
return urlParamStore;
|
|
78
|
-
};
|
|
79
|
-
exports.createUrlParamStore = createUrlParamStore;
|
|
80
|
-
function replaceQueryParams(newParams) {
|
|
81
|
-
var nextUrl = new URL(window.location.toString());
|
|
82
|
-
nextUrl.search = newParams;
|
|
83
|
-
window.history.replaceState(undefined, '', nextUrl.toString());
|
|
84
|
-
}
|
|
85
|
-
exports.replaceQueryParams = replaceQueryParams;
|
|
86
|
-
function naivelyParseExistingParams() {
|
|
87
|
-
// Don't really want to do any casting, especially not to `any`, but the type
|
|
88
|
-
// of `qs.parse` is so wide we'd have to litter checks all over the place.
|
|
89
|
-
return qs_1.default.parse(window.location.search.substring(1));
|
|
90
|
-
}
|
|
91
|
-
exports.naivelyParseExistingParams = naivelyParseExistingParams;
|
package/dist/useFilter.d.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { FilterStore } from './store';
|
|
2
|
-
declare type MaybePromise<T> = T | Promise<T>;
|
|
3
|
-
interface UseFilterOptions<TFilter, TResult> {
|
|
4
|
-
/**
|
|
5
|
-
* Default values for your filter. When calling `.reset` your filter will be
|
|
6
|
-
* set to this.
|
|
7
|
-
* Changing these values does not cause a call to happen.
|
|
8
|
-
*/
|
|
9
|
-
defaultFilterInfo?: Partial<FilterInfo<TFilter>>;
|
|
10
|
-
/**
|
|
11
|
-
* Enable this if you are not using the data caching of this hook.
|
|
12
|
-
*/
|
|
13
|
-
shouldForceRunOnMount?: boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Called whenever the filter changes.
|
|
16
|
-
*/
|
|
17
|
-
onChange: (filterInfo: FilterInfo<TFilter>, reason: UseFilterUpdateReason) => MaybePromise<UseFilterOnChangeResult<TFilter, TResult>>;
|
|
18
|
-
/**
|
|
19
|
-
* In case you want to change the default debounce duration.
|
|
20
|
-
*/
|
|
21
|
-
debounceDuration?: number;
|
|
22
|
-
onBeforeSaveFilter?: (filterInfo: FilterInfo<TFilter>) => FilterInfo<TFilter>;
|
|
23
|
-
store?: FilterStore;
|
|
24
|
-
}
|
|
25
|
-
export interface FilterApi<TFilter, TResult> {
|
|
26
|
-
/**
|
|
27
|
-
* Whether the system is debouncing or waiting for your `onChange` to finish.
|
|
28
|
-
*/
|
|
29
|
-
isLoading: boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Any cached data for this filter.
|
|
32
|
-
*/
|
|
33
|
-
data: TResult | null | undefined;
|
|
34
|
-
/**
|
|
35
|
-
* Access to the filter and its metadata.
|
|
36
|
-
*/
|
|
37
|
-
filterInfo: FilterInfo<TFilter>;
|
|
38
|
-
/**
|
|
39
|
-
* Whether the filter existed in the system when the component mounted.
|
|
40
|
-
* @deprecated
|
|
41
|
-
*/
|
|
42
|
-
doesFilterExist: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Why the last update happened.
|
|
45
|
-
*/
|
|
46
|
-
updateReason: UseFilterUpdateReason;
|
|
47
|
-
/**
|
|
48
|
-
* Update one or more values in your filter.
|
|
49
|
-
*/
|
|
50
|
-
updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: boolean) => void;
|
|
51
|
-
/**
|
|
52
|
-
* Resets the filter back to `defaultFilterInfo`.
|
|
53
|
-
*/
|
|
54
|
-
resetFilter: (shouldRunImmediately?: boolean) => void;
|
|
55
|
-
/**
|
|
56
|
-
* Changes the offset. Will update `page`.
|
|
57
|
-
*/
|
|
58
|
-
setOffset: (offset: number | string, shouldRunImmediately?: boolean) => void;
|
|
59
|
-
/**
|
|
60
|
-
* Changes the page. Will update `offset`.
|
|
61
|
-
*/
|
|
62
|
-
setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
|
|
63
|
-
/**
|
|
64
|
-
* Changes the page size.
|
|
65
|
-
*/
|
|
66
|
-
setPageSize: (pageSize: number | string, shouldRunImmediately?: boolean) => void;
|
|
67
|
-
/**
|
|
68
|
-
* Change the sort method.
|
|
69
|
-
*/
|
|
70
|
-
setSort: (sort: string | undefined, shouldRunImmediately?: boolean) => void;
|
|
71
|
-
/**
|
|
72
|
-
* Changes the cursor.
|
|
73
|
-
*/
|
|
74
|
-
setCursor: (cursor: string | null | undefined, shouldRunImmediately?: boolean) => void;
|
|
75
|
-
/**
|
|
76
|
-
* Forces a refresh of the filter.
|
|
77
|
-
*/
|
|
78
|
-
forceRefresh: (shouldRunImmediately?: boolean) => void;
|
|
79
|
-
}
|
|
80
|
-
export declare type UseFilterUpdateReason = 'initial' | 'filter' | 'pagination';
|
|
81
|
-
declare function useFilter<TFilter, TResult>(namespace: string, options: UseFilterOptions<TFilter, TResult>): FilterApi<TFilter, TResult>;
|
|
82
|
-
export default useFilter;
|
|
83
|
-
export interface FilterInfo<TFilter> {
|
|
84
|
-
filter: TFilter;
|
|
85
|
-
offset: number;
|
|
86
|
-
page: number;
|
|
87
|
-
sort?: string;
|
|
88
|
-
pageSize: number;
|
|
89
|
-
lastRefreshAt: number;
|
|
90
|
-
totalResults: number;
|
|
91
|
-
totalPages: number;
|
|
92
|
-
shouldRunImmediately: boolean;
|
|
93
|
-
cursor?: string | null;
|
|
94
|
-
nextCursor?: string | null;
|
|
95
|
-
}
|
|
96
|
-
declare type UseFilterOnChangeResult<TFilter, TResult> = void | {
|
|
97
|
-
filterInfo?: Partial<Omit<FilterInfo<TFilter>, 'totalResults' | 'offset' | 'pageSize'> & {
|
|
98
|
-
totalResults: string | number;
|
|
99
|
-
offset: string | number;
|
|
100
|
-
pageSize: string | number;
|
|
101
|
-
}>;
|
|
102
|
-
data?: TResult;
|
|
103
|
-
};
|
package/dist/useFilter.js
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
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 __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
25
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
26
|
-
};
|
|
27
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
var react_1 = require("react");
|
|
29
|
-
var buildDefaultFilterInfo_1 = __importDefault(require("./lib/buildDefaultFilterInfo"));
|
|
30
|
-
var getOffsetFromPage_1 = __importDefault(require("./lib/getOffsetFromPage"));
|
|
31
|
-
var getPageFromOffset_1 = __importDefault(require("./lib/getPageFromOffset"));
|
|
32
|
-
var shallowEqual_1 = __importDefault(require("./lib/shallowEqual"));
|
|
33
|
-
var store_1 = require("./store");
|
|
34
|
-
function useFilter(namespace, options) {
|
|
35
|
-
// Having these types of refs helps get around rules of hooks, and they need
|
|
36
|
-
// to be updated each render.
|
|
37
|
-
var ctxRefValue = {
|
|
38
|
-
namespace: namespace,
|
|
39
|
-
onChange: options.onChange,
|
|
40
|
-
debounceDuration: options.debounceDuration,
|
|
41
|
-
defaultFilterInfo: options.defaultFilterInfo,
|
|
42
|
-
onBeforeSaveFilter: options.onBeforeSaveFilter,
|
|
43
|
-
store: options.store,
|
|
44
|
-
};
|
|
45
|
-
var ctxRef = react_1.useRef(ctxRefValue);
|
|
46
|
-
react_1.useEffect(function () {
|
|
47
|
-
ctxRef.current = ctxRefValue;
|
|
48
|
-
});
|
|
49
|
-
var _a = react_1.useState(function () {
|
|
50
|
-
var _a;
|
|
51
|
-
var fromStore = store_1.getFilterStore(ctxRef.current.store).getFilter(namespace);
|
|
52
|
-
// If the filter is already in the store, we have to make sure it ...
|
|
53
|
-
// - has both the filter and filterInfo
|
|
54
|
-
// - has all the fields the user passed to the hook
|
|
55
|
-
if (fromStore) {
|
|
56
|
-
var filterInfo_1 = buildDefaultFilterInfo_1.default(__assign(__assign({}, fromStore), { shouldRunImmediately: true, filter: __assign(__assign({}, (_a = options.defaultFilterInfo) === null || _a === void 0 ? void 0 : _a.filter), fromStore.filter) }));
|
|
57
|
-
return filterInfo_1;
|
|
58
|
-
}
|
|
59
|
-
}), filterInfo = _a[0], setFilterInfoState = _a[1];
|
|
60
|
-
var _b = react_1.useState(function () {
|
|
61
|
-
return store_1.getFilterStore(ctxRef.current.store).getData(namespace);
|
|
62
|
-
}), data = _b[0], setData = _b[1];
|
|
63
|
-
var _c = react_1.useState(!filterInfo), isLoading = _c[0], setIsLoading = _c[1];
|
|
64
|
-
var doesFilterExist = react_1.useRef(!!filterInfo);
|
|
65
|
-
var lastRefreshAtRef = react_1.useRef(
|
|
66
|
-
// if shouldForceRunOnMount is set, always use -1
|
|
67
|
-
// otherwise, try grabbing lastRefreshAt
|
|
68
|
-
// then, just use -1 cause there's no other option
|
|
69
|
-
options.shouldForceRunOnMount
|
|
70
|
-
? -1
|
|
71
|
-
: filterInfo
|
|
72
|
-
? filterInfo.lastRefreshAt
|
|
73
|
-
: -1);
|
|
74
|
-
var updateReasonRef = react_1.useRef('initial');
|
|
75
|
-
// Call onChange when data changes.
|
|
76
|
-
react_1.useEffect(function () {
|
|
77
|
-
setIsLoading(true);
|
|
78
|
-
// If there is no existing filter info, set it to the defaults and return.
|
|
79
|
-
// This same effect will trigger next go.
|
|
80
|
-
if (!filterInfo) {
|
|
81
|
-
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { shouldRunImmediately: true }));
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
// If the lastRefreshAt hasn't changed, don't make a request.
|
|
85
|
-
if (lastRefreshAtRef.current === filterInfo.lastRefreshAt) {
|
|
86
|
-
setIsLoading(false);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
var makeRequest = function () {
|
|
90
|
-
lastRefreshAtRef.current = filterInfo.lastRefreshAt;
|
|
91
|
-
var response = ctxRef.current.onChange(filterInfo, updateReasonRef.current);
|
|
92
|
-
store_1.getFilterStore(ctxRef.current.store).saveFilter(namespace, ctxRef.current.onBeforeSaveFilter
|
|
93
|
-
? ctxRef.current.onBeforeSaveFilter(filterInfo)
|
|
94
|
-
: filterInfo);
|
|
95
|
-
if (!response) {
|
|
96
|
-
setIsLoading(false);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
function handleResponse(response) {
|
|
100
|
-
if (!response) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
if (response.filterInfo) {
|
|
104
|
-
setFilterInfoState(function (previous) {
|
|
105
|
-
// Even though we've already checked for response.filterInfo, since
|
|
106
|
-
// we're in a callback TypeScript still considers accessing it
|
|
107
|
-
// unsafe, so do another check.
|
|
108
|
-
invariant(!!response.filterInfo, '');
|
|
109
|
-
invariant(previous != null, 'handleResponse called without filterInfo');
|
|
110
|
-
var extra = {};
|
|
111
|
-
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"]);
|
|
112
|
-
var pageSizeNumber = Number(pageSize || previous.pageSize);
|
|
113
|
-
if (page != null && offset == null) {
|
|
114
|
-
extra.offset = getOffsetFromPage_1.default(page, pageSizeNumber);
|
|
115
|
-
extra.page = page;
|
|
116
|
-
// If there's an offset but no page, set the page.
|
|
117
|
-
}
|
|
118
|
-
else if (page == null && offset != null) {
|
|
119
|
-
var offsetNumber = Number(offset);
|
|
120
|
-
extra.offset = offsetNumber;
|
|
121
|
-
extra.page = getPageFromOffset_1.default(offsetNumber, pageSizeNumber);
|
|
122
|
-
}
|
|
123
|
-
// `null` / `undefined` are valid here, it means there is zero
|
|
124
|
-
// results, so we can't just check if it's truthy, we need to check
|
|
125
|
-
// for presence.
|
|
126
|
-
if ('totalResults' in response.filterInfo) {
|
|
127
|
-
extra.totalResults = Number(totalResults || 0);
|
|
128
|
-
extra.totalPages = Math.ceil(extra.totalResults / pageSizeNumber);
|
|
129
|
-
}
|
|
130
|
-
// `null` / `undefined` are valid here, it means there is no next
|
|
131
|
-
// cursor, so we can't just check if it's truthy, we need to check
|
|
132
|
-
// for presence.
|
|
133
|
-
if ('nextCursor' in response.filterInfo) {
|
|
134
|
-
extra.nextCursor = nextCursor;
|
|
135
|
-
}
|
|
136
|
-
return __assign(__assign(__assign({}, previous), filterInfoFromResponse), extra);
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
if (response.data) {
|
|
140
|
-
setData(response.data);
|
|
141
|
-
store_1.getFilterStore(ctxRef.current.store).saveData(namespace, response.data);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
if (isPromise(response)) {
|
|
145
|
-
response.then(handleResponse).finally(function () { return setIsLoading(false); });
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
handleResponse(response);
|
|
149
|
-
setIsLoading(false);
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
var timeout = undefined;
|
|
153
|
-
if (filterInfo.shouldRunImmediately) {
|
|
154
|
-
makeRequest();
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
timeout = setTimeout(makeRequest, ctxRef.current.debounceDuration != null
|
|
158
|
-
? ctxRef.current.debounceDuration
|
|
159
|
-
: 500);
|
|
160
|
-
}
|
|
161
|
-
return function () {
|
|
162
|
-
if (timeout) {
|
|
163
|
-
clearTimeout(timeout);
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
}, [filterInfo, namespace]);
|
|
167
|
-
var api = {
|
|
168
|
-
isLoading: isLoading,
|
|
169
|
-
data: data,
|
|
170
|
-
doesFilterExist: doesFilterExist.current,
|
|
171
|
-
filterInfo: filterInfo || buildDefaultFilterInfo_1.default(options.defaultFilterInfo),
|
|
172
|
-
updateReason: updateReasonRef.current,
|
|
173
|
-
updateFilter: react_1.useCallback(function (filter, shouldRunImmediately) {
|
|
174
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
175
|
-
updateReasonRef.current = 'filter';
|
|
176
|
-
setFilterInfoState(function (previous) {
|
|
177
|
-
invariant(previous != null, 'updateFilter called without filterInfo');
|
|
178
|
-
var nextFilter = __assign(__assign({}, previous.filter), filter);
|
|
179
|
-
if (shallowEqual_1.default(previous.filter, nextFilter)) {
|
|
180
|
-
return previous;
|
|
181
|
-
}
|
|
182
|
-
return __assign(__assign({}, previous), { offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter, lastRefreshAt: new Date().getTime(), cursor: undefined, nextCursor: undefined, shouldRunImmediately: shouldRunImmediately });
|
|
183
|
-
});
|
|
184
|
-
}, []),
|
|
185
|
-
resetFilter: react_1.useCallback(function (shouldRunImmediately) {
|
|
186
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
187
|
-
updateReasonRef.current = 'filter';
|
|
188
|
-
setFilterInfoState(__assign(__assign({}, buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo)), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately }));
|
|
189
|
-
}, []),
|
|
190
|
-
setOffset: react_1.useCallback(function (offset, shouldRunImmediately) {
|
|
191
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
192
|
-
updateReasonRef.current = 'pagination';
|
|
193
|
-
setFilterInfoState(function (previous) {
|
|
194
|
-
invariant(previous != null, 'setOffset called without filterInfo');
|
|
195
|
-
var offsetNumber = Number(offset);
|
|
196
|
-
return __assign(__assign({}, previous), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, previous.pageSize), lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
197
|
-
});
|
|
198
|
-
}, []),
|
|
199
|
-
setPage: react_1.useCallback(function (page, shouldRunImmediately) {
|
|
200
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
201
|
-
updateReasonRef.current = 'pagination';
|
|
202
|
-
setFilterInfoState(function (previous) {
|
|
203
|
-
invariant(previous != null, 'setPage called without filterInfo');
|
|
204
|
-
var pageNumber = Number(page);
|
|
205
|
-
return __assign(__assign({}, previous), { offset: getOffsetFromPage_1.default(pageNumber, previous.pageSize), page: pageNumber, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
206
|
-
});
|
|
207
|
-
}, []),
|
|
208
|
-
setPageSize: react_1.useCallback(function (pageSize, shouldRunImmediately) {
|
|
209
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
210
|
-
updateReasonRef.current = 'pagination';
|
|
211
|
-
setFilterInfoState(function (previous) {
|
|
212
|
-
invariant(previous != null, 'setPageSize called without filterInfo');
|
|
213
|
-
var pageSizeNumber = Number(pageSize);
|
|
214
|
-
var page = getPageFromOffset_1.default(previous.offset, pageSizeNumber);
|
|
215
|
-
var offset = getOffsetFromPage_1.default(page, pageSizeNumber);
|
|
216
|
-
return __assign(__assign({}, previous), { pageSize: pageSizeNumber, offset: offset, page: page, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
217
|
-
});
|
|
218
|
-
}, []),
|
|
219
|
-
setSort: react_1.useCallback(function (sort, shouldRunImmediately) {
|
|
220
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
221
|
-
updateReasonRef.current = 'filter';
|
|
222
|
-
setFilterInfoState(function (previous) {
|
|
223
|
-
invariant(previous != null, 'setSort called without filterInfo');
|
|
224
|
-
return __assign(__assign({}, previous), { sort: sort, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
225
|
-
});
|
|
226
|
-
}, []),
|
|
227
|
-
setCursor: react_1.useCallback(function (cursor, shouldRunImmediately) {
|
|
228
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
229
|
-
setFilterInfoState(function (previous) {
|
|
230
|
-
updateReasonRef.current = 'pagination';
|
|
231
|
-
invariant(previous != null, 'setCursor called without filterInfo');
|
|
232
|
-
return __assign(__assign({}, previous), { cursor: cursor, lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
233
|
-
});
|
|
234
|
-
}, []),
|
|
235
|
-
forceRefresh: react_1.useCallback(function (shouldRunImmediately) {
|
|
236
|
-
if (shouldRunImmediately === void 0) { shouldRunImmediately = false; }
|
|
237
|
-
updateReasonRef.current = 'filter';
|
|
238
|
-
setFilterInfoState(function (previous) {
|
|
239
|
-
invariant(previous != null, 'forceRefresh called without filterInfo');
|
|
240
|
-
return __assign(__assign({}, previous), { lastRefreshAt: new Date().getTime(), shouldRunImmediately: shouldRunImmediately });
|
|
241
|
-
});
|
|
242
|
-
}, []),
|
|
243
|
-
};
|
|
244
|
-
return api;
|
|
245
|
-
}
|
|
246
|
-
exports.default = useFilter;
|
|
247
|
-
function invariant(input, message) {
|
|
248
|
-
if (!input) {
|
|
249
|
-
throw new Error("Invariant error: " + message);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
function isPromise(t) {
|
|
253
|
-
return !!(t === null || t === void 0 ? void 0 : t.then);
|
|
254
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { FilterStore } from './store';
|
|
2
|
-
import { UseFilterUpdateReason } from './useFilter';
|
|
3
|
-
interface UseSimpleFilterOptions<TFilter> {
|
|
4
|
-
/**
|
|
5
|
-
* Default values for your filter. When calling `.reset` your filter will be
|
|
6
|
-
* set to this.
|
|
7
|
-
* Changing these values does not cause a call to happen.
|
|
8
|
-
*/
|
|
9
|
-
defaultFilterInfo?: Partial<SimpleFilterInfo<TFilter>>;
|
|
10
|
-
/**
|
|
11
|
-
* In case you want to change the default debounce duration.
|
|
12
|
-
*/
|
|
13
|
-
debounceDuration?: number;
|
|
14
|
-
onBeforeSaveFilter?: (filterInfo: SimpleFilterInfo<TFilter>) => SimpleFilterInfo<TFilter>;
|
|
15
|
-
store?: FilterStore;
|
|
16
|
-
}
|
|
17
|
-
export interface SimpleFilterApi<TFilter> {
|
|
18
|
-
/**
|
|
19
|
-
* Really more "is debouncing", since simple mode doesn't know when your code
|
|
20
|
-
* is doing anything.
|
|
21
|
-
*/
|
|
22
|
-
isLoading: boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Access to the filter and its metadata.
|
|
25
|
-
*/
|
|
26
|
-
filterInfo: SimpleFilterInfo<TFilter>;
|
|
27
|
-
/**
|
|
28
|
-
* Same as the regular `filterInfo`, but updates in a debounced fashion.
|
|
29
|
-
*/
|
|
30
|
-
debouncedFilterInfo: SimpleFilterInfo<TFilter>;
|
|
31
|
-
/**
|
|
32
|
-
* Why the last update happened.
|
|
33
|
-
*/
|
|
34
|
-
updateReason: UseFilterUpdateReason;
|
|
35
|
-
/**
|
|
36
|
-
* Update one or more values in your filter.
|
|
37
|
-
*/
|
|
38
|
-
updateFilter: (filter: Partial<TFilter>, shouldRunImmediately?: boolean) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Does the boring math for you based on your `pageSize` and `totalResults`.
|
|
41
|
-
*/
|
|
42
|
-
pagingInfo: (total: string | number | null | undefined) => {
|
|
43
|
-
totalResults: number;
|
|
44
|
-
totalPages: number;
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Resets the filter back to `defaultFilterInfo`.
|
|
48
|
-
*/
|
|
49
|
-
resetFilter: (shouldRunImmediately?: boolean) => void;
|
|
50
|
-
/**
|
|
51
|
-
* Changes the offset. Will update `page`.
|
|
52
|
-
*/
|
|
53
|
-
setOffset: (offset: number | string, shouldRunImmediately?: boolean) => void;
|
|
54
|
-
/**
|
|
55
|
-
* Changes the page. Will update `offset`.
|
|
56
|
-
*/
|
|
57
|
-
setPage: (page: number | string, shouldRunImmediately?: boolean) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Changes the page size.
|
|
60
|
-
*/
|
|
61
|
-
setPageSize: (pageSize: number | string, shouldRunImmediately?: boolean) => void;
|
|
62
|
-
/**
|
|
63
|
-
* Change the sort method.
|
|
64
|
-
*/
|
|
65
|
-
setSort: (sort: string, shouldRunImmediately?: boolean) => void;
|
|
66
|
-
/**
|
|
67
|
-
* Changes the cursor.
|
|
68
|
-
*/
|
|
69
|
-
setCursor: (cursor: string | null | undefined, shouldRunImmediately?: boolean) => void;
|
|
70
|
-
/**
|
|
71
|
-
* Forces a refresh of the filter.
|
|
72
|
-
*/
|
|
73
|
-
forceRefresh: (shouldRunImmediately?: boolean) => void;
|
|
74
|
-
}
|
|
75
|
-
export interface SimpleFilterInfo<TFilter> {
|
|
76
|
-
filter: TFilter;
|
|
77
|
-
sort?: string;
|
|
78
|
-
offset: number;
|
|
79
|
-
page: number;
|
|
80
|
-
pageSize: number;
|
|
81
|
-
lastRefreshAt: number;
|
|
82
|
-
cursor?: string | null;
|
|
83
|
-
shouldRunImmediately: boolean;
|
|
84
|
-
}
|
|
85
|
-
declare function useSimpleFilter<TFilter>(namespace: string, options: UseSimpleFilterOptions<TFilter>): SimpleFilterApi<TFilter>;
|
|
86
|
-
export default useSimpleFilter;
|