UIKit/lib/hooks/useAllTariffsFetcher.ts

61 lines
1.8 KiB
TypeScript
Raw Normal View History

2023-08-29 13:24:51 +00:00
import { useRef, useLayoutEffect, useEffect } from "react";
2023-08-29 13:25:57 +00:00
import { GetTariffsResponse, Tariff } from "../model/tariff";
import { makeRequest } from "../api/makeRequest";
2023-08-29 13:24:51 +00:00
export function useAllTariffsFetcher({
enabled = true,
baseUrl = process.env.REACT_APP_DOMAIN + "/strator/tariff",
2023-08-29 13:24:51 +00:00
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,
});
2025-02-18 20:09:55 +00:00
if (result) onNewTariffsRef.current(result.tariffs);
if (result.totalPages < apiPage) {
2023-08-29 13:24:51 +00:00
apiPage++;
} else {
isDone = true;
}
} catch (error) {
onErrorRef.current?.(error as Error);
isDone = true;
}
}
}
getPaginatedTariffs();
return () => controller.abort();
}, [baseUrl, enabled]);
}