diff --git a/src-tauri/src/extension/webview/manager.rs b/src-tauri/src/extension/webview/manager.rs index aa4e015..2e7727d 100644 --- a/src-tauri/src/extension/webview/manager.rs +++ b/src-tauri/src/extension/webview/manager.rs @@ -293,6 +293,31 @@ impl ExtensionWebviewManager { }) } } + + /// Emits an event to all extension webview windows + pub fn emit_to_all_extensions( + &self, + app_handle: &AppHandle, + event: &str, + payload: S, + ) -> Result<(), ExtensionError> { + let windows = self.windows.lock().map_err(|e| ExtensionError::MutexPoisoned { + reason: e.to_string(), + })?; + + // Iterate over all window IDs + for window_id in windows.keys() { + #[cfg(not(any(target_os = "android", target_os = "ios")))] + if let Some(window) = app_handle.get_webview_window(window_id) { + // Emit event to this specific webview window + if let Err(e) = window.emit(event, payload.clone()) { + eprintln!("Failed to emit event {} to window {}: {}", event, window_id, e); + } + } + } + + Ok(()) + } } impl Default for ExtensionWebviewManager { diff --git a/src-tauri/src/extension/webview/web.rs b/src-tauri/src/extension/webview/web.rs index 8e86457..a6d5250 100644 --- a/src-tauri/src/extension/webview/web.rs +++ b/src-tauri/src/extension/webview/web.rs @@ -244,3 +244,23 @@ pub async fn webview_extension_web_request( "ok": status >= 200 && status < 300 })) } + +/// Broadcasts an event to all extension webview windows +#[tauri::command] +pub async fn webview_extension_emit_to_all( + app_handle: tauri::AppHandle, + state: State<'_, AppState>, + event: String, + payload: serde_json::Value, +) -> Result<(), ExtensionError> { + #[cfg(not(any(target_os = "android", target_os = "ios")))] + { + state.extension_webview_manager.emit_to_all_extensions( + &app_handle, + &event, + payload, + )?; + } + + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index aca3d39..216da4f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -143,6 +143,8 @@ pub fn run() { #[cfg(not(any(target_os = "android", target_os = "ios")))] extension::webview::web::webview_extension_web_request, #[cfg(not(any(target_os = "android", target_os = "ios")))] + extension::webview::web::webview_extension_emit_to_all, + #[cfg(not(any(target_os = "android", target_os = "ios")))] extension::webview::filesystem::webview_extension_fs_save_file, #[cfg(not(any(target_os = "android", target_os = "ios")))] extension::webview::filesystem::webview_extension_fs_open_file, diff --git a/src/stores/ui/index.ts b/src/stores/ui/index.ts index 4e34129..3b98ebc 100644 --- a/src/stores/ui/index.ts +++ b/src/stores/ui/index.ts @@ -1,6 +1,5 @@ import { breakpointsTailwind } from '@vueuse/core' import { invoke } from '@tauri-apps/api/core' -import { emit } from '@tauri-apps/api/event' import { HAEXTENSION_EVENTS } from '@haexhub/sdk' import { broadcastContextToAllExtensions } from '~/composables/extensionMessageHandler' @@ -81,9 +80,12 @@ export const useUiStore = defineStore('uiStore', () => { try { await invoke('webview_extension_context_set', { context }) console.log('[UI Store] Context set in Tauri state:', context) - // Emit Tauri event so webview extensions can listen for changes - await emit(HAEXTENSION_EVENTS.CONTEXT_CHANGED, { context }) - console.log('[UI Store] Emitted context change event:', context) + // Broadcast event to all webview extensions + await invoke('webview_extension_emit_to_all', { + event: HAEXTENSION_EVENTS.CONTEXT_CHANGED, + payload: { context } + }) + console.log('[UI Store] Broadcasted context change event to webview extensions:', context) } catch (error) { // Ignore error if not running in Tauri (e.g., browser mode) console.debug('[UI Store] Failed to update Tauri context:', error)