@promoboxx/use-filter 1.2.1 → 1.5.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.
@@ -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);
@@ -1,9 +1,9 @@
1
1
  import { FilterInfo } from '../useFilter';
2
2
  export interface FilterStore {
3
- getFilter(namespace: string): FilterInfo<any> | null | undefined;
4
- saveFilter(namespace: string, filter: FilterInfo<any>): void;
5
- getData(namespace: string): any | null | undefined;
6
- saveData(namespace: string, data: any): void;
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;
@@ -0,0 +1,3 @@
1
+ import { FilterStore } from '.';
2
+ declare const localStorageStore: FilterStore;
3
+ export default localStorageStore;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var prefix = 'useFilter';
4
+ var localStorageStore = {
5
+ getFilter: function (namespace) {
6
+ var item = localStorage.getItem(prefix + "/" + namespace + "/filter");
7
+ if (item) {
8
+ return JSON.parse(item);
9
+ }
10
+ },
11
+ saveFilter: function (namespace, filter) {
12
+ localStorage.setItem(prefix + "/" + namespace + "/filter", JSON.stringify(filter));
13
+ },
14
+ getData: function (namespace) {
15
+ var item = localStorage.getItem(prefix + "/" + namespace + "/data");
16
+ if (item) {
17
+ return JSON.parse(item);
18
+ }
19
+ },
20
+ saveData: function (namespace, data) {
21
+ localStorage.setItem(prefix + "/" + namespace + "/data", JSON.stringify(data));
22
+ },
23
+ clear: function () {
24
+ for (var key in localStorage) {
25
+ if (key.startsWith(prefix)) {
26
+ localStorage.removeItem(key);
27
+ }
28
+ }
29
+ },
30
+ };
31
+ exports.default = localStorageStore;
@@ -1,23 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- var filters = {};
4
- var data = {};
3
+ var cachedFilters = {};
4
+ var cachedData = {};
5
5
  var memoryStore = {
6
6
  getFilter: function (namespace) {
7
- return filters[namespace];
7
+ return cachedFilters[namespace];
8
8
  },
9
9
  saveFilter: function (namespace, filter) {
10
- filters[namespace] = filter;
10
+ cachedFilters[namespace] = filter;
11
11
  },
12
12
  getData: function (namespace) {
13
- return data[namespace];
13
+ return cachedData[namespace];
14
14
  },
15
15
  saveData: function (namespace, data) {
16
- filters[namespace] = data;
16
+ cachedData[namespace] = data;
17
17
  },
18
18
  clear: function () {
19
- filters = {};
20
- data = {};
19
+ cachedFilters = {};
20
+ cachedData = {};
21
21
  },
22
22
  };
23
23
  exports.default = memoryStore;
@@ -0,0 +1,16 @@
1
+ interface CreateActions {
2
+ <Namespace extends string, PayloadCreatorMap extends ReduxPayloadCreatorMap>(namespace: Namespace, actions: PayloadCreatorMap): ReduxActionCreatorMap<Namespace, PayloadCreatorMap>;
3
+ }
4
+ declare type ReduxPayloadCreatorMap = Record<string, (...args: any[]) => any>;
5
+ export declare type ReduxActionCreatorMap<Namespace extends string, PayloadCreatorMap extends ReduxPayloadCreatorMap> = {
6
+ [Type in keyof PayloadCreatorMap]: Type extends string ? ReduxActionCreator<Namespace, Type, PayloadCreatorMap[Type]> : undefined;
7
+ };
8
+ export interface ReduxActionCreator<Namespace extends string = string, Type extends string = string, Fn extends (...args: any[]) => any = (...args: any[]) => any> {
9
+ (...args: Parameters<Fn>): {
10
+ type: `${Namespace}/${Type}`;
11
+ payload: ReturnType<Fn>;
12
+ };
13
+ actionType: `${Namespace}/${Type}`;
14
+ }
15
+ declare const createActions: CreateActions;
16
+ export default createActions;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var createActions = function (namespace, payloadCreatorMap) {
4
+ var actionCreators = {};
5
+ var _loop_1 = function (key) {
6
+ actionCreators[key] = (function () {
7
+ var args = [];
8
+ for (var _i = 0; _i < arguments.length; _i++) {
9
+ args[_i] = arguments[_i];
10
+ }
11
+ return ({
12
+ type: namespace + "/" + key,
13
+ payload: payloadCreatorMap[key].apply(payloadCreatorMap, args),
14
+ // Need to cast here because there's no way to assign a function + extra
15
+ // attributes in one go.
16
+ });
17
+ });
18
+ actionCreators[key].actionType = namespace + "/" + key;
19
+ };
20
+ for (var key in payloadCreatorMap) {
21
+ _loop_1(key);
22
+ }
23
+ // TODO There's probably a better type to use here, but it's not super
24
+ // important since `CreateActions` already specifies one.
25
+ return actionCreators;
26
+ };
27
+ exports.default = createActions;
@@ -0,0 +1,8 @@
1
+ import { Action } from 'redux';
2
+ import { ReduxActionCreator } from './createActions';
3
+ interface ReduxReducerBuilder<State> {
4
+ addHandler: <ActionCreator extends ReduxActionCreator>(actionCreator: ActionCreator, handler: (state: State, action: ReturnType<ActionCreator>) => State) => ReduxReducerBuilder<State>;
5
+ addCase: <HandlerAction extends Action>(actionType: string, handler: (state: State, action: HandlerAction) => State) => ReduxReducerBuilder<State>;
6
+ }
7
+ declare function createReducer<State>(initialState: State, builderFn: (builder: ReduxReducerBuilder<State>) => void): (state: State | undefined, action: Action) => State;
8
+ export default createReducer;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function createReducer(initialState, builderFn) {
4
+ var handlers = {};
5
+ var builder = {
6
+ addHandler: function (actionCreator, handler) {
7
+ // TODO There's probably a better type to use here.
8
+ handlers[actionCreator.actionType] = handler;
9
+ return builder;
10
+ },
11
+ addCase: function (actionType, handler) {
12
+ // TODO There's probably a better type to use here.
13
+ handlers[actionType] = handler;
14
+ return builder;
15
+ },
16
+ };
17
+ builderFn(builder);
18
+ return function (state, action) {
19
+ if (state === void 0) { state = initialState; }
20
+ if (handlers[action.type]) {
21
+ return handlers[action.type](state, action);
22
+ }
23
+ return state;
24
+ };
25
+ }
26
+ exports.default = createReducer;
@@ -0,0 +1,15 @@
1
+ import { Store } from 'redux';
2
+ import { FilterInfo } from '../useFilter';
3
+ import { FilterStore } from '.';
4
+ interface CreateReduxStoreConfig {
5
+ store: Store<{
6
+ useFilter: UseFilterReduxState;
7
+ }>;
8
+ }
9
+ export declare function createReduxStore(config: CreateReduxStoreConfig): FilterStore;
10
+ interface UseFilterReduxState {
11
+ data: Record<string, any>;
12
+ filters: Record<string, FilterInfo<any>>;
13
+ }
14
+ export declare const useFilterReduxReducer: (state: UseFilterReduxState | undefined, action: import("redux").Action<any>) => UseFilterReduxState;
15
+ export {};
@@ -0,0 +1,67 @@
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
+ });
@@ -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>): 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;
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 () { return store_1.getFilterStore().getFilter(namespace); }), filterInfo = _a[0], setFilterInfoState = _a[1];
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
- var setFilterInfo = react_1.useCallback(function (filterInfo, skipFetch) {
40
- if (skipFetch === void 0) { skipFetch = false; }
41
- setFilterInfoState(function (previousFilterInfo) {
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
- setFilterInfo(buildDefaultFilterInfo_1.default(ctxRef.current.defaultFilterInfo));
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 timeout = setTimeout(function () {
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
- var extra = {};
103
- var _a = response.filterInfo, page = _a.page, offset = _a.offset, totalResults = _a.totalResults, pageSize = _a.pageSize, filterInfoFromResponse = __rest(_a, ["page", "offset", "totalResults", "pageSize"]);
104
- var pageSizeNumber = Number(pageSize || filterInfo.pageSize);
105
- if (page != null && offset == null) {
106
- extra.offset = getOffsetFromPage_1.default(page, pageSizeNumber);
107
- extra.page = page;
108
- // If there's an offset but no page, set the page.
109
- }
110
- else if (page == null && offset != null) {
111
- var offsetNumber = Number(offset);
112
- extra.offset = offsetNumber;
113
- extra.page = getPageFromOffset_1.default(offsetNumber, pageSizeNumber);
114
- }
115
- if (totalResults) {
116
- extra.totalResults = Number(totalResults);
117
- extra.totalPages = Math.ceil(extra.totalResults / pageSizeNumber);
118
- }
119
- setFilterInfo(__assign(__assign(__assign({}, filterInfo), filterInfoFromResponse), extra), true);
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
- }, ctxRef.current.debounceDuration != null
134
- ? ctxRef.current.debounceDuration
135
- : 500);
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, setFilterInfo, namespace]);
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 (!filterInfo) {
149
- throw new Error();
150
- }
151
- var nextFilter = __assign(__assign({}, filterInfo.filter), filter);
152
- if (shallowEqual_1.default(filterInfo.filter, nextFilter)) {
153
- return;
154
- }
155
- setFilterInfo(__assign(__assign({}, filterInfo), { offset: 0, page: 1, totalResults: 1, totalPages: 1, filter: nextFilter }));
156
- },
157
- resetFilter: function () {
158
- setFilterInfo(buildDefaultFilterInfo_1.default(options.defaultFilterInfo));
159
- },
160
- setOffset: function (offset) {
161
- if (!filterInfo) {
162
- throw new Error();
163
- }
164
- var offsetNumber = Number(offset);
165
- setFilterInfo(__assign(__assign({}, filterInfo), { offset: offsetNumber, page: getPageFromOffset_1.default(offsetNumber, filterInfo.pageSize) }));
166
- },
167
- setPage: function (page) {
168
- if (!filterInfo) {
169
- throw new Error();
170
- }
171
- var pageNumber = Number(page);
172
- setFilterInfo(__assign(__assign({}, filterInfo), { offset: getOffsetFromPage_1.default(pageNumber, filterInfo.pageSize), page: pageNumber }));
173
- },
174
- setSort: function (sort) {
175
- if (!filterInfo) {
176
- throw new Error();
177
- }
178
- setFilterInfo(__assign(__assign({}, filterInfo), { sort: sort }));
179
- },
180
- forceRefresh: function () {
181
- if (!filterInfo) {
182
- throw new Error();
183
- }
184
- setFilterInfo(__assign(__assign({}, filterInfo), { lastRefreshAt: new Date().getTime() }));
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
  }
package/package.json CHANGED
@@ -1,11 +1,8 @@
1
1
  {
2
2
  "name": "@promoboxx/use-filter",
3
- "version": "1.2.1",
3
+ "version": "1.5.0",
4
4
  "description": "",
5
5
  "main": "dist/useFilter.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
8
- },
9
6
  "keywords": [],
10
7
  "author": "",
11
8
  "license": "ISC",
@@ -14,6 +11,7 @@
14
11
  "@testing-library/react": "^12.0.0",
15
12
  "@types/jest": "^26.0.24",
16
13
  "@types/react": "^17.0.14",
14
+ "@types/redux": "^3.6.0",
17
15
  "eslint": "^7.30.0",
18
16
  "jest": "^27.0.6",
19
17
  "prettier": "^2.3.2",
@@ -24,10 +22,18 @@
24
22
  },
