Răsfoiți Sursa

fix(core): regression on the unlisten function (#3623)

Lucas Fernandes Nogueira 3 ani în urmă
părinte
comite
76c791bd2b

+ 6 - 0
.changes/unlisten-fix.md

@@ -0,0 +1,6 @@
+---
+"tauri": patch
+"api": patch
+---
+
+Fixes a regression on the `unlisten` command.

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
core/tauri/scripts/bundle.js


+ 7 - 2
core/tauri/src/endpoints/event.rs

@@ -63,7 +63,7 @@ pub enum Cmd {
   },
   /// Unlisten to an event.
   #[serde(rename_all = "camelCase")]
-  Unlisten { event_id: u64 },
+  Unlisten { event: EventId, event_id: u64 },
   /// Emit an event to the webview associated with the given window.
   /// If the window_label is omitted, the event will be triggered on all listeners.
   #[serde(rename_all = "camelCase")]
@@ -103,11 +103,16 @@ impl Cmd {
     Ok(event_id)
   }
 
-  fn unlisten<R: Runtime>(context: InvokeContext<R>, event_id: u64) -> super::Result<()> {
+  fn unlisten<R: Runtime>(
+    context: InvokeContext<R>,
+    event: EventId,
+    event_id: u64,
+  ) -> super::Result<()> {
     context
       .window
       .eval(&unlisten_js(
         context.window.manager().event_listeners_object_name(),
+        event.0,
         event_id,
       ))
       .map_err(crate::error::into_anyhow)?;

+ 9 - 5
core/tauri/src/event.rs

@@ -300,17 +300,21 @@ mod test {
   }
 }
 
-pub fn unlisten_js(listeners_object_name: String, event_id: u64) -> String {
+pub fn unlisten_js(listeners_object_name: String, event_name: String, event_id: u64) -> String {
   format!(
     "
-      for (var event in (window['{listeners}'] || {{}})) {{
-        var listeners = (window['{listeners}'] || {{}})[event]
+      (function () {{
+        const listeners = (window['{listeners}'] || {{}})['{event_name}']
         if (listeners) {{
-          window['{listeners}'][event] = window['{listeners}'][event].filter(function (e) {{ return e.id !== {event_id} }})
+          const index = window['{listeners}']['{event_name}'].findIndex(e => e.id === {event_id})
+          if (index > -1) {{
+            window['{listeners}']['{event_name}'].splice(index, 1)
+          }}
         }}
-      }}
+      }})()
     ",
     listeners = listeners_object_name,
+    event_name = event_name,
     event_id = event_id,
   )
 }

Fișier diff suprimat deoarece este prea mare
+ 1 - 1
examples/api/dist/assets/index.js


+ 6 - 4
tooling/api/src/helpers/event.ts

@@ -41,17 +41,19 @@ export type EventCallback<T> = (event: Event<T>) => void
 export type UnlistenFn = () => void
 
 /**
- * Unregister the event listener associated with the given id.
+ * Unregister the event listener associated with the given name and id.
  *
  * @ignore
+ * @param event The event name
  * @param eventId Event identifier
  * @returns
  */
-async function _unlisten(eventId: number): Promise<void> {
+async function _unlisten(event: string, eventId: number): Promise<void> {
   return invokeTauriCommand({
     __tauriModule: 'Event',
     message: {
       cmd: 'unlisten',
+      event,
       eventId
     }
   })
@@ -102,7 +104,7 @@ async function listen<T>(
       handler: transformCallback(handler)
     }
   }).then((eventId) => {
-    return async () => _unlisten(eventId)
+    return async () => _unlisten(event, eventId)
   })
 }
 
@@ -120,7 +122,7 @@ async function once<T>(
 ): Promise<UnlistenFn> {
   return listen<T>(event, windowLabel, (eventData) => {
     handler(eventData)
-    _unlisten(eventData.id).catch(() => {})
+    _unlisten(event, eventData.id).catch(() => {})
   })
 }
 

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff