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;
|
|
|
|
}
|