import { Alert, Button, Center, CloseButton, Group, Modal, Pagination, Table, TextInput, Tooltip, } from "@mantine/core"; import { IconInfoCircle, IconSearch } from "@tabler/icons-react"; import { usePubSub } from "create-pubsub/react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { logEntriesPubSub } from "../../modules/logEntries"; export default function LogsModal({ opened, onClose, }: { opened: boolean; onClose: () => void; }) { const [logEntries] = usePubSub(logEntriesPubSub); const [page, setPage] = useState(1); const [filterText, setFilterText] = useState(""); const logEntriesPerPage = 5; const filteredLogEntries = useMemo(() => { if (!filterText) return logEntries; const lowerCaseFilter = filterText.toLowerCase(); return logEntries.filter((entry) => entry.message.toLowerCase().includes(lowerCaseFilter), ); }, [logEntries, filterText]); const logEntriesFromCurrentPage = useMemo( () => filteredLogEntries.slice( (page - 1) * logEntriesPerPage, page * logEntriesPerPage, ), [filteredLogEntries, page], ); useEffect(() => { void filterText; setPage(1); }, [filterText]); const downloadLogsAsJson = useCallback(() => { const jsonString = JSON.stringify(logEntries, null, 2); const blob = new Blob([jsonString], { type: "application/json" }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = "logs.json"; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }, [logEntries]); return ( } mb="md"> This information is stored solely in your browser for personal use. It isn't sent automatically and is retained for debugging purposes should you need to{" "} report a bug . } value={filterText} onChange={(event) => setFilterText(event.currentTarget.value)} rightSection={ filterText ? ( setFilterText("")} aria-label="Clear filter" /> ) : null } /> Time Message {logEntriesFromCurrentPage.map((entry, index) => ( {new Date(entry.timestamp).toLocaleTimeString()} {entry.message} ))}
); }