diff --git a/src-tauri/src/default_browser.rs b/src-tauri/src/default_browser.rs index 2677a03..06b02e9 100644 --- a/src-tauri/src/default_browser.rs +++ b/src-tauri/src/default_browser.rs @@ -153,8 +153,8 @@ pub async fn open_url_with_profile( #[tauri::command] pub async fn smart_open_url( - _app_handle: tauri::AppHandle, - _url: String, + app_handle: tauri::AppHandle, + url: String, _is_startup: Option, ) -> Result { use crate::browser_runner::BrowserRunner; @@ -171,10 +171,75 @@ pub async fn smart_open_url( } println!( - "URL opening - Total profiles: {}, showing profile selector", + "URL opening - Total profiles: {}, checking for running profiles", profiles.len() ); - // Always show the profile selector so the user can choose + // Check for running profiles and find the first one that can handle URLs + for profile in &profiles { + // Check if this profile is running + let is_running = runner + .check_browser_status(app_handle.clone(), profile) + .await + .unwrap_or(false); + + if is_running { + println!( + "Found running profile '{}', attempting to open URL", + profile.name + ); + + // For TOR browser: Check if any other TOR browser is running + if profile.browser == "tor-browser" { + let mut other_tor_running = false; + for p in &profiles { + if p.browser == "tor-browser" + && p.name != profile.name + && runner + .check_browser_status(app_handle.clone(), p) + .await + .unwrap_or(false) + { + other_tor_running = true; + break; + } + } + + if other_tor_running { + continue; // Skip this one, can't have multiple TOR instances + } + } + + // For Mullvad browser: skip if running (can't open URLs in running Mullvad) + if profile.browser == "mullvad-browser" { + continue; + } + + // Try to open the URL with this running profile + match runner + .launch_or_open_url(app_handle.clone(), profile, Some(url.clone())) + .await + { + Ok(_) => { + println!( + "Successfully opened URL '{}' with running profile '{}'", + url, profile.name + ); + return Ok(format!("opened_with_profile:{}", profile.name)); + } + Err(e) => { + println!( + "Failed to open URL with running profile '{}': {}", + profile.name, e + ); + // Continue to try other profiles or show selector + } + } + } + } + + println!("No suitable running profiles found, showing profile selector"); + + // No suitable running profile found, show the profile selector Err("show_selector".to_string()) } diff --git a/src/app/page.tsx b/src/app/page.tsx index 6626bd5..35312a3 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -146,10 +146,7 @@ export default function Home() { // Listen for show profile selector events await listen("show-profile-selector", (event) => { console.log("Received show profile selector request:", event.payload); - setPendingUrls((prev) => [ - ...prev, - { id: Date.now().toString(), url: event.payload }, - ]); + setPendingUrls([{ id: Date.now().toString(), url: event.payload }]); }); // Listen for show create profile dialog events @@ -175,7 +172,7 @@ export default function Home() { url, }); console.log("Smart URL opening succeeded:", result); - // URL was handled successfully + // URL was handled successfully, no need to show selector } catch (error: unknown) { console.log( "Smart URL opening failed or requires profile selection:", @@ -183,7 +180,8 @@ export default function Home() { ); // Show profile selector for manual selection - setPendingUrls((prev) => [...prev, { id: Date.now().toString(), url }]); + // Replace any existing pending URL with the new one + setPendingUrls([{ id: Date.now().toString(), url }]); } }; diff --git a/src/components/profile-selector-dialog.tsx b/src/components/profile-selector-dialog.tsx index d94b700..3e7c5e4 100644 --- a/src/components/profile-selector-dialog.tsx +++ b/src/components/profile-selector-dialog.tsx @@ -69,16 +69,29 @@ export function ProfileSelectorDialog({ // Auto-select first available profile for link opening if (profileList.length > 0) { - // Find the first profile that can be used for opening links - const availableProfile = profileList.find((profile) => { - return canUseProfileForLinks(profile, profileList, runningProfiles); + // First, try to find a running profile that can be used for opening links + const runningAvailableProfile = profileList.find((profile) => { + const isRunning = runningProfiles.has(profile.name); + return ( + isRunning && + canUseProfileForLinks(profile, profileList, runningProfiles) + ); }); - if (availableProfile) { - setSelectedProfile(availableProfile.name); + if (runningAvailableProfile) { + setSelectedProfile(runningAvailableProfile.name); } else { - // If no suitable profile found, still select the first one to show UI - setSelectedProfile(profileList[0].name); + // If no running profile is suitable, find the first profile that can be used for opening links + const availableProfile = profileList.find((profile) => { + return canUseProfileForLinks(profile, profileList, runningProfiles); + }); + + if (availableProfile) { + setSelectedProfile(availableProfile.name); + } else { + // If no suitable profile found, still select the first one to show UI + setSelectedProfile(profileList[0].name); + } } } } catch (error) { @@ -277,7 +290,7 @@ export function ProfileSelectorDialog({ !canUseForLinks ? "opacity-50" : "" }`} > -
+
{(() => { const IconComponent = getBrowserIcon(