diff options
Diffstat (limited to 'packages/desktop')
| -rw-r--r-- | packages/desktop/src-tauri/src/lib.rs | 60 | ||||
| -rw-r--r-- | packages/desktop/src/bindings.ts | 2 | ||||
| -rw-r--r-- | packages/desktop/src/index.tsx | 4 |
3 files changed, 64 insertions, 2 deletions
diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs index 135f7b072..14105e5dd 100644 --- a/packages/desktop/src-tauri/src/lib.rs +++ b/packages/desktop/src-tauri/src/lib.rs @@ -20,6 +20,7 @@ use std::{ path::PathBuf, sync::{Arc, Mutex}, time::Duration, + process::Command, }; use tauri::{AppHandle, Manager, RunEvent, State, ipc::Channel}; #[cfg(any(target_os = "linux", all(debug_assertions, windows)))] @@ -142,6 +143,62 @@ async fn await_initialization( .map_err(|_| "Failed to get server status".to_string())? } +#[tauri::command] +#[specta::specta] +fn check_app_exists(app_name: &str) -> bool { + #[cfg(target_os = "windows")] + { + check_windows_app(app_name) + } + + #[cfg(target_os = "macos")] + { + check_macos_app(app_name) + } + + #[cfg(target_os = "linux")] + { + check_linux_app(app_name) + } +} + +#[cfg(target_os = "windows")] +fn check_windows_app(app_name: &str) -> bool { + // Check if command exists in PATH, including .exe + return true; +} + +#[cfg(target_os = "macos")] +fn check_macos_app(app_name: &str) -> bool { + // Check common installation locations + let mut app_locations = vec![ + format!("/Applications/{}.app", app_name), + format!("/System/Applications/{}.app", app_name), + ]; + + if let Ok(home) = std::env::var("HOME") { + app_locations.push(format!("{}/Applications/{}.app", home, app_name)); + } + + for location in app_locations { + if std::path::Path::new(&location).exists() { + return true; + } + } + + // Also check if command exists in PATH + Command::new("which") + .arg(app_name) + .output() + .map(|output| output.status.success()) + .unwrap_or(false) +} + +#[cfg(target_os = "linux")] +fn check_linux_app(app_name: &str) -> bool { + return true; +} + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { let builder = tauri_specta::Builder::<tauri::Wry>::new() @@ -152,7 +209,8 @@ pub fn run() { await_initialization, server::get_default_server_url, server::set_default_server_url, - markdown::parse_markdown_command + markdown::parse_markdown_command, + check_app_exists ]) .events(tauri_specta::collect_events![LoadingWindowComplete]) .error_handling(tauri_specta::ErrorHandlingMode::Throw); diff --git a/packages/desktop/src/bindings.ts b/packages/desktop/src/bindings.ts index 46dcb7f44..562a98aca 100644 --- a/packages/desktop/src/bindings.ts +++ b/packages/desktop/src/bindings.ts @@ -8,10 +8,10 @@ export const commands = { killSidecar: () => __TAURI_INVOKE<void>("kill_sidecar"), installCli: () => __TAURI_INVOKE<string>("install_cli"), awaitInitialization: (events: Channel) => __TAURI_INVOKE<ServerReadyData>("await_initialization", { events }), - getDefaultServerUrl: () => __TAURI_INVOKE<string | null>("get_default_server_url"), setDefaultServerUrl: (url: string | null) => __TAURI_INVOKE<null>("set_default_server_url", { url }), parseMarkdownCommand: (markdown: string) => __TAURI_INVOKE<string>("parse_markdown_command", { markdown }), + checkAppExists: (appName: string) => __TAURI_INVOKE<boolean>("check_app_exists", { appName }), }; /** Events */ diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index 116689673..d3377e95a 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -340,6 +340,10 @@ const createPlatform = (password: Accessor<string | null>): Platform => ({ parseMarkdown: (markdown: string) => commands.parseMarkdownCommand(markdown), webviewZoom, + + checkAppExists: async (appName: string) => { + return commands.checkAppExists(appName) + }, }) let menuTrigger = null as null | ((id: string) => void) |
