UIKit/lib/hooks/useTariffs.ts

47 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-07-10 17:48:09 +00:00
import { useEffect, useLayoutEffect, useRef, useState } from "react";
2023-06-17 14:24:12 +00:00
import { makeRequest } from "../api";
import { Tariff, GetTariffsResponse } from "../model/tariff";
2023-06-17 14:27:22 +00:00
import { devlog } from "../utils";
2023-06-17 14:24:12 +00:00
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");
2023-07-10 17:48:09 +00:00
const onNewTariffsRef = useRef(onNewTariffs);
const onErrorRef = useRef(onError);
useLayoutEffect(() => {
onNewTariffsRef.current = onNewTariffs;
onErrorRef.current = onError;
}, [onNewTariffs, onError]);
2023-06-17 14:24:12 +00:00
useEffect(function fetchTickets() {
const controller = new AbortController();
setFetchState("fetching");
makeRequest<never, GetTariffsResponse>({
url,
method: "get",
useToken: true,
signal: controller.signal,
}).then((result) => {
2023-06-17 14:27:22 +00:00
devlog("GetTariffsResponse", result);
2023-06-17 14:24:12 +00:00
if (result.tariffs.length > 0) {
2023-07-10 17:48:09 +00:00
onNewTariffsRef.current(result.tariffs);
2023-06-17 14:24:12 +00:00
setFetchState("idle");
} else setFetchState("all fetched");
}).catch(error => {
2023-06-17 14:27:22 +00:00
devlog("Error fetching tariffs", error);
2023-07-10 17:48:09 +00:00
onErrorRef.current(error);
2023-06-17 14:24:12 +00:00
});
return () => controller.abort();
2023-07-10 17:48:09 +00:00
}, [apiPage, tariffsPerPage, url]);
2023-06-17 14:24:12 +00:00
return fetchState;
}