feat(hotkey): add global reactivate_profiles shortcut (#5527)

* feat(hotkey): add global reactivate_profiles shortcut

* feat(profile): expose validation state for reactivation shortcuts
This commit is contained in:
Sline
2025-11-19 17:06:23 +08:00
committed by GitHub
parent 94b07b51d6
commit f439e93a2b
34 changed files with 134 additions and 22 deletions

View File

@@ -21,6 +21,7 @@ pub enum HotkeyFunction {
ToggleSystemProxy,
ToggleTunMode,
EntryLightweightMode,
ReactivateProfiles,
Quit,
#[cfg(target_os = "macos")]
Hide,
@@ -36,6 +37,7 @@ impl fmt::Display for HotkeyFunction {
Self::ToggleSystemProxy => "toggle_system_proxy",
Self::ToggleTunMode => "toggle_tun_mode",
Self::EntryLightweightMode => "entry_lightweight_mode",
Self::ReactivateProfiles => "reactivate_profiles",
Self::Quit => "quit",
#[cfg(target_os = "macos")]
Self::Hide => "hide",
@@ -56,6 +58,7 @@ impl FromStr for HotkeyFunction {
"toggle_system_proxy" => Ok(Self::ToggleSystemProxy),
"toggle_tun_mode" => Ok(Self::ToggleTunMode),
"entry_lightweight_mode" => Ok(Self::EntryLightweightMode),
"reactivate_profiles" => Ok(Self::ReactivateProfiles),
"quit" => Ok(Self::Quit),
#[cfg(target_os = "macos")]
"hide" => Ok(Self::Hide),
@@ -149,6 +152,40 @@ impl Hotkey {
notify_event(NotificationEvent::LightweightModeEntered).await;
});
}
HotkeyFunction::ReactivateProfiles => {
AsyncHandler::spawn(async move || match feat::enhance_profiles().await {
Ok((true, _)) => {
handle::Handle::refresh_clash();
notify_event(NotificationEvent::ProfilesReactivated).await;
}
Ok((false, msg)) => {
let message = if msg.is_empty() {
"Failed to reactivate profiles.".to_string()
} else {
msg.to_string()
};
logging!(
warn,
Type::Hotkey,
"Hotkey profile reactivation failed validation: {}",
message.as_str()
);
handle::Handle::notice_message("reactivate_profiles::error", message);
}
Err(err) => {
logging!(
error,
Type::Hotkey,
"Failed to reactivate subscriptions via hotkey: {}",
err
);
handle::Handle::notice_message(
"reactivate_profiles::error",
err.to_string(),
);
}
});
}
HotkeyFunction::Quit => {
AsyncHandler::spawn(async move || {
notify_event(NotificationEvent::AppQuit).await;