import { useCallback, useEffect } from 'react'; import { useEndpoint } from '../contexts/ServerContext'; import { useToastMessageDispatch } from '../contexts/ToastMessagesContext'; import { AsyncState, useAsyncState } from './useAsyncState'; const defaultParams = {}; export const useEndpointData = ( endpoint: string, params: Record = defaultParams, initialValue?: T | (() => T), ): AsyncState & { reload: () => void } => { const { resolve, reject, reset, ...state } = useAsyncState(initialValue); const dispatchToastMessage = useToastMessageDispatch(); const getData = useEndpoint('GET', endpoint); const fetchData = useCallback(() => { reset(); getData(params) .then(resolve) .catch((error) => { console.error(error); dispatchToastMessage({ type: 'error', message: error, }); reject(error); }); }, [reset, getData, params, resolve, dispatchToastMessage, reject]); useEffect(() => { fetchData(); }, [fetchData]); return { ...state, reload: fetchData, }; };