import { useCallback, useEffect } from 'react'; import { ServerMethods, useMethod } from '../contexts/ServerContext'; import { useToastMessageDispatch } from '../contexts/ToastMessagesContext'; import { AsyncState, useAsyncState } from './useAsyncState'; const defaultArgs: unknown[] = []; export const useMethodData = ( methodName: keyof ServerMethods, args: any[] = defaultArgs, initialValue?: T | (() => T), ): AsyncState & { reload: () => void } => { const { resolve, reject, reset, ...state } = useAsyncState(initialValue); const dispatchToastMessage = useToastMessageDispatch(); const getData: (...args: unknown[]) => Promise = useMethod(methodName); const fetchData = useCallback(() => { reset(); getData(...args) .then(resolve) .catch((error) => { console.error(error); dispatchToastMessage({ type: 'error', message: error, }); reject(error); }); }, [reset, getData, args, resolve, dispatchToastMessage, reject]); useEffect(() => { fetchData(); }, [fetchData]); return { ...state, reload: fetchData, }; };