mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* 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
42 lines
1.1 KiB
TypeScript
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;
|
|
};
|