feat: better service status and TUN mode usable checks in Setting Page
This commit is contained in:
@@ -20,6 +20,7 @@ import {
|
||||
getAutotemProxy,
|
||||
installService,
|
||||
getAutoLaunchStatus,
|
||||
restartCore,
|
||||
} from "@/services/cmds";
|
||||
import { useLockFn } from "ahooks";
|
||||
import { Button, Tooltip } from "@mui/material";
|
||||
@@ -41,25 +42,18 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
const { data: autoLaunchEnabled } = useSWR(
|
||||
"getAutoLaunchStatus",
|
||||
getAutoLaunchStatus,
|
||||
{ revalidateOnFocus: false }
|
||||
{ revalidateOnFocus: false },
|
||||
);
|
||||
|
||||
const { isAdminMode, isSidecarMode, mutateRunningMode } = useSystemState();
|
||||
const { isAdminMode, isSidecarMode, mutateRunningMode, isServiceOk } =
|
||||
useSystemState();
|
||||
|
||||
console.log("Is service running:", isServiceOk);
|
||||
|
||||
// 判断Tun模式是否可用 - 当处于服务模式或管理员模式时可用
|
||||
const isTunAvailable = !isSidecarMode || isAdminMode;
|
||||
const isTunAvailable = isServiceOk || (isSidecarMode && !isAdminMode);
|
||||
|
||||
// 当实际自启动状态与配置不同步时更新配置
|
||||
useEffect(() => {
|
||||
if (
|
||||
autoLaunchEnabled !== undefined &&
|
||||
verge &&
|
||||
verge.enable_auto_launch !== autoLaunchEnabled
|
||||
) {
|
||||
// 静默更新配置,不触发UI刷新
|
||||
mutateVerge({ ...verge, enable_auto_launch: autoLaunchEnabled }, false);
|
||||
}
|
||||
}, [autoLaunchEnabled]);
|
||||
console.log("is tun isTunAvailable:", isTunAvailable);
|
||||
|
||||
const sysproxyRef = useRef<DialogRef>(null);
|
||||
const tunRef = useRef<DialogRef>(null);
|
||||
@@ -87,13 +81,16 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
// 安装系统服务
|
||||
const onInstallService = useLockFn(async () => {
|
||||
try {
|
||||
showNotice('info', t("Installing Service..."), 1000);
|
||||
showNotice("info", t("Installing Service..."), 1000);
|
||||
await installService();
|
||||
showNotice('success', t("Service Installed Successfully"), 2000);
|
||||
showNotice("success", t("Service Installed Successfully"), 2000);
|
||||
await restartCore();
|
||||
showNotice("info", t("Restarting Core"), 1000);
|
||||
console.log("restartCore");
|
||||
// 重新获取运行模式
|
||||
await mutateRunningMode();
|
||||
} catch (err: any) {
|
||||
showNotice('error', err.message || err.toString(), 3000);
|
||||
showNotice("error", err.message || err.toString(), 3000);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -111,12 +108,12 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
icon={SettingsRounded}
|
||||
onClick={() => tunRef.current?.open()}
|
||||
/>
|
||||
{isSidecarMode && !isAdminMode && (
|
||||
{!isServiceOk && !isAdminMode && (
|
||||
<Tooltip title={t("TUN requires Service Mode")}>
|
||||
<WarningRounded sx={{ color: "warning.main", mr: 1 }} />
|
||||
</Tooltip>
|
||||
)}
|
||||
{isSidecarMode && !isAdminMode && (
|
||||
{!isServiceOk && !isAdminMode && (
|
||||
<Tooltip title={t("Install Service")}>
|
||||
<Button
|
||||
variant="outlined"
|
||||
@@ -138,20 +135,20 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
onCatch={onError}
|
||||
onFormat={onSwitchFormat}
|
||||
onChange={(e) => {
|
||||
// 当在sidecar模式下且非管理员模式时禁用切换
|
||||
if (isSidecarMode && !isAdminMode) return;
|
||||
// 非 Service 状态禁止切换
|
||||
if (!isServiceOk) return;
|
||||
onChangeData({ enable_tun_mode: e });
|
||||
}}
|
||||
onGuard={(e) => {
|
||||
// 当在sidecar模式下且非管理员模式时禁用切换
|
||||
if (isSidecarMode && !isAdminMode) {
|
||||
showNotice('error', t("TUN requires Service Mode"), 2000);
|
||||
// 非 Service 状态禁止切换
|
||||
if (!isServiceOk) {
|
||||
showNotice("error", t("TUN requires Service Mode"), 2000);
|
||||
return Promise.reject(new Error(t("TUN requires Service Mode")));
|
||||
}
|
||||
return patchVerge({ enable_tun_mode: e });
|
||||
}}
|
||||
>
|
||||
<Switch edge="end" disabled={isSidecarMode && !isAdminMode} />
|
||||
<Switch edge="end" disabled={isServiceOk} />
|
||||
</GuardState>
|
||||
</SettingItem>
|
||||
<SettingItem
|
||||
@@ -195,11 +192,13 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
</GuardState>
|
||||
</SettingItem>
|
||||
|
||||
<SettingItem
|
||||
<SettingItem
|
||||
label={t("Auto Launch")}
|
||||
extra={
|
||||
isAdminMode && (
|
||||
<Tooltip title={t("Administrator mode may not support auto launch")}>
|
||||
<Tooltip
|
||||
title={t("Administrator mode may not support auto launch")}
|
||||
>
|
||||
<WarningRounded sx={{ color: "warning.main", mr: 1 }} />
|
||||
</Tooltip>
|
||||
)
|
||||
@@ -216,9 +215,13 @@ const SettingSystem = ({ onError }: Props) => {
|
||||
}}
|
||||
onGuard={async (e) => {
|
||||
if (isAdminMode) {
|
||||
showNotice('info', t("Administrator mode may not support auto launch"), 2000);
|
||||
showNotice(
|
||||
"info",
|
||||
t("Administrator mode may not support auto launch"),
|
||||
2000,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
// 在应用更改之前先触发UI更新,让用户立即看到反馈
|
||||
onChangeData({ enable_auto_launch: e });
|
||||
|
||||
Reference in New Issue
Block a user