fix: hover jump navigator

This commit is contained in:
Slinetrac
2025-10-19 16:00:45 +08:00
Unverified
parent a60cab989d
commit fbe6cefbdb
2 changed files with 26 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
import { Box, Button, Tooltip } from "@mui/material";
import { useCallback, useMemo } from "react";
import { useCallback, useMemo, useRef } from "react";
interface ProxyGroupNavigatorProps {
proxyGroupNames: string[];
@@ -19,6 +19,8 @@ export const ProxyGroupNavigator = ({
proxyGroupNames,
onGroupLocation,
}: ProxyGroupNavigatorProps) => {
const lastHoveredRef = useRef<string | null>(null);
const handleGroupClick = useCallback(
(groupName: string) => {
onGroupLocation(groupName);
@@ -26,6 +28,19 @@ export const ProxyGroupNavigator = ({
[onGroupLocation],
);
const handleGroupHover = useCallback(
(groupName: string) => {
if (lastHoveredRef.current === groupName) return;
lastHoveredRef.current = groupName;
onGroupLocation(groupName);
},
[onGroupLocation],
);
const handleButtonLeave = useCallback(() => {
lastHoveredRef.current = null;
}, []);
// 处理代理组数据,去重和排序
const processedGroups = useMemo(() => {
return proxyGroupNames
@@ -66,6 +81,9 @@ export const ProxyGroupNavigator = ({
size="small"
variant="text"
onClick={() => handleGroupClick(name)}
onMouseEnter={() => handleGroupHover(name)}
onFocus={() => handleGroupHover(name)}
onMouseLeave={handleButtonLeave}
sx={{
minWidth: 28,
minHeight: 28,

View File

@@ -13,16 +13,12 @@ import { useLockFn } from "ahooks";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { Virtuoso, type VirtuosoHandle } from "react-virtuoso";
import useSWR from "swr";
import { delayGroup, healthcheckProxyProvider } from "tauri-plugin-mihomo-api";
import { useProxySelection } from "@/hooks/use-proxy-selection";
import { useVerge } from "@/hooks/use-verge";
import { useAppData } from "@/providers/app-data-context";
import {
getRuntimeConfig,
updateProxyChainConfigInRuntime,
} from "@/services/cmds";
import { updateProxyChainConfigInRuntime } from "@/services/cmds";
import delayManager from "@/services/delay";
import { BaseEmpty } from "../base";
@@ -347,22 +343,6 @@ export const ProxyGroups = (props: Props) => {
}
};
// 获取运行时配置
const { data: runtimeConfig } = useSWR("getRuntimeConfig", getRuntimeConfig, {
revalidateOnFocus: false,
revalidateIfStale: true,
});
// 获取所有代理组名称
const getProxyGroupNames = useCallback(() => {
const config = runtimeConfig as any;
if (!config?.["proxy-groups"]) return [];
return config["proxy-groups"]
.map((group: any) => group.name)
.filter((name: string) => name && name.trim() !== "");
}, [runtimeConfig]);
// 定位到指定的代理组
const handleGroupLocationByName = useCallback(
(groupName: string) => {
@@ -381,10 +361,12 @@ export const ProxyGroups = (props: Props) => {
[renderList],
);
const proxyGroupNames = useMemo(
() => getProxyGroupNames(),
[getProxyGroupNames],
);
const proxyGroupNames = useMemo(() => {
const names = renderList
.filter((item) => item.type === 0 && item.group?.name)
.map((item) => item.group!.name);
return Array.from(new Set(names));
}, [renderList]);
if (mode === "direct") {
return <BaseEmpty text={t("clash_mode_direct")} />;