UIKit/lib/hooks/useTickets.ts

52 lines
1.7 KiB
TypeScript
Raw Normal View History

2023-07-10 17:48:09 +00:00
import { useState, useEffect, useRef, useLayoutEffect } from "react";
2023-06-06 10:02:17 +00:00
import { GetTicketsResponse, GetTicketsRequest } from "../model";
import { devlog } from "../utils";
2023-06-11 09:55:06 +00:00
import { makeRequest } from "../api";
2023-06-06 10:02:17 +00:00
2023-06-11 09:55:06 +00:00
export function useTickets({ url, ticketsPerPage, ticketApiPage, onNewTickets, onError }: {
2023-06-06 10:02:17 +00:00
url: string;
ticketsPerPage: number;
ticketApiPage: number;
onNewTickets: (response: GetTicketsResponse) => void;
onError: (error: Error) => void;
}) {
const [fetchState, setFetchState] = useState<"fetching" | "idle" | "all fetched">("idle");
2023-07-10 17:48:09 +00:00
const onNewTicketsRef = useRef(onNewTickets);
const onErrorRef = useRef(onError);
useLayoutEffect(() => {
onNewTicketsRef.current = onNewTickets;
onErrorRef.current = onError;
}, [onNewTickets, onError]);
2023-06-06 10:02:17 +00:00
useEffect(function fetchTickets() {
const controller = new AbortController();
setFetchState("fetching");
makeRequest<GetTicketsRequest, GetTicketsResponse>({
url,
method: "POST",
useToken: true,
body: {
amt: ticketsPerPage,
page: ticketApiPage,
status: "open",
},
signal: controller.signal,
}).then((result) => {
devlog("GetTicketsResponse", result);
if (result.data) {
2023-07-10 17:48:09 +00:00
onNewTicketsRef.current(result);
2023-06-06 10:02:17 +00:00
setFetchState("idle");
} else setFetchState("all fetched");
}).catch(error => {
2023-06-17 14:27:22 +00:00
devlog("Error fetching tickets", error);
2023-07-10 17:48:09 +00:00
onErrorRef.current(error);
2023-06-06 10:02:17 +00:00
});
return () => controller.abort();
2023-07-10 17:48:09 +00:00
}, [ticketApiPage, ticketsPerPage, url]);
2023-06-06 10:02:17 +00:00
return fetchState;
}