use-typed-reducer 3.2.2 → 3.2.3

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import { MutableRefObject } from "react";
2
2
  declare type VoidableFn<Fn extends (...any: any[]) => any> = ReturnType<Fn> extends Promise<any> ? (...a: Parameters<Fn>) => Promise<void> : (...a: Parameters<Fn>) => void;
3
3
  declare type Action<State> = (...args: any) => Promise<(state: State) => State> | ((state: State) => State);
4
4
  declare type Actions<Actions, State> = {
@@ -15,11 +15,14 @@ declare type FnMap<State> = {
15
15
  [k: string]: (...args: any[]) => Partial<State> | Promise<Partial<State>>;
16
16
  };
17
17
  declare type MappedReducers<State extends {}, Fns extends FnMap<State>> = {
18
- [F in keyof Fns]: (...args: Parameters<Fns[F]>) => State | Promise<State> | Partial<State> | Promise<Partial<State>>;
18
+ [F in keyof Fns]: (...args: Parameters<Fns[F]>) => Promise<Partial<State>> | Partial<State>;
19
19
  };
20
20
  declare type MapReducerReturn<State extends {}, Fns extends FnMap<State>> = {
21
21
  [F in keyof Fns]: VoidableFn<Fns[F]>;
22
22
  };
23
- export declare const useMutable: <T extends {}>(state: T) => import("react").MutableRefObject<T>;
24
- export declare const useReducer: <State extends {}, Reducers extends (getState: () => State, getProps: () => Props) => MappedReducers<State, FnMap<State>>, Props extends {}>(initialState: State, reducer: Reducers, props?: Props | undefined) => [state: State, dispatchers: MapReducerReturn<State, ReturnType<Reducers>>];
23
+ export declare const useMutable: <T extends {}>(state: T) => MutableRefObject<T>;
24
+ export declare const dispatchCallback: <Prev extends unknown, T extends Prev | ((prev: Prev) => Prev)>(prev: Prev, setter: T) => any;
25
+ export declare type DispatchCallback<T extends any> = T | ((prev: T) => T);
26
+ export declare const useReducer: <State extends {}, Reducers extends (getState: () => State, getProps: () => Props, initialState: State) => MappedReducers<State, FnMap<State>>, Props extends {}, Middlewares extends ((state: State, key: keyof ReturnType<Reducers>) => State)[]>(initialState: State, reducer: Reducers, props?: Props | undefined, middlewares?: Middlewares | undefined) => readonly [state: State, dispatchers: MapReducerReturn<State, ReturnType<Reducers>>];
27
+ export declare const createReducer: <State extends {} = {}, Props extends {} = {}>() => <Reducer extends (getState: () => State, getProps: () => Props, initialState: State) => MappedReducers<State, FnMap<State>>>(reducer: Reducer) => Reducer;
25
28
  export default useTypedReducer;
package/dist/index.es.js CHANGED
@@ -121,13 +121,18 @@ var useMutable = function (state) {
121
121
  useEffect(function () { return void (mutable.current = state); }, [state]);
122
122
  return mutable;
123
123
  };
124
- var useReducer = function (initialState, reducer, props) {
124
+ var dispatchCallback = function (prev, setter) {
125
+ return typeof setter === "function" ? setter(prev) : setter;
126
+ };
127
+ var useReducer = function (initialState, reducer, props, middlewares) {
125
128
  var _a = __read(useState(function () { return initialState; }), 2), state = _a[0], setState = _a[1];
126
129
  var mutableState = useMutable(state);
127
130
  var mutableProps = useMutable(props !== null && props !== void 0 ? props : {});
128
131
  var mutableReducer = useMutable(reducer);
132
+ var middleware = useMutable(middlewares !== null && middlewares !== void 0 ? middlewares : []);
133
+ var savedInitialState = useRef(initialState);
129
134
  var dispatchers = useMemo(function () {
130
- var reducers = mutableReducer.current(function () { return mutableState.current; }, function () { var _a; return (_a = mutableProps.current) !== null && _a !== void 0 ? _a : {}; });
135
+ var reducers = mutableReducer.current(function () { return mutableState.current; }, function () { var _a; return (_a = mutableProps.current) !== null && _a !== void 0 ? _a : {}; }, savedInitialState.current);
131
136
  return entries(reducers).reduce(function (acc, _a) {
132
137
  var _b;
133
138
  var _c = __read(_a, 2), name = _c[0], dispatch = _c[1];
@@ -136,15 +141,26 @@ var useReducer = function (initialState, reducer, props) {
136
141
  for (var _i = 0; _i < arguments.length; _i++) {
137
142
  params[_i] = arguments[_i];
138
143
  }
139
- var newState = dispatch.apply(void 0, __spread(params));
140
- return newState instanceof Promise
141
- ? void newState.then(function (state) { return void setState(function (prev) { return (__assign(__assign({}, prev), state)); }); })
142
- : setState(function (prev) { return (__assign(__assign({}, prev), newState)); });
144
+ var st = dispatch.apply(void 0, __spread(params));
145
+ return st instanceof Promise
146
+ ? void st.then(function (state) {
147
+ return setState(function (prev) {
148
+ return middleware.current.reduce(function (acc, fn) { return fn(acc, name); }, __assign(__assign({}, prev), { state: state }));
149
+ });
150
+ })
151
+ : setState(function (prev) {
152
+ return middleware.current.reduce(function (acc, fn) { return fn(acc, name); }, __assign(__assign({}, prev), st));
153
+ });
143
154
  }, _b)));
144
- }, reducers);
145
- }, []);
155
+ }, {});
156
+ }, [mutableProps, mutableReducer, mutableState]);
146
157
  return [state, dispatchers];
