feat: enhance log data
This commit is contained in:
parent
12ac7bb338
commit
dd15455031
@ -7,9 +7,10 @@ import { listen } from "@tauri-apps/api/event";
|
|||||||
import { ApiType } from "../../services/types";
|
import { ApiType } from "../../services/types";
|
||||||
import { getInfomation } from "../../services/api";
|
import { getInfomation } from "../../services/api";
|
||||||
import { getVergeConfig } from "../../services/cmds";
|
import { getVergeConfig } from "../../services/cmds";
|
||||||
import { atomClashPort } from "../../states/setting";
|
import { atomClashPort } from "../../services/states";
|
||||||
import parseTraffic from "../../utils/parse-traffic";
|
import useLogSetup from "./use-log-setup";
|
||||||
import useTrafficGraph from "./use-traffic-graph";
|
import useTrafficGraph from "./use-traffic-graph";
|
||||||
|
import parseTraffic from "../../utils/parse-traffic";
|
||||||
|
|
||||||
const LayoutTraffic = () => {
|
const LayoutTraffic = () => {
|
||||||
const portValue = useRecoilValue(atomClashPort);
|
const portValue = useRecoilValue(atomClashPort);
|
||||||
@ -21,6 +22,9 @@ const LayoutTraffic = () => {
|
|||||||
const { data } = useSWR("getVergeConfig", getVergeConfig);
|
const { data } = useSWR("getVergeConfig", getVergeConfig);
|
||||||
const trafficGraph = data?.traffic_graph ?? true;
|
const trafficGraph = data?.traffic_graph ?? true;
|
||||||
|
|
||||||
|
// setup log ws during layout
|
||||||
|
useLogSetup();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let unlisten: () => void = null!;
|
let unlisten: () => void = null!;
|
||||||
|
|
||||||
|
49
src/components/layout/use-log-setup.ts
Normal file
49
src/components/layout/use-log-setup.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import dayjs from "dayjs";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
import { useSetRecoilState } from "recoil";
|
||||||
|
import { listen } from "@tauri-apps/api/event";
|
||||||
|
import { ApiType } from "../../services/types";
|
||||||
|
import { getInfomation } from "../../services/api";
|
||||||
|
import { atomLogData } from "../../services/states";
|
||||||
|
|
||||||
|
const MAX_LOG_NUM = 1000;
|
||||||
|
|
||||||
|
// setup the log websocket
|
||||||
|
export default function useLogSetup() {
|
||||||
|
const setLogData = useSetRecoilState(atomLogData);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let ws: WebSocket = null!;
|
||||||
|
let unlisten: () => void = null!;
|
||||||
|
|
||||||
|
const handler = (event: MessageEvent<any>) => {
|
||||||
|
const data = JSON.parse(event.data) as ApiType.LogItem;
|
||||||
|
const time = dayjs().format("MM-DD HH:mm:ss");
|
||||||
|
setLogData((l) => {
|
||||||
|
if (l.length >= MAX_LOG_NUM) l.shift();
|
||||||
|
return [...l, { ...data, time }];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const { server = "", secret = "" } = await getInfomation();
|
||||||
|
|
||||||
|
ws = new WebSocket(`ws://${server}/logs?token=${secret}`);
|
||||||
|
ws.addEventListener("message", handler);
|
||||||
|
|
||||||
|
// reconnect the websocket
|
||||||
|
unlisten = await listen("restart_clash", async () => {
|
||||||
|
const { server = "", secret = "" } = await getInfomation();
|
||||||
|
|
||||||
|
ws?.close();
|
||||||
|
ws = new WebSocket(`ws://${server}/logs?token=${secret}`);
|
||||||
|
ws.addEventListener("message", handler);
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
ws?.close();
|
||||||
|
unlisten?.();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
}
|
@ -11,7 +11,7 @@ import {
|
|||||||
Typography,
|
Typography,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { ApiType } from "../../services/types";
|
import { ApiType } from "../../services/types";
|
||||||
import { atomClashPort } from "../../states/setting";
|
import { atomClashPort } from "../../services/states";
|
||||||
import { patchClashConfig } from "../../services/cmds";
|
import { patchClashConfig } from "../../services/cmds";
|
||||||
import { SettingList, SettingItem } from "./setting";
|
import { SettingList, SettingItem } from "./setting";
|
||||||
import { getClashConfig, getVersion, updateConfigs } from "../../services/api";
|
import { getClashConfig, getVersion, updateConfigs } from "../../services/api";
|
||||||
|
@ -1,38 +1,12 @@
|
|||||||
import dayjs from "dayjs";
|
import { useRecoilState } from "recoil";
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { Button, Paper } from "@mui/material";
|
import { Button, Paper } from "@mui/material";
|
||||||
import { Virtuoso } from "react-virtuoso";
|
import { Virtuoso } from "react-virtuoso";
|
||||||
import { ApiType } from "../services/types";
|
import { atomLogData } from "../services/states";
|
||||||
import { getInfomation } from "../services/api";
|
|
||||||
import BasePage from "../components/base/base-page";
|
import BasePage from "../components/base/base-page";
|
||||||
import LogItem from "../components/log/log-item";
|
import LogItem from "../components/log/log-item";
|
||||||
|
|
||||||
let logCache: ApiType.LogItem[] = [];
|
|
||||||
|
|
||||||
const LogPage = () => {
|
const LogPage = () => {
|
||||||
const [logData, setLogData] = useState(logCache);
|
const [logData, setLogData] = useRecoilState(atomLogData);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
let ws: WebSocket | null = null;
|
|
||||||
|
|
||||||
getInfomation().then((result) => {
|
|
||||||
const { server = "", secret = "" } = result;
|
|
||||||
ws = new WebSocket(`ws://${server}/logs?token=${secret}`);
|
|
||||||
|
|
||||||
ws.addEventListener("message", (event) => {
|
|
||||||
const data = JSON.parse(event.data) as ApiType.LogItem;
|
|
||||||
const time = dayjs().format("MM-DD HH:mm:ss");
|
|
||||||
setLogData((l) => (logCache = [...l, { ...data, time }]));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return () => ws?.close();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const onClear = () => {
|
|
||||||
setLogData([]);
|
|
||||||
logCache = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BasePage
|
<BasePage
|
||||||
@ -43,7 +17,7 @@ const LogPage = () => {
|
|||||||
size="small"
|
size="small"
|
||||||
sx={{ mt: 1 }}
|
sx={{ mt: 1 }}
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={onClear}
|
onClick={() => setLogData([])}
|
||||||
>
|
>
|
||||||
Clear
|
Clear
|
||||||
</Button>
|
</Button>
|
||||||
|
12
src/services/states.ts
Normal file
12
src/services/states.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { atom } from "recoil";
|
||||||
|
import { ApiType } from "./types";
|
||||||
|
|
||||||
|
export const atomClashPort = atom<number>({
|
||||||
|
key: "atomClashPort",
|
||||||
|
default: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const atomLogData = atom<ApiType.LogItem[]>({
|
||||||
|
key: "atomLogData",
|
||||||
|
default: [],
|
||||||
|
});
|
@ -1,6 +0,0 @@
|
|||||||
import { atom } from "recoil";
|
|
||||||
|
|
||||||
export const atomClashPort = atom<number>({
|
|
||||||
key: "atomClashPort",
|
|
||||||
default: 0,
|
|
||||||
});
|
|
Loading…
Reference in New Issue
Block a user