UNPKG

ahooks

Version:
53 lines (52 loc) 2.45 kB
import { __rest } from "tslib"; import useCreation from '../../useCreation'; import useLatest from '../../useLatest'; import useMemoizedFn from '../../useMemoizedFn'; import useMount from '../../useMount'; import useUnmount from '../../useUnmount'; import useUpdate from '../../useUpdate'; import isDev from '../../utils/isDev'; import Fetch from './Fetch'; function useRequestImplement(service, options = {}, plugins = []) { const { manual = false, ready = true } = options, rest = __rest(options, ["manual", "ready"]); if (isDev) { if (options.defaultParams && !Array.isArray(options.defaultParams)) { console.warn(`expected defaultParams is array, got ${typeof options.defaultParams}`); } } const fetchOptions = Object.assign({ manual, ready }, rest); const serviceRef = useLatest(service); const update = useUpdate(); const fetchInstance = useCreation(() => { const initState = plugins.map((p) => { var _a; return (_a = p === null || p === void 0 ? void 0 : p.onInit) === null || _a === void 0 ? void 0 : _a.call(p, fetchOptions); }).filter(Boolean); return new Fetch(serviceRef, fetchOptions, update, Object.assign({}, ...initState)); }, []); fetchInstance.options = fetchOptions; // run all plugins hooks fetchInstance.pluginImpls = plugins.map((p) => p(fetchInstance, fetchOptions)); useMount(() => { if (!manual && ready) { // useCachePlugin can set fetchInstance.state.params from cache when init const params = fetchInstance.state.params || options.defaultParams || []; // @ts-ignore fetchInstance.run(...params); } }); useUnmount(() => { fetchInstance.cancel(); }); return { loading: fetchInstance.state.loading, data: fetchInstance.state.data, error: fetchInstance.state.error, params: fetchInstance.state.params || [], cancel: useMemoizedFn(fetchInstance.cancel.bind(fetchInstance)), refresh: useMemoizedFn(fetchInstance.refresh.bind(fetchInstance)), refreshAsync: useMemoizedFn(fetchInstance.refreshAsync.bind(fetchInstance)), run: useMemoizedFn(fetchInstance.run.bind(fetchInstance)), runAsync: useMemoizedFn((...args) => fetchInstance.runAsync(...args)), mutate: useMemoizedFn(fetchInstance.mutate.bind(fetchInstance)), }; } export default useRequestImplement;