log.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import dayjs from "dayjs";
  2. import { useEffect, useRef, useState } from "react";
  3. import { Box, Button, Paper, Typography } from "@mui/material";
  4. import { Virtuoso } from "react-virtuoso";
  5. import LogItem from "../components/log-item";
  6. import services from "../services";
  7. let logCache: any[] = [];
  8. const LogPage = () => {
  9. const [logData, setLogData] = useState<any[]>(logCache);
  10. useEffect(() => {
  11. const sourcePromise = services.getLogs((t) => {
  12. const time = dayjs().format("MM-DD HH:mm:ss");
  13. const item = { ...t, time };
  14. setLogData((l) => (logCache = [...l, item]));
  15. });
  16. return () => {
  17. sourcePromise.then((src) => src.cancel("cancel"));
  18. };
  19. }, []);
  20. return (
  21. <Box
  22. sx={{
  23. position: "relative",
  24. width: 0.9,
  25. maxWidth: "850px",
  26. height: "100%",
  27. mx: "auto",
  28. }}
  29. >
  30. <Typography variant="h4" component="h1" sx={{ py: 2 }}>
  31. Logs
  32. </Typography>
  33. <Button
  34. size="small"
  35. variant="contained"
  36. sx={{ position: "absolute", top: 22, right: 0 }}
  37. onClick={() => {
  38. setLogData([]);
  39. logCache = [];
  40. }}
  41. >
  42. Clear
  43. </Button>
  44. <Paper sx={{ boxShadow: 2, height: "calc(100% - 100px)" }}>
  45. <Virtuoso
  46. initialTopMostItemIndex={999}
  47. data={logData}
  48. itemContent={(index, logItem) => {
  49. return (
  50. <LogItem>
  51. <span className="time">{logItem.time}</span>
  52. <span className="type">{logItem.type}</span>
  53. <span className="data">{logItem.payload}</span>
  54. </LogItem>
  55. );
  56. }}
  57. followOutput={"smooth"}
  58. />
  59. </Paper>
  60. </Box>
  61. );
  62. };
  63. export default LogPage;