61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { useRef, useLayoutEffect, useEffect } from "react";
|
|
import { GetTariffsResponse, Tariff } from "../model/tariff";
|
|
import { makeRequest } from "../api/makeRequest";
|
|
|
|
|
|
export function useAllTariffsFetcher({
|
|
enabled = true,
|
|
baseUrl = process.env.REACT_APP_DOMAIN + "/strator/tariff",
|
|
onSuccess,
|
|
onError,
|
|
}: {
|
|
enabled?: boolean;
|
|
baseUrl?: string;
|
|
onSuccess: (response: Tariff[]) => void;
|
|
onError?: (error: Error) => void;
|
|
}) {
|
|
const onNewTariffsRef = useRef(onSuccess);
|
|
const onErrorRef = useRef(onError);
|
|
|
|
useLayoutEffect(() => {
|
|
onNewTariffsRef.current = onSuccess;
|
|
onErrorRef.current = onError;
|
|
}, [onError, onSuccess]);
|
|
|
|
useEffect(() => {
|
|
if (!enabled) return;
|
|
|
|
const controller = new AbortController();
|
|
|
|
async function getPaginatedTariffs() {
|
|
let apiPage = 1;
|
|
const tariffsPerPage = 100;
|
|
let isDone = false;
|
|
|
|
while (!isDone) {
|
|
try {
|
|
const result = await makeRequest<never, GetTariffsResponse>({
|
|
url: baseUrl + `?page=${apiPage}&limit=${tariffsPerPage}`,
|
|
method: "get",
|
|
useToken: true,
|
|
signal: controller.signal,
|
|
});
|
|
if (result) onNewTariffsRef.current(result.tariffs);
|
|
if (result.totalPages < apiPage) {
|
|
apiPage++;
|
|
} else {
|
|
isDone = true;
|
|
}
|
|
} catch (error) {
|
|
onErrorRef.current?.(error as Error);
|
|
isDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
getPaginatedTariffs();
|
|
|
|
return () => controller.abort();
|
|
}, [baseUrl, enabled]);
|
|
}
|