From 1a51062aa13e581debd8d86d487a05c01149e482 Mon Sep 17 00:00:00 2001 From: GyDi <segydi@foxmail.com> Date: Wed, 22 Dec 2021 02:08:44 +0800 Subject: [PATCH] feat: supprt log ui --- src/components/log-item.tsx | 21 ++++++++++++++ src/pages/log.tsx | 58 +++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/components/log-item.tsx diff --git a/src/components/log-item.tsx b/src/components/log-item.tsx new file mode 100644 index 0000000..89e6629 --- /dev/null +++ b/src/components/log-item.tsx @@ -0,0 +1,21 @@ +import { styled, Box } from "@mui/material"; + +const LogItem = styled(Box)(({ theme }) => ({ + padding: "8px 0", + margin: "0 12px", + lineHeight: 1.35, + borderBottom: `1px solid ${theme.palette.divider}`, + "& .time": {}, + "& .type": { + display: "inline-block", + width: 50, + margin: "0 4px", + textAlign: "center", + borderRadius: 2, + textTransform: "uppercase", + fontWeight: "600", + }, + "& .data": {}, +})); + +export default LogItem; diff --git a/src/pages/log.tsx b/src/pages/log.tsx index cf4cd6a..cf26566 100644 --- a/src/pages/log.tsx +++ b/src/pages/log.tsx @@ -1,21 +1,69 @@ -import { useEffect } from "react"; -import { Box, Typography } from "@mui/material"; +import dayjs from "dayjs"; +import { useEffect, useRef, useState } from "react"; +import { Box, Button, Paper, Typography } from "@mui/material"; +import { Virtuoso } from "react-virtuoso"; +import LogItem from "../components/log-item"; import services from "../services"; +let logCache: any[] = []; + const LogPage = () => { + const [logData, setLogData] = useState<any[]>(logCache); + useEffect(() => { - const sourcePromise = services.getLogs(console.log); + const sourcePromise = services.getLogs((t) => { + const time = dayjs().format("MM-DD HH:mm:ss"); + const item = { ...t, time }; + setLogData((l) => (logCache = [...l, item])); + }); return () => { - sourcePromise.then((src) => src.cancel()); + sourcePromise.then((src) => src.cancel("cancel")); }; }, []); return ( - <Box sx={{ width: 0.9, maxWidth: "850px", mx: "auto", mb: 2 }}> + <Box + sx={{ + position: "relative", + width: 0.9, + maxWidth: "850px", + height: "100%", + mx: "auto", + }} + > <Typography variant="h4" component="h1" sx={{ py: 2 }}> Logs </Typography> + + <Button + size="small" + variant="contained" + sx={{ position: "absolute", top: 22, right: 0 }} + onClick={() => { + setLogData([]); + logCache = []; + }} + > + Clear + </Button> + + <Paper sx={{ boxShadow: 2, height: "calc(100% - 100px)" }}> + <Virtuoso + initialTopMostItemIndex={999} + data={logData} + itemContent={(index, logItem) => { + return ( + <LogItem> + <span className="time">{logItem.time}</span> + <span className="type">{logItem.type}</span> + <span className="data">{logItem.payload}</span> + </LogItem> + ); + }} + followOutput={"smooth"} + /> + </Paper> </Box> ); }; -- GitLab