158
+ };
159
+ var createReducer = function () {
160
+ return function (reducer) {
161
+ return reducer;
162
+ };
147
163
  };
148
164
 
149
165
  export default useTypedReducer;
150
- export { useMutable, useReducer, useTypedReducer };
166
+ export { createReducer, dispatchCallback, useMutable, useReducer, useTypedReducer };
package/dist/index.js CHANGED
@@ -125,13 +125,18 @@ var useMutable = function (state) {
125
125
  react.useEffect(function () { return void (mutable.current = state); }, [state]);
126
126
  return mutable;
127
127
  };
128
- var useReducer = function (initialState, reducer, props) {
128
+ var dispatchCallback = function (prev, setter) {
129
+ return typeof setter === "function" ? setter(prev) : setter;
130
+ };
131
+ var useReducer = function (initialState, reducer, props, middlewares) {
129
132
  var _a = __read(react.useState(function () { return initialState; }), 2), state = _a[0], setState = _a[1];
130
133
  var mutableState = useMutable(state);
131
134
  var mutableProps = useMutable(props !== null && props !== void 0 ? props : {});
132
135
  var mutableReducer = useMutable(reducer);
136
+ var middleware = useMutable(middlewares !== null && middlewares !== void 0 ? middlewares : []);
137
+ var savedInitialState = react.useRef(initialState);
133
138
  var dispatchers = react.useMemo(function () {
134
- var reducers = mutableReducer.current(function () { return mutableState.current; }, function () { var _a; return (_a = mutableProps.current) !== null && _a !== void 0 ? _a : {}; });
139
+ var reducers = mutableReducer.current(function () { return mutableState.current; }, function () { var _a; return (_a = mutableProps.current) !== null && _a !== void 0 ? _a : {}; }, savedInitialState.current);
135
140
  return entries(reducers).reduce(function (acc, _a) {
136
141
  var _b;
137
142
  var _c = __read(_a, 2), name = _c[0], dispatch = _c[1];
@@ -140,17 +145,30 @@ var useReducer = function (initialState, reducer, props) {
140
145
  for (var _i = 0; _i < arguments.length; _i++) {
141
146
  params[_i] = arguments[_i];
142
147
  }
143
- var newState = dispatch.apply(void 0, __spread(params));
144
- return newState instanceof Promise
145
- ? void newState.then(function (state) { return void setState(function (prev) { return (__assign(__assign({}, prev), state)); }); })
146
- : setState(function (prev) { return (__assign(__assign({}, prev), newState)); });
148
+ var st = dispatch.apply(void 0, __spread(params));
149
+ return st instanceof Promise
150
+ ? void st.then(function (state) {
151
+ return setState(function (prev) {
152
+ return middleware.current.reduce(function (acc, fn) { return fn(acc, name); }, __assign(__assign({}, prev), { state: state }));
153
+ });
154
+ })
155
+ : setState(function (prev) {
156
+ return middleware.current.reduce(function (acc, fn) { return fn(acc, name); }, __assign(__assign({}, prev), st));
157
+ });
147
158
  }, _b)));
148
- }, reducers);
149
- }, []);
159
+ }, {});
160
+ }, [mutableProps, mutableReducer, mutableState]);
150
161
  return [state, dispatchers];
162
+ };
163
+ var createReducer = function () {
164
+ return function (reducer) {
165
+ return reducer;
166
+ };
151
167
  };
152
168
 
169
+ exports.createReducer = createReducer;
153
170
  exports.default = useTypedReducer;
171
+ exports.dispatchCallback = dispatchCallback;
154
172
  exports.useMutable = useMutable;
155
173
  exports.useReducer = useReducer;
156
174
  exports.useTypedReducer = useTypedReducer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "use-typed-reducer",
3
- "version": "3.2.2",
3
+ "version": "3.2.3",
4
4
  "description": "use-reducer React hook alternative",
5
5
  "author": "g4rcez",
6
6
  "license": "MIT",