fix: resolve toggle flicker for "Auto Start" and "DNS Override"

This commit is contained in:
wonfen 2025-03-27 12:29:20 +08:00
parent 7716e2bc87
commit daad623855
3 changed files with 20 additions and 10 deletions

View File

@ -8,6 +8,8 @@
- 首页“当前代理”因为重复刷新导致的CPU占用过高的问题 - 首页“当前代理”因为重复刷新导致的CPU占用过高的问题
- 自定义托盘图标未能应用更改 - 自定义托盘图标未能应用更改
- MacOS 自定义托盘图标显示速率时图标和文本间隙过大 - MacOS 自定义托盘图标显示速率时图标和文本间隙过大
- 托盘图标无法自定义
- “开启自启”和“DNS覆写”开关跳动问题
#### 新增了: #### 新增了:
- ClashVergeRev 从现在开始不再强依赖系统服务和管理权限 - ClashVergeRev 从现在开始不再强依赖系统服务和管理权限

View File

@ -5,7 +5,6 @@ import {
SettingsRounded, SettingsRounded,
ShuffleRounded, ShuffleRounded,
LanRounded, LanRounded,
DnsRounded,
} from "@mui/icons-material"; } from "@mui/icons-material";
import { DialogRef, Notice, Switch } from "@/components/base"; import { DialogRef, Notice, Switch } from "@/components/base";
import { useClash } from "@/hooks/use-clash"; import { useClash } from "@/hooks/use-clash";
@ -49,7 +48,16 @@ const SettingClash = ({ onError }: Props) => {
const { enable_random_port = false, verge_mixed_port } = verge ?? {}; const { enable_random_port = false, verge_mixed_port } = verge ?? {};
// 独立跟踪DNS设置开关状态 // 独立跟踪DNS设置开关状态
const [dnsSettingsEnabled, setDnsSettingsEnabled] = useState(false); const [dnsSettingsEnabled, setDnsSettingsEnabled] = useState(() => {
// 尝试从localStorage获取之前保存的状态
const savedState = localStorage.getItem("dns_settings_enabled");
if (savedState !== null) {
return savedState === "true";
}
// 如果没有保存的状态则从verge配置中获取
return verge?.enable_dns_settings ?? false;
});
const { addListener } = useListen(); const { addListener } = useListen();
const webRef = useRef<DialogRef>(null); const webRef = useRef<DialogRef>(null);
@ -59,12 +67,6 @@ const SettingClash = ({ onError }: Props) => {
const networkRef = useRef<DialogRef>(null); const networkRef = useRef<DialogRef>(null);
const dnsRef = useRef<DialogRef>(null); const dnsRef = useRef<DialogRef>(null);
// 初始化时从verge配置中加载DNS设置开关状态
useEffect(() => {
const dnsSettingsState = verge?.enable_dns_settings ?? false;
setDnsSettingsEnabled(dnsSettingsState);
}, [verge]);
const onSwitchFormat = (_e: any, value: boolean) => value; const onSwitchFormat = (_e: any, value: boolean) => value;
const onChangeData = (patch: Partial<IConfigData>) => { const onChangeData = (patch: Partial<IConfigData>) => {
mutateClash((old) => ({ ...(old! || {}), ...patch }), false); mutateClash((old) => ({ ...(old! || {}), ...patch }), false);
@ -84,15 +86,21 @@ const SettingClash = ({ onError }: Props) => {
// 实现DNS设置开关处理函数 // 实现DNS设置开关处理函数
const handleDnsToggle = useLockFn(async (enable: boolean) => { const handleDnsToggle = useLockFn(async (enable: boolean) => {
try { try {
// 立即更新UI状态
setDnsSettingsEnabled(enable); setDnsSettingsEnabled(enable);
// 保存到localStorage用于记住用户的选择
localStorage.setItem("dns_settings_enabled", String(enable));
// 更新verge配置
await patchVerge({ enable_dns_settings: enable }); await patchVerge({ enable_dns_settings: enable });
await invoke("apply_dns_config", { apply: enable }); await invoke("apply_dns_config", { apply: enable });
setTimeout(() => { setTimeout(() => {
mutateClash(); mutateClash();
}, 500); // 延迟500ms确保后端完成处理 }, 500); // 延迟500ms确保后端完成处理
} catch (err: any) { } catch (err: any) {
Notice.error(err.message || err.toString()); // 如果出错,恢复原始状态
setDnsSettingsEnabled(!enable); setDnsSettingsEnabled(!enable);
localStorage.setItem("dns_settings_enabled", String(!enable));
Notice.error(err.message || err.toString());
await patchVerge({ enable_dns_settings: !enable }).catch(() => { await patchVerge({ enable_dns_settings: !enable }).catch(() => {
// 忽略恢复状态时的错误 // 忽略恢复状态时的错误
}); });
@ -143,7 +151,6 @@ const SettingClash = ({ onError }: Props) => {
/> />
} }
> >
{/* 使用独立状态不再依赖dns?.enable */}
<Switch <Switch
edge="end" edge="end"
checked={dnsSettingsEnabled} checked={dnsSettingsEnabled}

View File

@ -43,6 +43,7 @@ const SettingSystem = ({ onError }: Props) => {
const { data: autoLaunchEnabled } = useSWR( const { data: autoLaunchEnabled } = useSWR(
"getAutoLaunchStatus", "getAutoLaunchStatus",
getAutoLaunchStatus, getAutoLaunchStatus,
{ revalidateOnFocus: false }
); );
// 当实际自启动状态与配置不同步时更新配置 // 当实际自启动状态与配置不同步时更新配置