import { isPromise } from '@/utils/is-promise'; import isFunction from 'lodash/isFunction'; import { useState } from 'react'; interface IUseAsyncLoadingProps { loading?: boolean; asyncLoading?: boolean; onClick?: () => unknown; } export const useAsyncLoading = (props: IUseAsyncLoadingProps) => { const [loading, setLoading] = useState(false); const { asyncLoading, onClick, loading: originalLoading } = props || {}; if (asyncLoading && isFunction(onClick)) { const wrapOnClick = new Proxy(onClick, { apply(target, object, args) { setLoading(true); // @ts-ignore const result = target(...args); if (isPromise(result)) { result.finally(() => { setLoading(false); }); } else { setLoading(false); } return result; }, }); return { onClick: wrapOnClick, loading, }; } return { onClick, loading: originalLoading, }; };