@promoboxx/use-filter 1.2.1 → 1.3.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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
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
4
 
5
+ ## 1.3.0 (2021-07-18)
6
+
7
+
8
+ ### Features
9
+
10
+ * Redux store ([#5](https://github.com/promoboxx/use-filter/issues/5)) ([f92bee6](https://github.com/promoboxx/use-filter/commit/f92bee6417f78117ab9ca4936c23b24647aac008))
11
+
5
12
  ### 1.2.1 (2021-07-17)
6
13
 
7
14
 
@@ -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;
@@ -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
+ });
package/package.json CHANGED
@@ -1,11 +1,8 @@
1
1
  {
2
2
  "name": "@promoboxx/use-filter",
3
- "version": "1.2.1",
3
+ "version": "1.3.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",