UIKit/lib/hooks/useTicketMessages.ts

59 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-08-29 11:16:10 +00:00
import { useEffect, useRef, useLayoutEffect } from "react";
2023-06-06 10:02:17 +00:00
import { TicketMessage, GetMessagesRequest, GetMessagesResponse } from "../model";
import { devlog } from "../utils";
2023-06-11 09:55:06 +00:00
import { makeRequest } from "../api";
2023-08-29 11:16:10 +00:00
import { FetchState } from "../model/fetchState";
2023-06-06 10:02:17 +00:00
2023-08-29 11:16:10 +00:00
export function useTicketMessages({ url, messageApiPage, messagesPerPage, ticketId, isUnauth = false, onSuccess, onError, onFetchStateChange }: {
2023-06-06 10:02:17 +00:00
url: string;
ticketId: string | undefined;
messagesPerPage: number;
messageApiPage: number;
isUnauth?: boolean;
2023-08-29 11:16:10 +00:00
onSuccess: (messages: TicketMessage[]) => void;
onError?: (error: Error) => void;
onFetchStateChange?: (state: FetchState) => void;
2023-06-06 10:02:17 +00:00
}) {
2023-08-29 11:16:10 +00:00
const onNewMessagesRef = useRef(onSuccess);
2023-07-10 17:48:09 +00:00
const onErrorRef = useRef(onError);
2023-08-29 11:16:10 +00:00
const onFetchStateChangeRef = useRef(onFetchStateChange);
2023-07-10 17:48:09 +00:00
useLayoutEffect(() => {
2023-08-29 11:16:10 +00:00
onNewMessagesRef.current = onSuccess;
2023-07-10 17:48:09 +00:00
onErrorRef.current = onError;
2023-08-29 11:16:10 +00:00
onFetchStateChangeRef.current = onFetchStateChange;
}, [onSuccess, onError, onFetchStateChange]);
2023-06-06 10:02:17 +00:00
useEffect(function fetchTicketMessages() {
if (!ticketId) return;
const controller = new AbortController();
2023-08-29 11:16:10 +00:00
onFetchStateChangeRef.current?.("fetching");
2023-06-06 10:02:17 +00:00
makeRequest<GetMessagesRequest, GetMessagesResponse>({
url,
method: "POST",
useToken: !isUnauth,
body: {
amt: messagesPerPage,
page: messageApiPage,
ticket: ticketId,
},
signal: controller.signal,
withCredentials: isUnauth,
}).then(result => {
devlog("GetMessagesResponse", result);
if (result?.length > 0) {
2023-07-10 17:48:09 +00:00
onNewMessagesRef.current(result);
2023-08-29 11:16:10 +00:00
onFetchStateChangeRef.current?.("idle");
} else onFetchStateChangeRef.current?.("all fetched");
2023-06-06 10:02:17 +00:00
}).catch(error => {
devlog("Error fetching messages", error);
2023-08-28 14:30:43 +00:00
onErrorRef.current?.(error);
2023-06-06 10:02:17 +00:00
});
return () => controller.abort();
2023-07-10 17:48:09 +00:00
}, [isUnauth, messageApiPage, messagesPerPage, ticketId, url]);
2023-08-28 14:30:43 +00:00
}