* feat: add tauri-plugin-mihomo * refactor: invock mihomo api by use tauri-plugin-mihomo * chore: todo * chore: update * chore: update * chore: update * chore: update * fix: incorrect delay status and update pretty config * chore: update * chore: remove cache * chore: update * chore: update * fix: app freezed when change group proxy * chore: update * chore: update * chore: add rustfmt.toml to tauri-plugin-mihomo * chore: happy clippy * refactor: connect mihomo websocket * chore: update * chore: update * fix: parse bigint to number * chore: update * Revert "fix: parse bigint to number" This reverts commit 74c006522e23aa52cf8979a8fb47d2b1ae0bb043. * chore: use number instead of bigint * chore: cleanup * fix: rule data not refresh when switch profile * chore: update * chore: cleanup * chore: update * fix: traffic graph data display * feat: add ipc connection pool * chore: update * chore: clippy * fix: incorrect delay status * fix: typo * fix: empty proxies tray menu * chore: clippy * chore: import tauri-plugin-mihomo by using git repo * chore: cleanup * fix: mihomo api * fix: incorrect delay status * chore: update tauri-plugin-mihomo dep chore: update
99 lines
3.1 KiB
TypeScript
99 lines
3.1 KiB
TypeScript
import { DeveloperBoardOutlined } from "@mui/icons-material";
|
||
import { Divider, Stack, Typography } from "@mui/material";
|
||
import { useMemo } from "react";
|
||
import { useTranslation } from "react-i18next";
|
||
|
||
import { useClash } from "@/hooks/use-clash";
|
||
import { useAppData } from "@/providers/app-data-context";
|
||
|
||
import { EnhancedCard } from "./enhanced-card";
|
||
|
||
// 将毫秒转换为时:分:秒格式的函数
|
||
const formatUptime = (uptimeMs: number) => {
|
||
const hours = Math.floor(uptimeMs / 3600000);
|
||
const minutes = Math.floor((uptimeMs % 3600000) / 60000);
|
||
const seconds = Math.floor((uptimeMs % 60000) / 1000);
|
||
return `${hours}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
||
};
|
||
|
||
export const ClashInfoCard = () => {
|
||
const { t } = useTranslation();
|
||
const { version: clashVersion } = useClash();
|
||
const { clashConfig, rules, uptime, systemProxyAddress } = useAppData();
|
||
|
||
// 使用useMemo缓存格式化后的uptime,避免频繁计算
|
||
const formattedUptime = useMemo(() => formatUptime(uptime), [uptime]);
|
||
|
||
// 使用备忘录组件内容,减少重新渲染
|
||
const cardContent = useMemo(() => {
|
||
if (!clashConfig) return null;
|
||
|
||
return (
|
||
<Stack spacing={1.5}>
|
||
<Stack direction="row" justifyContent="space-between">
|
||
<Typography variant="body2" color="text.secondary">
|
||
{t("Core Version")}
|
||
</Typography>
|
||
<Typography variant="body2" fontWeight="medium">
|
||
{clashVersion || "-"}
|
||
</Typography>
|
||
</Stack>
|
||
<Divider />
|
||
<Stack direction="row" justifyContent="space-between">
|
||
<Typography variant="body2" color="text.secondary">
|
||
{t("System Proxy Address")}
|
||
</Typography>
|
||
<Typography variant="body2" fontWeight="medium">
|
||
{systemProxyAddress}
|
||
</Typography>
|
||
</Stack>
|
||
<Divider />
|
||
<Stack direction="row" justifyContent="space-between">
|
||
<Typography variant="body2" color="text.secondary">
|
||
{t("Mixed Port")}
|
||
</Typography>
|
||
<Typography variant="body2" fontWeight="medium">
|
||
{clashConfig.mixedPort || "-"}
|
||
</Typography>
|
||
</Stack>
|
||
<Divider />
|
||
<Stack direction="row" justifyContent="space-between">
|
||
<Typography variant="body2" color="text.secondary">
|
||
{t("Uptime")}
|
||
</Typography>
|
||
<Typography variant="body2" fontWeight="medium">
|
||
{formattedUptime}
|
||
</Typography>
|
||
</Stack>
|
||
<Divider />
|
||
<Stack direction="row" justifyContent="space-between">
|
||
<Typography variant="body2" color="text.secondary">
|
||
{t("Rules Count")}
|
||
</Typography>
|
||
<Typography variant="body2" fontWeight="medium">
|
||
{rules.length}
|
||
</Typography>
|
||
</Stack>
|
||
</Stack>
|
||
);
|
||
}, [
|
||
clashConfig,
|
||
clashVersion,
|
||
t,
|
||
formattedUptime,
|
||
rules.length,
|
||
systemProxyAddress,
|
||
]);
|
||
|
||
return (
|
||
<EnhancedCard
|
||
title={t("Clash Info")}
|
||
icon={<DeveloperBoardOutlined />}
|
||
iconColor="warning"
|
||
action={null}
|
||
>
|
||
{cardContent}
|
||
</EnhancedCard>
|
||
);
|
||
};
|