Skip to content

Commit 9e3a18e

Browse files
authored
feat(api): expose window target option on event APIs (#7132)
1 parent a50f24b commit 9e3a18e

File tree

5 files changed

+83
-111
lines changed

5 files changed

+83
-111
lines changed

Diff for: .changes/event-api-window-label.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@tauri-apps/api": patch
3+
---
4+
5+
Expose the window target option on event APIs.

Diff for: core/tauri/scripts/bundle.global.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: tooling/api/docs/js-api.json

+1-1
Large diffs are not rendered by default.

Diff for: tooling/api/src/event.ts

+76-12
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,41 @@
99
* @module
1010
*/
1111

12-
import * as eventApi from './helpers/event'
13-
import type { EventCallback, UnlistenFn, Event } from './helpers/event'
12+
import { invoke, transformCallback } from './tauri'
1413

15-
export type EventName = `${TauriEvent}` | (string & Record<never, never>)
14+
interface Event<T> {
15+
/** Event name */
16+
event: EventName
17+
/** The label of the window that emitted this event. */
18+
windowLabel: string
19+
/** Event identifier used to unlisten */
20+
id: number
21+
/** Event payload */
22+
payload: T
23+
}
24+
25+
type EventCallback<T> = (event: Event<T>) => void
26+
27+
type UnlistenFn = () => void
28+
29+
type EventName = `${TauriEvent}` | (string & Record<never, never>)
30+
31+
interface Options {
32+
/**
33+
* Label of the window the function targets.
34+
*
35+
* When listening to events and using this value,
36+
* only events triggered by the window with the given label are received.
37+
*
38+
* When emitting events, only the window with the given label will receive it.
39+
*/
40+
target?: string
41+
}
1642

1743
/**
1844
* @since 1.1.0
1945
*/
20-
export enum TauriEvent {
46+
enum TauriEvent {
2147
WINDOW_RESIZED = 'tauri://resize',
2248
WINDOW_MOVED = 'tauri://move',
2349
WINDOW_CLOSE_REQUESTED = 'tauri://close-requested',
@@ -33,6 +59,21 @@ export enum TauriEvent {
3359
MENU = 'tauri://menu'
3460
}
3561

62+
/**
63+
* Unregister the event listener associated with the given name and id.
64+
*
65+
* @ignore
66+
* @param event The event name
67+
* @param eventId Event identifier
68+
* @returns
69+
*/
70+
async function _unlisten(event: string, eventId: number): Promise<void> {
71+
await invoke('plugin:event|unlisten', {
72+
event,
73+
eventId
74+
})
75+
}
76+
3677
/**
3778
* Listen to an event from the backend.
3879
*
@@ -56,9 +97,16 @@ export enum TauriEvent {
5697
*/
5798
async function listen<T>(
5899
event: EventName,
59-
handler: EventCallback<T>
100+
handler: EventCallback<T>,
101+
options?: Options
60102
): Promise<UnlistenFn> {
61-
return eventApi.listen(event, null, handler)
103+
return invoke<number>('plugin:event|listen', {
104+
event,
105+
windowLabel: options?.target,
106+
handler: transformCallback(handler)
107+
}).then((eventId) => {
108+
return async () => _unlisten(event, eventId)
109+
})
62110
}
63111

64112
/**
@@ -87,9 +135,17 @@ async function listen<T>(
87135
*/
88136
async function once<T>(
89137
event: EventName,
90-
handler: EventCallback<T>
138+
handler: EventCallback<T>,
139+
options?: Options
91140
): Promise<UnlistenFn> {
92-
return eventApi.once(event, null, handler)
141+
return listen<T>(
142+
event,
143+
(eventData) => {
144+
handler(eventData)
145+
_unlisten(event, eventData.id).catch(() => {})
146+
},
147+
options
148+
)
93149
}
94150

95151
/**
@@ -104,10 +160,18 @@ async function once<T>(
104160
*
105161
* @since 1.0.0
106162
*/
107-
async function emit(event: string, payload?: unknown): Promise<void> {
108-
return eventApi.emit(event, undefined, payload)
163+
async function emit(
164+
event: string,
165+
payload?: unknown,
166+
options?: Options
167+
): Promise<void> {
168+
await invoke('plugin:event|emit', {
169+
event,
170+
windowLabel: options?.target,
171+
payload
172+
})
109173
}
110174

111-
export type { Event, EventCallback, UnlistenFn }
175+
export type { Event, EventCallback, UnlistenFn, EventName, Options }
112176

113-
export { listen, once, emit }
177+
export { listen, once, emit, TauriEvent }

Diff for: tooling/api/src/helpers/event.ts

-97
This file was deleted.

0 commit comments

Comments
 (0)