import { CircularProgress, List, ListItem, Box, useTheme, Pagination } from "@mui/material"; import { useEffect, useState } from "react"; import { apiRequestHandler } from "../../utils/api/apiRequestHandler"; import { ApiError, Ticket } from "../../utils/api/types"; import TicketCard from "./TicketCard"; import { useSnackbar } from "notistack"; 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}`); return; } else if (result instanceof Error) { console.log(result); return; } 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); const newTicket = event.data; if (typeof newTicket === "string") return; 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)]); }, 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" }} /> } ); }