|
|
@@ -1,5 +1,5 @@
|
|
|
import axios, { Canceler, AxiosInstance, AxiosResponse } from 'axios';
|
|
|
-import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
+import { RefObject, useCallback, useEffect, useRef, useState } from 'react';
|
|
|
|
|
|
type Options<Query, Response> = {
|
|
|
sendRequest: (axiosInstance: AxiosInstance, query: Query) => Promise<AxiosResponse<Response>>;
|
|
|
@@ -9,23 +9,30 @@ type Options<Query, Response> = {
|
|
|
export function useRequestCallback<Query, Response = void>({
|
|
|
onError,
|
|
|
sendRequest,
|
|
|
-}: Options<Query, Response>): [(query: Query) => void, Response | null, boolean] {
|
|
|
+}: Options<Query, Response>): [
|
|
|
+ (query: Query) => void,
|
|
|
+ Response | null,
|
|
|
+ boolean,
|
|
|
+ RefObject<((unmount?: boolean) => void) | undefined>,
|
|
|
+] {
|
|
|
const [response, setResponse] = useState<Response | null>(null);
|
|
|
const [loading, setLoading] = useState<boolean>(false);
|
|
|
|
|
|
- const cancel = useRef<() => void>();
|
|
|
+ const cancel = useRef<(unmount?: boolean) => void>();
|
|
|
|
|
|
- useEffect(() => (): void => cancel.current?.(), []);
|
|
|
+ useEffect(() => (): void => cancel.current?.(true), []);
|
|
|
|
|
|
const onRequest = useCallback(
|
|
|
(query: Query) => {
|
|
|
let cancelled = false;
|
|
|
+ let unmounted = false;
|
|
|
|
|
|
let cancelRequest: Canceler | null = null;
|
|
|
|
|
|
cancel.current?.();
|
|
|
- cancel.current = (): void => {
|
|
|
+ cancel.current = (unmount = false): void => {
|
|
|
cancelled = true;
|
|
|
+ unmounted = unmount;
|
|
|
cancelRequest?.();
|
|
|
};
|
|
|
|
|
|
@@ -48,7 +55,7 @@ export function useRequestCallback<Query, Response = void>({
|
|
|
onError?.(err);
|
|
|
}
|
|
|
} finally {
|
|
|
- if (!cancelled) {
|
|
|
+ if (!unmounted) {
|
|
|
setLoading(false);
|
|
|
}
|
|
|
}
|
|
|
@@ -59,5 +66,5 @@ export function useRequestCallback<Query, Response = void>({
|
|
|
[onError, sendRequest],
|
|
|
);
|
|
|
|
|
|
- return [onRequest, response, loading];
|
|
|
+ return [onRequest, response, loading, cancel];
|
|
|
}
|