From 920a4638135aca3c76235cfb58fd18d796ed2124 Mon Sep 17 00:00:00 2001 From: tammi-23 Date: Mon, 18 May 2026 14:40:02 +0200 Subject: [PATCH 1/4] fix: cleanup event listener --- .../src/components/Sources/MediaImage.vue | 16 +++++++---- .../web-pkg/src/services/uppy/uppyService.ts | 28 +++++++++++++------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/packages/web-app-preview/src/components/Sources/MediaImage.vue b/packages/web-app-preview/src/components/Sources/MediaImage.vue index 128796d030..21919877d3 100644 --- a/packages/web-app-preview/src/components/Sources/MediaImage.vue +++ b/packages/web-app-preview/src/components/Sources/MediaImage.vue @@ -69,12 +69,14 @@ const setTransform = ({ scale, x, y }: { scale: number; x: number; y: number }) ) } +const destroyPanzoom = () => { + unref(img)?.removeEventListener('wheel', onWheelEvent) + unref(panzoom)?.destroy() + panzoom.value = undefined +} + const initPanzoom = async () => { - if (unref(panzoom)) { - await nextTick() - ;(unref(img) as unknown as HTMLElement).removeEventListener('wheel', onWheelEvent) - unref(panzoom)?.destroy() - } + destroyPanzoom() // wait for next tick until image is rendered await nextTick() @@ -87,7 +89,7 @@ const initPanzoom = async () => { maxScale: 10, setTransform: (_, { scale, x, y }) => setTransform({ scale, x, y }) } as PanzoomOptions) - unref(img).addEventListener('wheel', onWheelEvent) + unref(img).addEventListener('wheel', onWheelEvent, { passive: false }) } watch(() => file, initPanzoom, { immediate: true, deep: true }) @@ -122,6 +124,8 @@ onMounted(() => { }) onBeforeUnmount(() => { + destroyPanzoom() + eventBus.unsubscribe('app.preview.media.image.reset', resetEventToken) eventBus.unsubscribe('app.preview.media.image.zoom', zoomToken) eventBus.unsubscribe('app.preview.media.image.shrink', shrinkToken) diff --git a/packages/web-pkg/src/services/uppy/uppyService.ts b/packages/web-pkg/src/services/uppy/uppyService.ts index b95b549713..017bf933d8 100644 --- a/packages/web-pkg/src/services/uppy/uppyService.ts +++ b/packages/web-pkg/src/services/uppy/uppyService.ts @@ -80,6 +80,7 @@ type OmitFirstArg = T extends [any, ...infer U] ? U : never export class UppyService { uppy: Uppy uploadInputs: HTMLInputElement[] = [] + private uploadInputListeners = new WeakMap() uploadFolderMap: Record = {} constructor({ language }: UppyServiceOptions) { @@ -277,19 +278,28 @@ export class UppyService { } registerUploadInput(el: HTMLInputElement) { - const listenerRegistered = el.getAttribute('listener') - if (listenerRegistered !== 'true') { - el.setAttribute('listener', 'true') - el.addEventListener('change', (event) => { - const target = event.target as HTMLInputElement - const files = Array.from(target.files) - this.addFiles(files) - }) - this.uploadInputs.push(el) + if (this.uploadInputListeners.has(el)) { + return + } + + const listener: EventListener = (event) => { + const target = event.target as HTMLInputElement + const files = Array.from(target.files || []) + this.addFiles(files) } + + this.uploadInputListeners.set(el, listener) + el.addEventListener('change', listener) + this.uploadInputs.push(el) } removeUploadInput(el: HTMLInputElement) { + const listener = this.uploadInputListeners.get(el) + if (listener) { + el.removeEventListener('change', listener) + this.uploadInputListeners.delete(el) + } + this.uploadInputs = this.uploadInputs.filter((input) => input !== el) } From 2a341673bd5c1910f219d049c0ddad2f83323856 Mon Sep 17 00:00:00 2001 From: tammi-23 Date: Tue, 19 May 2026 10:15:15 +0200 Subject: [PATCH 2/4] fix: unregister upload element --- .../src/components/AppBar/Upload/ResourceUpload.vue | 2 +- packages/web-pkg/src/services/uppy/uppyService.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue b/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue index 2a1dfadb12..ce676c89c1 100644 --- a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue +++ b/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue @@ -95,7 +95,7 @@ onMounted(() => { onBeforeUnmount(() => { uppyService.unsubscribe('uploadStarted', uploadStartedSub) uppyService.unsubscribe('uploadCompleted', uploadCompletedSub) - uppyService.removeUploadInput(unref(input)) + uppyService.unregisterUploadInputElement(unref(input)) }) const inputId = computed(() => { diff --git a/packages/web-pkg/src/services/uppy/uppyService.ts b/packages/web-pkg/src/services/uppy/uppyService.ts index 017bf933d8..36e3cebee4 100644 --- a/packages/web-pkg/src/services/uppy/uppyService.ts +++ b/packages/web-pkg/src/services/uppy/uppyService.ts @@ -300,6 +300,10 @@ export class UppyService { this.uploadInputListeners.delete(el) } + this.unregisterUploadInputElement(el) + } + + unregisterUploadInputElement(el: HTMLInputElement) { this.uploadInputs = this.uploadInputs.filter((input) => input !== el) } From 14f86f547a3dc9dcd910ee2da0f6c19f27056fa1 Mon Sep 17 00:00:00 2001 From: tammi-23 Date: Tue, 19 May 2026 16:23:50 +0200 Subject: [PATCH 3/4] fix: cleanup event listeners --- .../src/components/AppBar/Upload/ResourceUpload.vue | 2 +- packages/web-pkg/src/services/uppy/uppyService.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue b/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue index ce676c89c1..2a1dfadb12 100644 --- a/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue +++ b/packages/web-app-files/src/components/AppBar/Upload/ResourceUpload.vue @@ -95,7 +95,7 @@ onMounted(() => { onBeforeUnmount(() => { uppyService.unsubscribe('uploadStarted', uploadStartedSub) uppyService.unsubscribe('uploadCompleted', uploadCompletedSub) - uppyService.unregisterUploadInputElement(unref(input)) + uppyService.removeUploadInput(unref(input)) }) const inputId = computed(() => { diff --git a/packages/web-pkg/src/services/uppy/uppyService.ts b/packages/web-pkg/src/services/uppy/uppyService.ts index 36e3cebee4..bdd75efae4 100644 --- a/packages/web-pkg/src/services/uppy/uppyService.ts +++ b/packages/web-pkg/src/services/uppy/uppyService.ts @@ -286,6 +286,9 @@ export class UppyService { const target = event.target as HTMLInputElement const files = Array.from(target.files || []) this.addFiles(files) + + el.removeEventListener('change', listener) + this.uploadInputListeners.delete(el) } this.uploadInputListeners.set(el, listener) @@ -300,10 +303,6 @@ export class UppyService { this.uploadInputListeners.delete(el) } - this.unregisterUploadInputElement(el) - } - - unregisterUploadInputElement(el: HTMLInputElement) { this.uploadInputs = this.uploadInputs.filter((input) => input !== el) } From b7528e9039e3c1a497a15a3eef26fcf887d84118 Mon Sep 17 00:00:00 2001 From: tammi-23 Date: Thu, 21 May 2026 14:43:23 +0200 Subject: [PATCH 4/4] wip: adjusted removeUploadInput --- packages/web-pkg/src/services/uppy/uppyService.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/web-pkg/src/services/uppy/uppyService.ts b/packages/web-pkg/src/services/uppy/uppyService.ts index bdd75efae4..04a20f22ec 100644 --- a/packages/web-pkg/src/services/uppy/uppyService.ts +++ b/packages/web-pkg/src/services/uppy/uppyService.ts @@ -286,23 +286,15 @@ export class UppyService { const target = event.target as HTMLInputElement const files = Array.from(target.files || []) this.addFiles(files) - - el.removeEventListener('change', listener) this.uploadInputListeners.delete(el) } this.uploadInputListeners.set(el, listener) - el.addEventListener('change', listener) + el.addEventListener('change', listener, { once: true }) this.uploadInputs.push(el) } removeUploadInput(el: HTMLInputElement) { - const listener = this.uploadInputListeners.get(el) - if (listener) { - el.removeEventListener('change', listener) - this.uploadInputListeners.delete(el) - } - this.uploadInputs = this.uploadInputs.filter((input) => input !== el) }