grafana/public/app/plugins/datasource/elasticsearch/hooks/useStatelessReducer.ts
Josh Hunt 3c6e0e8ef8
Chore: ESlint import order (#44959)
* Add and configure eslint-plugin-import

* Fix the lint:ts npm command

* Autofix + prettier all the files

* Manually fix remaining files

* Move jquery code in jest-setup to external file to safely reorder imports

* Resolve issue caused by circular dependencies within Prometheus

* Update .betterer.results

* Fix missing // @ts-ignore

* ignore iconBundle.ts

* Fix missing // @ts-ignore
2022-04-22 14:33:13 +01:00

42 lines
1.1 KiB
TypeScript

import { Action } from '@reduxjs/toolkit';
import { createContext, useCallback, useContext } from 'react';
export type Reducer<S, A extends Action> = (state: S, action: A) => S;
export const combineReducers =
<S, A extends Action = Action>(reducers: { [P in keyof S]: Reducer<S[P], A> }) =>
(state: S, action: A): Partial<S> => {
const newState = {} as S;
for (const key in reducers) {
newState[key] = reducers[key](state[key], action);
}
return newState;
};
export const useStatelessReducer = <State, A = Action>(
onChange: (value: State) => void,
state: State,
reducer: (state: State, action: A) => State
) => {
const dispatch = useCallback(
(action: A) => {
onChange(reducer(state, action));
},
[onChange, state, reducer]
);
return dispatch;
};
export const DispatchContext = createContext<((action: Action) => void) | undefined>(undefined);
export const useDispatch = <T extends Action = Action>(): ((action: T) => void) => {
const dispatch = useContext(DispatchContext);
if (!dispatch) {
throw new Error('Use DispatchContext first.');
}
return dispatch;
};