fixed an issue with enabling tun and system proxy if profiles are missing
This commit is contained in:
@@ -176,7 +176,34 @@ pub async fn update_profile(index: String, option: Option<PrfOption>) -> CmdResu
|
|||||||
/// 删除配置文件
|
/// 删除配置文件
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn delete_profile(index: String) -> CmdResult {
|
pub async fn delete_profile(index: String) -> CmdResult {
|
||||||
let should_update = wrap_err!({ Config::profiles().data().delete_item(index) })?;
|
let should_update;
|
||||||
|
|
||||||
|
{
|
||||||
|
let profiles_config = Config::profiles();
|
||||||
|
let mut profiles_data = profiles_config.data();
|
||||||
|
should_update = profiles_data.delete_item(index.clone()).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
|
let was_last_profile = profiles_data.items.as_ref().map_or(true, |items| {
|
||||||
|
!items.iter().any(|item|
|
||||||
|
item.itype == Some("remote".to_string()) || item.itype == Some("local".to_string())
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
if was_last_profile {
|
||||||
|
logging!(info, Type::Cmd, true, "The last profile has been deleted. Disabling proxy modes...");
|
||||||
|
let verge_config = Config::verge();
|
||||||
|
let mut verge_data = verge_config.data();
|
||||||
|
|
||||||
|
if verge_data.enable_tun_mode == Some(true) || verge_data.enable_system_proxy == Some(true) {
|
||||||
|
verge_data.enable_tun_mode = Some(false);
|
||||||
|
verge_data.enable_system_proxy = Some(false);
|
||||||
|
verge_data.save_file().map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
|
handle::Handle::refresh_verge();
|
||||||
|
handle::Handle::notice_message("info", "All profiles deleted, proxy disabled.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 删除后自动清理冗余文件
|
// 删除后自动清理冗余文件
|
||||||
let _ = Config::profiles().latest().auto_cleanup();
|
let _ = Config::profiles().latest().auto_cleanup();
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ export const PowerButton = React.forwardRef<HTMLButtonElement, PowerButtonProps>
|
|||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
'absolute h-28 w-28 rounded-full blur-3xl transition-all duration-500',
|
'absolute h-28 w-28 rounded-full blur-3xl transition-all duration-500',
|
||||||
state === 'on' ? 'bg-green-400/60' : 'bg-red-500/40'
|
state === 'on' ? 'bg-green-400/60' : 'bg-red-500/40',
|
||||||
|
props.disabled && 'opacity-0'
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -33,11 +34,18 @@ export const PowerButton = React.forwardRef<HTMLButtonElement, PowerButtonProps>
|
|||||||
'data-[state=on]:text-green-500 dark:data-[state=on]:text-white',
|
'data-[state=on]:text-green-500 dark:data-[state=on]:text-white',
|
||||||
'data-[state=on]:shadow-[0_0_50px_rgba(34,197,94,1)]',
|
'data-[state=on]:shadow-[0_0_50px_rgba(34,197,94,1)]',
|
||||||
'transition-all duration-300 hover:scale-105 active:scale-95 focus:outline-none',
|
'transition-all duration-300 hover:scale-105 active:scale-95 focus:outline-none',
|
||||||
|
'disabled:cursor-not-allowed disabled:scale-100',
|
||||||
|
|
||||||
|
// Стили ТОЛЬКО для отключенного состояния (но не для загрузки)
|
||||||
|
(props.disabled && !loading) && 'grayscale opacity-50 shadow-none bg-slate-100/70 border-slate-300/80',
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
<Power className="h-20 w-20 transition-transform duration-300 active:scale-90" />
|
<Power className={cn(
|
||||||
|
"h-20 w-20",
|
||||||
|
!props.disabled && "active:scale-90 transition-transform duration-300"
|
||||||
|
)} />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{loading && (
|
{loading && (
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ export const ProfileViewer = forwardRef<ProfileViewerRef, Props>(
|
|||||||
</Button>
|
</Button>
|
||||||
{!isUrlValid && importUrl && (
|
{!isUrlValid && importUrl && (
|
||||||
<p className="text-sm text-destructive px-1">
|
<p className="text-sm text-destructive px-1">
|
||||||
{t("Please enter a valid URL")}
|
{t("Invalid Profile URL")}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useRef, useState } from "react";
|
import {useMemo, useRef, useState} from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useLockFn } from "ahooks";
|
import { useLockFn } from "ahooks";
|
||||||
import { mutate } from "swr";
|
import { mutate } from "swr";
|
||||||
@@ -56,6 +56,7 @@ import {
|
|||||||
SelectTrigger,
|
SelectTrigger,
|
||||||
SelectValue,
|
SelectValue,
|
||||||
} from "@/components/ui/select";
|
} from "@/components/ui/select";
|
||||||
|
import {useProfiles} from "@/hooks/use-profiles";
|
||||||
|
|
||||||
const isWIN = getSystem() === "windows";
|
const isWIN = getSystem() === "windows";
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -106,6 +107,12 @@ const SettingSystem = ({ onError }: Props) => {
|
|||||||
const { verge, patchVerge, mutateVerge } = useVerge();
|
const { verge, patchVerge, mutateVerge } = useVerge();
|
||||||
const { installServiceAndRestartCore } = useServiceInstaller();
|
const { installServiceAndRestartCore } = useServiceInstaller();
|
||||||
|
|
||||||
|
const { profiles } = useProfiles();
|
||||||
|
const hasProfiles = useMemo(() => {
|
||||||
|
const items = profiles?.items ?? [];
|
||||||
|
return items.some(p => p.type === 'local' || p.type === 'remote');
|
||||||
|
}, [profiles]);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
actualState: systemProxyActualState,
|
actualState: systemProxyActualState,
|
||||||
indicator: systemProxyIndicator,
|
indicator: systemProxyIndicator,
|
||||||
@@ -261,7 +268,7 @@ const SettingSystem = ({ onError }: Props) => {
|
|||||||
}}
|
}}
|
||||||
onCatch={onError}
|
onCatch={onError}
|
||||||
>
|
>
|
||||||
<Switch disabled={!isTunAvailable} />
|
<Switch disabled={!isTunAvailable || !hasProfiles} />
|
||||||
</GuardState>
|
</GuardState>
|
||||||
</SettingRow>
|
</SettingRow>
|
||||||
|
|
||||||
@@ -297,7 +304,7 @@ const SettingSystem = ({ onError }: Props) => {
|
|||||||
}}
|
}}
|
||||||
onCatch={onError}
|
onCatch={onError}
|
||||||
>
|
>
|
||||||
<Switch />
|
<Switch disabled={!hasProfiles} />
|
||||||
</GuardState>
|
</GuardState>
|
||||||
</SettingRow>
|
</SettingRow>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user