import { useEffect, useLayoutEffect, useRef, useState } from "react"; import { makeRequest } from "../api"; import { Tariff, GetTariffsResponse } from "../model/tariff"; import { devlog } from "../utils"; export function useTariffs({ url, tariffsPerPage, apiPage, onNewTariffs, onError }: { url: string; tariffsPerPage: number; apiPage: number; onNewTariffs: (response: Tariff[]) => void; onError?: (error: Error) => void; }) { const [fetchState, setFetchState] = useState<"fetching" | "idle" | "all fetched">("idle"); const onNewTariffsRef = useRef(onNewTariffs); const onErrorRef = useRef(onError); useLayoutEffect(() => { onNewTariffsRef.current = onNewTariffs; onErrorRef.current = onError; }, [onNewTariffs, onError]); useEffect(function fetchTickets() { const controller = new AbortController(); setFetchState("fetching"); makeRequest({ url, method: "get", useToken: true, signal: controller.signal, }).then((result) => { devlog("GetTariffsResponse", result); if (result.tariffs.length > 0) { onNewTariffsRef.current(result.tariffs); setFetchState("idle"); } else setFetchState("all fetched"); }).catch(error => { devlog("Error fetching tariffs", error); onErrorRef.current?.(error); }); return () => controller.abort(); }, [apiPage, tariffsPerPage, url]); return fetchState; }