use super::tray::Tray; use crate::log_err; use anyhow::Result; use once_cell::sync::OnceCell; use parking_lot::RwLock; use std::sync::Arc; use tauri::{AppHandle, Emitter, Manager, WebviewWindow}; #[derive(Debug, Default, Clone)] pub struct Handle { pub app_handle: Arc>>, } impl Handle { pub fn global() -> &'static Handle { static HANDLE: OnceCell = OnceCell::new(); HANDLE.get_or_init(|| Handle { app_handle: Arc::new(RwLock::new(None)), }) } pub fn init(&self, app_handle: &AppHandle) { let mut handle = self.app_handle.write(); *handle = Some(app_handle.clone()); } pub fn app_handle(&self) -> Option { self.app_handle.read().clone() } pub fn get_window(&self) -> Option { self.app_handle() .as_ref() .and_then(|a| a.get_webview_window("main")) } pub fn refresh_clash() { if let Some(window) = Self::global().get_window() { log_err!(window.emit("verge://refresh-clash-config", "yes")); } } pub fn refresh_verge() { if let Some(window) = Self::global().get_window() { log_err!(window.emit("verge://refresh-verge-config", "yes")); } } #[allow(unused)] pub fn refresh_profiles() { if let Some(window) = Self::global().get_window() { log_err!(window.emit("verge://refresh-profiles-config", "yes")); } } pub fn notice_message, M: Into>(status: S, msg: M) { if let Some(window) = Self::global().get_window() { log_err!(window.emit("verge://notice-message", (status.into(), msg.into()))); } } /// update the system tray state pub fn update_systray_part() -> Result<()> { Tray::update_part()?; Ok(()) } }