Files
clash-verge-rev/src/pages/logs.tsx
T

126 lines
3.2 KiB
TypeScript
Raw Normal View History

2022-04-11 01:46:33 +08:00
import { useMemo, useState } from "react";
2022-02-23 02:00:45 +08:00
import { useRecoilState } from "recoil";
2022-09-20 22:15:28 +08:00
import {
Box,
Button,
IconButton,
MenuItem,
Paper,
Select,
TextField,
} from "@mui/material";
2021-12-22 02:08:44 +08:00
import { Virtuoso } from "react-virtuoso";
2022-03-12 23:07:45 +08:00
import { useTranslation } from "react-i18next";
2022-09-20 22:15:28 +08:00
import {
PlayCircleOutlineRounded,
PauseCircleOutlineRounded,
} from "@mui/icons-material";
import { atomEnableLog, atomLogData } from "@/services/states";
2022-11-20 22:03:55 +08:00
import { BaseEmpty, BasePage } from "@/components/base";
2022-09-20 22:15:28 +08:00
import LogItem from "@/components/log/log-item";
2021-12-13 02:27:38 +08:00
2021-12-08 23:36:34 +08:00
const LogPage = () => {
2022-03-12 23:07:45 +08:00
const { t } = useTranslation();
2022-02-23 02:00:45 +08:00
const [logData, setLogData] = useRecoilState(atomLogData);
2022-09-20 22:15:28 +08:00
const [enableLog, setEnableLog] = useRecoilState(atomEnableLog);
2022-01-16 03:11:07 +08:00
2022-04-11 01:46:33 +08:00
const [logState, setLogState] = useState("all");
const [filterText, setFilterText] = useState("");
const filterLogs = useMemo(() => {
return logData.filter((data) => {
return (
data.payload.includes(filterText) &&
(logState === "all" ? true : data.type.includes(logState))
);
});
}, [logData, logState, filterText]);
2021-12-13 02:27:38 +08:00
return (
2022-01-16 03:11:07 +08:00
<BasePage
2024-01-09 13:57:53 +08:00
full
2022-03-12 23:07:45 +08:00
title={t("Logs")}
2022-01-16 03:11:07 +08:00
contentStyle={{ height: "100%" }}
header={
2023-03-16 19:32:59 +08:00
<Box sx={{ mt: 1, display: "flex", alignItems: "center", gap: 2 }}>
2022-09-20 22:15:28 +08:00
<IconButton
size="small"
2022-10-29 19:22:15 +08:00
color="inherit"
2022-09-20 22:15:28 +08:00
onClick={() => setEnableLog((e) => !e)}
>
{enableLog ? (
<PauseCircleOutlineRounded />
) : (
<PlayCircleOutlineRounded />
)}
</IconButton>
<Button
size="small"
variant="contained"
onClick={() => setLogData([])}
>
{t("Clear")}
</Button>
</Box>
2022-01-16 03:11:07 +08:00
}
2021-12-22 02:08:44 +08:00
>
<Box
2022-11-23 17:42:01 +08:00
sx={{
2024-01-09 13:57:53 +08:00
pt: 1,
mb: 0.5,
mx: "10px",
height: "36px",
display: "flex",
alignItems: "center",
2022-11-23 17:42:01 +08:00
}}
>
2024-01-09 13:57:53 +08:00
<Select
size="small"
autoComplete="off"
value={logState}
onChange={(e) => setLogState(e.target.value)}
2024-01-20 16:05:01 +08:00
sx={{
width: 120,
height: 33.375,
mr: 1,
'[role="button"]': { py: 0.65 },
}}
2022-04-11 01:46:33 +08:00
>
2024-01-09 13:57:53 +08:00
<MenuItem value="all">ALL</MenuItem>
<MenuItem value="inf">INFO</MenuItem>
<MenuItem value="warn">WARN</MenuItem>
<MenuItem value="err">ERROR</MenuItem>
</Select>
2022-04-11 01:46:33 +08:00
2024-01-09 13:57:53 +08:00
<TextField
hiddenLabel
fullWidth
size="small"
autoComplete="off"
spellCheck="false"
variant="outlined"
placeholder={t("Filter conditions")}
value={filterText}
onChange={(e) => setFilterText(e.target.value)}
sx={{ input: { py: 0.65, px: 1.25 } }}
/>
</Box>
<Box height="calc(100% - 50px)">
{filterLogs.length > 0 ? (
<Virtuoso
initialTopMostItemIndex={999}
data={filterLogs}
itemContent={(index, item) => <LogItem value={item} />}
followOutput={"smooth"}
2022-04-11 01:46:33 +08:00
/>
2024-01-09 13:57:53 +08:00
) : (
<BaseEmpty text="No Logs" />
)}
</Box>
2022-01-16 03:11:07 +08:00
</BasePage>
2021-12-13 02:27:38 +08:00
);
2021-12-08 23:36:34 +08:00
};
export default LogPage;