66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
|
/* 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<unknown>) => void;
|
|||
|
|
|||
|
type actionType =
|
|||
|
| 'user'
|
|||
|
| 'global'
|
|||
|
| 'message';
|
|||
|
|
|||
|
interface ReduxAction {
|
|||
|
[key: string]: (...props: Array<unknown>) => ThunkAction<Promise<void>, 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<unknown>) => {
|
|||
|
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],
|
|||
|
);
|
|||
|
}
|