diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index 6eb7f4c893..919b3e18e2 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -46,10 +46,17 @@ pub enum DeepLinkAction { mode: RecordingMode, }, StopRecording, - #[cfg(debug_assertions)] PauseRecording, - #[cfg(debug_assertions)] ResumeRecording, + TogglePauseRecording, + RestartRecording, + SwitchMicrophone { + mic_label: Option, + }, + SwitchCamera { + camera: Option, + }, + TakeScreenshot, #[cfg(debug_assertions)] OpenCamera { camera: DeviceOrModelID, @@ -244,14 +251,35 @@ impl DeepLinkAction { DeepLinkAction::StopRecording => { crate::recording::stop_recording(app.clone(), app.state()).await } - #[cfg(debug_assertions)] DeepLinkAction::PauseRecording => { crate::recording::pause_recording(app.clone(), app.state()).await } - #[cfg(debug_assertions)] DeepLinkAction::ResumeRecording => { crate::recording::resume_recording(app.clone(), app.state()).await } + DeepLinkAction::TogglePauseRecording => { + crate::recording::toggle_pause_recording(app.clone(), app.state()).await + } + DeepLinkAction::RestartRecording => { + crate::recording::restart_recording(app.clone(), app.state()) + .await + .map(|_| ()) + } + DeepLinkAction::SwitchMicrophone { mic_label } => { + crate::set_mic_input(app.state(), mic_label).await + } + DeepLinkAction::SwitchCamera { camera } => { + crate::set_camera_input(app.clone(), app.state::>(), camera, None) + .await?; + Ok(()) + } + DeepLinkAction::TakeScreenshot => { + let id = scap_targets::Display::primary().id(); + let capture_target = ScreenCaptureTarget::Display { id }; + crate::recording::take_screenshot(app.clone(), capture_target) + .await + .map(|_| ()) + } #[cfg(debug_assertions)] DeepLinkAction::OpenCamera { camera } => { crate::set_camera_input( @@ -358,7 +386,6 @@ mod tests { ); } - #[cfg(debug_assertions)] #[test] fn parses_pause_and_resume_action_urls() { let pause_url = Url::parse("cap-desktop://action?value=%22pause_recording%22").unwrap(); @@ -374,6 +401,72 @@ mod tests { ); } + #[test] + fn parses_toggle_pause_action_url() { + let url = Url::parse("cap-desktop://action?value=%22toggle_pause_recording%22").unwrap(); + + assert_eq!( + DeepLinkAction::try_from(&url), + Ok(DeepLinkAction::TogglePauseRecording) + ); + } + + #[test] + fn parses_restart_action_url() { + let url = Url::parse("cap-desktop://action?value=%22restart_recording%22").unwrap(); + + assert_eq!( + DeepLinkAction::try_from(&url), + Ok(DeepLinkAction::RestartRecording) + ); + } + + #[test] + fn parses_switch_microphone_action_url() { + let value = serde_json::json!({ + "switch_microphone": { + "mic_label": "Built-in Microphone" + } + }) + .to_string(); + let url = Url::parse_with_params("cap-desktop://action", &[("value", value)]).unwrap(); + + assert_eq!( + DeepLinkAction::try_from(&url), + Ok(DeepLinkAction::SwitchMicrophone { + mic_label: Some("Built-in Microphone".to_string()) + }) + ); + } + + #[test] + fn parses_switch_camera_action_url() { + let value = serde_json::json!({ + "switch_camera": { + "camera": { "DeviceID": "camera-1" } + } + }) + .to_string(); + let url = Url::parse_with_params("cap-desktop://action", &[("value", value)]).unwrap(); + + assert_eq!( + DeepLinkAction::try_from(&url), + Ok(DeepLinkAction::SwitchCamera { + camera: Some(DeviceOrModelID::DeviceID("camera-1".to_string())) + }) + ); + } + + #[test] + fn parses_take_screenshot_action_url() { + let url = Url::parse("cap-desktop://action?value=%22take_screenshot%22").unwrap(); + + assert_eq!( + DeepLinkAction::try_from(&url), + Ok(DeepLinkAction::TakeScreenshot) + ); + } + #[cfg(debug_assertions)] #[test] fn parses_area_recording_action_url() { diff --git a/packages/sdk-recorder/src/index.ts b/packages/sdk-recorder/src/index.ts index 0f7eb10e1f..72757aeba6 100644 --- a/packages/sdk-recorder/src/index.ts +++ b/packages/sdk-recorder/src/index.ts @@ -82,9 +82,10 @@ export class CapRecorder { this.listeners.set(event, new Set()); } const set = this.listeners.get(event); - if (set) set.add(handler as EventHandler); + const castHandler = handler as unknown as EventHandler; + if (set) set.add(castHandler); return () => { - this.listeners.get(event)?.delete(handler); + this.listeners.get(event)?.delete(castHandler); }; }