import { CircularProgress, List, ListItem, Box, useTheme, Pagination } from "@mui/material"; import { useEffect, useState } from "react"; import TicketCard from "./TicketCard"; import { useSnackbar } from "notistack"; import { apiRequestHandler } from "@utils/api/apiRequestHandler"; import { ApiError, Ticket } from "@utils/api/types"; const TICKETS_PER_PAGE = 10; export default function TicketList() { const theme = useTheme(); const { enqueueSnackbar } = useSnackbar(); const [tickets, setTickets] = useState([]); const [ticketCount, setTicketCount] = useState(null); const [currentPage, setCurrentPage] = useState(0); const [isLoading, setIsLoading] = useState(false); useEffect(function fetchTickets() { setIsLoading(true); const abortController = new AbortController(); apiRequestHandler .getTickets({ amt: TICKETS_PER_PAGE, page: currentPage, srch: "", status: "open" }, abortController.signal) .then((result) => { if (result instanceof ApiError) { enqueueSnackbar(`Error: ${result.message}`); } else if (result instanceof Error) { console.log(result); } else { setTickets(result.data); setTicketCount(result.count); setIsLoading(false); } }); return () => { abortController.abort(); }; }, [currentPage, enqueueSnackbar]); useEffect(function subscribeToTickets() { const unsubscribe = apiRequestHandler.subscribeToAllTickets({ onMessage(event) { console.log("SSE received:", event.data); try { const newTicket = JSON.parse(event.data) as Ticket; const existingTicketIndex = tickets.findIndex((ticket) => ticket.id === newTicket.id); if (existingTicketIndex !== -1) { setTickets((prevTickets) => { const newTickets = prevTickets.slice(); newTickets.splice(existingTicketIndex, 1, newTicket); return newTickets; }); return; } setTickets((prevTickets) => [newTicket, ...prevTickets.slice(0, TICKETS_PER_PAGE - 1)]); } catch (error) { console.log("SSE is not JSON", error); } }, onError(event) { console.log("SSE Error:", event); }, }); return () => { unsubscribe(); }; }, [tickets]); return ( {tickets.map((ticket) => ( ))} {isLoading && ( )} {ticketCount !== null && ticketCount > TICKETS_PER_PAGE && ( setCurrentPage(value - 1)} sx={{ alignSelf: "center" }} /> )} ); }