/* eslint-disable no-console */ import { useCallback } from 'react'; import { ThunkAction } from 'redux-thunk'; import { StoreState } from '@Reducers/_InitializeStore/types'; import useDispatch from './useDispatch'; type useReduxAPICallBack = (action: string, props: Array) => void; type actionType = | 'user' | 'global' | 'message'; interface ReduxAction { [key: string]: (...props: Array) => ThunkAction, StoreState, unknown, { type: string }>; } interface ReduxActionModule { [key: string]: ReduxAction; } const VALID_ACTIONS: actionType[] = [ 'user', 'global', 'message', ]; const LOAD_MODULE: ReduxActionModule = {}; /** * 描述 : 取得指定的 Redux Action */ export default function useReduxAPI(actionType: actionType): useReduxAPICallBack { /* Global & Local State */ const dispatch = useDispatch(); /* Main */ return useCallback( (action: string, props: Array) => { const isInclude = VALID_ACTIONS.includes(actionType); let reduxType: ReduxAction = {}; if (isInclude) { if (LOAD_MODULE[actionType]) { reduxType = LOAD_MODULE[actionType]; } else { LOAD_MODULE[actionType] = require(`@Reducers/${actionType}/actions`); reduxType = LOAD_MODULE[actionType]; } if (reduxType) { const reduxAction = reduxType[action]; if (reduxAction) { dispatch(reduxAction(...props)); } else { console.warn(`Can't find the action ::: ${action}`); } } else { console.warn(`Can't load module ::: ${reduxType}`); } } else { console.warn(`Can't find the action type ::: ${actionType}`); } }, [actionType], ); }