/** File is adapted from https://github.com/Qeepsake/use-redux-effect under MIT License * @author Aspect Apps Limited * @description */ import { useRef, useEffect, DependencyList } from 'react' import { useStore } from 'react-redux' import { AnyAction } from 'redux' import { castArray } from 'lodash' export type ReduxEffect = (action: AnyAction) => void /** * Subscribes to redux store events * * @param effect * @param type * @param deps */ export function useReduxEffect( effect: ReduxEffect, type: string | string[], deps: DependencyList = [], ): void { const currentValue = useRef(null); const store = useStore(); const handleChange = (): void => { const state = store.getState(); const action = state.action; const previousValue = currentValue.current; currentValue.current = action.count; if ( previousValue !== action.count && castArray(type).includes(action.type) ) { effect(action); } } useEffect(() => { const unsubscribe = store.subscribe(handleChange); return (): void => unsubscribe(); }, deps) }