From 7d29edd8fb05b7621cbca5866fa5f85e413d3235 Mon Sep 17 00:00:00 2001 From: ManthanNimodiya Date: Thu, 2 Jul 2026 23:05:06 +0530 Subject: [PATCH] fix(recording): show toast instead of blocking dialog for mic DeviceNotFound errors --- apps/desktop/src-tauri/src/recording.rs | 27 ++++++++++++------- .../src/routes/target-select-overlay.tsx | 27 +++++++++++++++---- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src-tauri/src/recording.rs b/apps/desktop/src-tauri/src/recording.rs index 97b302ae67..91bf7b5db3 100644 --- a/apps/desktop/src-tauri/src/recording.rs +++ b/apps/desktop/src-tauri/src/recording.rs @@ -2370,18 +2370,25 @@ async fn handle_spawn_failure( } .emit(app); - let mut dialog = MessageDialogBuilder::new( - app.dialog().clone(), - "An error occurred".to_string(), - message.clone(), - ) - .kind(tauri_plugin_dialog::MessageDialogKind::Error); + // DeviceNotFound errors are surfaced to the user via the frontend toast; skip the + // blocking native dialog so the overlay stays responsive and the error isn't repeated. + let is_device_not_found = message.contains("no longer available") + || message.contains("DeviceNotFound"); + + if !is_device_not_found { + let mut dialog = MessageDialogBuilder::new( + app.dialog().clone(), + "An error occurred".to_string(), + message.clone(), + ) + .kind(tauri_plugin_dialog::MessageDialogKind::Error); - if let Some(window) = CapWindowId::RecordingControls.get(app) { - dialog = dialog.parent(&window); - } + if let Some(window) = CapWindowId::RecordingControls.get(app) { + dialog = dialog.parent(&window); + } - dialog.blocking_show(); + dialog.blocking_show(); + } let mut state = state_mtx.write().await; let _ = handle_recording_end( diff --git a/apps/desktop/src/routes/target-select-overlay.tsx b/apps/desktop/src/routes/target-select-overlay.tsx index a7b21a94c7..22b20d9c3b 100644 --- a/apps/desktop/src/routes/target-select-overlay.tsx +++ b/apps/desktop/src/routes/target-select-overlay.tsx @@ -1742,11 +1742,28 @@ function RecordingControls(props: { return; } - commands.startRecording({ - capture_target: props.target, - mode: rawOptions.mode, - capture_system_audio: rawOptions.captureSystemAudio, - }); + commands + .startRecording({ + capture_target: props.target, + mode: rawOptions.mode, + capture_system_audio: rawOptions.captureSystemAudio, + }) + .catch((e: unknown) => { + const msg = + e instanceof Error ? e.message : String(e); + if ( + msg.includes("no longer available") || + msg.includes("DeviceNotFound") + ) { + toast.error( + "Selected microphone is not available. Please select a different microphone in settings.", + ); + } else { + toast.error( + `Failed to start recording: ${msg}`, + ); + } + }); }} >