25
23
  "files": [
26
24
  "dist/useFilter.d.ts",
25
+ "dist/store/reduxHelpers/createActions.d.ts",
26
+ "dist/store/reduxHelpers/createReducer.js",
27
+ "dist/store/reduxHelpers/createActions.js",
28
+ "dist/store/reduxHelpers/createReducer.d.ts",
29
+ "dist/store/reduxStore.d.ts",
27
30
  "dist/store/index.d.ts",
28
31
  "dist/store/index.js",
32
+ "dist/store/localStorageStore.js",
29
33
  "dist/store/memoryStore.js",
34
+ "dist/store/reduxStore.js",
30
35
  "dist/store/memoryStore.d.ts",
36
+ "dist/store/localStorageStore.d.ts",
31
37
  "dist/useFilter.js",
32
38
  "dist/lib/buildDefaultFilterInfo.js",
33
39
  "dist/lib/shallowEqual.js",
package/CHANGELOG.md DELETED
@@ -1,56 +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.2.1 (2021-07-17)
6
-
7
-
8
- ### Bug Fixes
9
-
10
- * some git stuff is needed ([2bb0f21](https://github.com/promoboxx/use-filter/commit/2bb0f2117c79fd1ba0b6a309db4234caf162f57b))
11
-
12
- ## 1.2.0 (2021-07-16)
13
-
14
-
15
- ### Features
16
-
17
- * Add localStorageStore ([#4](https://github.com/promoboxx/use-filter/issues/4)) ([a6087e2](https://github.com/promoboxx/use-filter/commit/a6087e2f07a3640799b840e128b96838cd8ef150))
18
-
19
- ## 1.1.0 (2021-07-16)
20
-
21
-
22
- ### Features
23
-
24
- * Add concept of data to useFilter ([#2](https://github.com/promoboxx/use-filter/issues/2)) ([563c5a9](https://github.com/promoboxx/use-filter/commit/563c5a959cdc22a0f8eba9dbb3dde7802df02b46))
25
-
26
- ### 1.0.6 (2021-07-16)
27
-
28
-
29
- ### Bug Fixes
30
-
31
- * dont deploy test files ([500151c](https://github.com/promoboxx/use-filter/commit/500151c04f75139c71baf29b2ad2dccefcd57db7))
32
-
33
- ### 1.0.5 (2021-07-16)
34
-
35
-
36
- ### Bug Fixes
37
-
38
- * declaration files ([4ce29e4](https://github.com/promoboxx/use-filter/commit/4ce29e43469ad4ade2d222c3b09f38ad8f89ca4c))
39
-
40
- ### 1.0.4 (2021-07-16)
41
-
42
-
43
- ### Bug Fixes
44
-
45
- * more release prep ([daf06ac](https://github.com/promoboxx/use-filter/commit/daf06acc94668fdc7f0905c120f5541b4b2d16e9))
46
-
47
- ### 1.0.3 (2021-07-16)
48
-
49
- ### 1.0.2 (2021-07-16)
50
-
51
-
52
- ### Bug Fixes
53
-
54
- * proper secrets syntax ([afc9fe9](https://github.com/promoboxx/use-filter/commit/afc9fe9b177dda2961d82858ef43cc481f762950))
55
-
56
- ### 1.0.1 (2021-07-16)