58 lines
1.4 KiB
TypeScript
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;
|
|
}
|