use tauri::menu::{Menu, MenuItem};
use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent};
use tauri::{AppHandle, Emitter, Manager};
pub fn setup_tray(app: &AppHandle) -> Result<(), Box<dyn std::error::Error>> {
let show_i = MenuItem::with_id(app, "show", "S&B Vault öffnen", true, None::<&str>)?;
let lock_i = MenuItem::with_id(app, "lock", "Tresor sperren", true, None::<&str>)?;
let quit_i = MenuItem::with_id(app, "quit", "Beenden", true, None::<&str>)?;
let menu = Menu::with_items(app, &[&show_i, &lock_i, &quit_i])?;
let mut builder = TrayIconBuilder::with_id("main-tray")
.menu(&menu)
.show_menu_on_left_click(false)
.tooltip("S&B Vault // Zero-Trust Desktop Suite");
if let Some(icon) = app.default_window_icon() {
builder = builder.icon(icon.clone());
}
let _tray = builder
.on_menu_event(|app, event| match event.id.as_ref() {
"show" => {
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.unminimize();
let _ = window.set_focus();
}
}
"lock" => {
let state = app.state::<crate::vault::VaultState>();
*state.active_session.lock().unwrap() = None;
let _ = app.emit("vault-locked", ());
}
"quit" => {
app.exit(0);
}
_ => {}
})
.on_tray_icon_event(|tray, event| {
if let TrayIconEvent::Click {
button: MouseButton::Left,
button_state: MouseButtonState::Up,
..
} = event
{
let app = tray.app_handle();
if let Some(window) = app.get_webview_window("main") {
if let Ok(is_visible) = window.is_visible() {
if is_visible {
let _ = window.hide();
} else {
let _ = window.show();
let _ = window.unminimize();
let _ = window.set_focus();
}
}
}
}
})
.build(app)?;
Ok(())
}
#[tauri::command]
pub fn minimize_to_tray(app: AppHandle) -> Result<(), String> {
if let Some(window) = app.get_webview_window("main") {
window.hide().map_err(|e| e.to_string())?;
}
Ok(())
}
#[tauri::command]
pub fn show_main_window(app: AppHandle) -> Result<(), String> {
if let Some(window) = app.get_webview_window("main") {
window.show().map_err(|e| e.to_string())?;
window.unminimize().map_err(|e| e.to_string())?;
window.set_focus().map_err(|e| e.to_string())?;
}
Ok(())
}