Skip to content

Commit 821b5cd

Browse files
committed
Fix global event listeners management
1 parent 601eb0d commit 821b5cd

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/design-system/components/dialogs-root/DialogsRoot.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ export default class DialogsRoot extends WebComponent {
1616
connectedCallback (): void {
1717
super.connectedCallback()
1818

19-
window.addEventListener(ShowDialogEvent.eventName, (event) => {
19+
this.addGlobalEventListener(ShowDialogEvent.eventName, (event) => {
2020
event.stopImmediatePropagation()
2121

2222
this.dialogs = [...this.dialogs, event.dialog]
2323
})
2424

25-
window.addEventListener(CloseDialogEvent.eventName, (event) => {
26-
event.stopPropagation()
25+
this.addGlobalEventListener(CloseDialogEvent.eventName, (event) => {
26+
event.stopImmediatePropagation()
2727

2828
this.dialogs = this.dialogs.filter(dialog => dialog.id !== event.id)
2929
})

src/primitives/lib/WebComponent.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ export default abstract class WebComponent extends LitElement {
44
static states?: Record<string, Function>
55

66
protected internals?: ElementInternals
7+
protected globalListeners: [type: string, listener: EventListener][] = []
8+
9+
disconnectedCallback (): void {
10+
super.disconnectedCallback()
11+
12+
for (const [type, listener] of this.globalListeners) {
13+
window.removeEventListener(type, listener)
14+
}
15+
16+
this.globalListeners = []
17+
}
718

819
protected willUpdate (changedProperties: Map<string, any>) {
920
super.willUpdate(changedProperties)
@@ -27,6 +38,12 @@ export default abstract class WebComponent extends LitElement {
2738
}
2839
}
2940

41+
protected addGlobalEventListener <T extends keyof WindowEventMap>(type: T, listener: (this: Window, ev: WindowEventMap[T]) => any) {
42+
this.globalListeners.push([type, listener as EventListener])
43+
44+
window.addEventListener(type, listener)
45+
}
46+
3047
protected render () {
3148
return html`<slot></slot>`
3249
}

0 commit comments

Comments
 (0)