front-hub/src/utils/hooks/useTariffFetcher.ts
2024-05-29 14:58:54 +03:00

58 lines
1.4 KiB
TypeScript

import { useEffect, useLayoutEffect, useRef, useState } from "react";
import { getTariffs } from "@root/api/tariff";
import type { Tariff } from "@frontend/kitui";
export function useTariffFetcher({
tariffsPerPage,
apiPage,
onSuccess,
onError,
}: {
baseUrl?: string;
tariffsPerPage: number;
apiPage: number;
onSuccess: (response: Tariff[]) => void;
onError?: (error: Error) => void;
}) {
const [fetchState, setFetchState] = useState<
"fetching" | "idle" | "all fetched"
>("idle");
const onSuccessRef = useRef(onSuccess);
const onErrorRef = useRef(onError);
useLayoutEffect(() => {
onSuccessRef.current = onSuccess;
onErrorRef.current = onError;
}, [onError, onSuccess]);
useEffect(() => {
const controller = new AbortController();
const getTariffsRequest = async () => {
setFetchState("fetching");
const [tariffs, tariffsError] = await getTariffs(
apiPage,
tariffsPerPage,
controller.signal
);
if (tariffsError) {
return onErrorRef.current?.(new Error(tariffsError));
}
if (tariffs && tariffs.tariffs.length > 0) {
onSuccessRef.current(tariffs.tariffs);
setFetchState("idle");
} else setFetchState("all fetched");
};
getTariffsRequest();
return () => controller.abort();
}, [apiPage, tariffsPerPage]);
return fetchState;
}