import { useCallback } from "react"; import { useDispatch, useSelector } from "react-redux"; import { createCallbackAction } from "../actions/factory"; import { ActionCallback, AsyncActionDispatcher } from "../types"; // function use export function useReduxStore any>( selector: T ) { return useSelector>(selector); } export function useReduxAction void>(action: T) { const dispatch = useDispatch(); return useCallback((...args: Parameters) => dispatch(action(...args)), [ action, dispatch, ]); } export function useReduxActionWith< T extends (...args: any[]) => AsyncActionDispatcher >(action: T, success: ActionCallback) { const dispatch = useDispatch(); return useCallback( (...args: Parameters) => { const callbackAction = createCallbackAction( () => [action(...args)], success ); dispatch(callbackAction()); }, [dispatch, action, success] ); }