import { useEffect, useState } from 'react' export function useCancellableAsync( asyncCall: (stop: () => void) => Promise, deps: any[] ): [Result, boolean] { const [result, setResult] = useState(undefined) const [loading, setLoading] = useState(true) useEffect(() => { let cancelled = false const cancel = () => { cancelled = true } const stop = () => { cancelled = true setLoading(false) } setLoading(true) asyncCall(stop) .then((result) => { if (!cancelled) { setResult(result) setLoading(false) } }) .catch(() => { if (!cancelled) { setResult(undefined) setLoading(false) } }) return cancel }, deps) return [result as Result, loading] }