import { useCallback, useEffect } from 'react'; import { Serialized } from '../../definition/Serialized'; import { MatchPathPattern, OperationParams, OperationResult, PathFor } from '../../definition/rest'; import { useEndpoint } from '../contexts/ServerContext'; import { useToastMessageDispatch } from '../contexts/ToastMessagesContext'; import { AsyncState, useAsyncState } from './useAsyncState'; export const useEndpointData = >( endpoint: TPath, params: void extends OperationParams<'GET', MatchPathPattern> ? void : Serialized>> = undefined as void extends OperationParams< 'GET', MatchPathPattern > ? void : Serialized>>, initialValue?: | Serialized>> | (() => Serialized>>), ): 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, }; };