use tauri::{ menu::{Menu, MenuItem}, tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, AppHandle, Manager, }; use crate::config::HikariConfig; pub fn setup_tray(app: &AppHandle) -> tauri::Result<()> { let show_item = MenuItem::with_id(app, "show", "Show Hikari", true, None::<&str>)?; let quit_item = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?; let menu = Menu::with_items(app, &[&show_item, &quit_item])?; let _tray = TrayIconBuilder::with_id("main") .icon(app.default_window_icon().unwrap().clone()) .menu(&menu) .tooltip("Hikari - Claude Code Assistant") .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(); } } "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") { let _ = window.show(); let _ = window.unminimize(); let _ = window.set_focus(); } } }) .build(app)?; Ok(()) } pub fn should_minimize_to_tray(app: &AppHandle) -> bool { let config_path = app .path() .app_config_dir() .ok() .map(|p| p.join("hikari-config.json")); if let Some(path) = config_path { if let Ok(content) = std::fs::read_to_string(&path) { if let Ok(config) = serde_json::from_str::(&content) { return config.minimize_to_tray; } } } false }