From 8cf2f0d87950facb7c2dc070af9f27f46c25ec37 Mon Sep 17 00:00:00 2001 From: Egon Zemmer Date: Thu, 12 Aug 2021 14:02:39 +0200 Subject: [PATCH 01/10] Solve #180: Multiple Uppload instances have problems. --- src/helpers/elements.ts | 17 +++++++++++++++++ src/uppload.ts | 21 +++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/helpers/elements.ts b/src/helpers/elements.ts index 291c0dba..b5ae9236 100644 --- a/src/helpers/elements.ts +++ b/src/helpers/elements.ts @@ -48,6 +48,23 @@ export const safeListen = ( listening.push({ element, type }); }; +/** + * Safely remove an event listener + * @param element - HTML element to remove event listener to + * @param type - Type of event listener to remove + * @param fn - Callback function to associated listener + */ +export const safeUnlisten = ( + element: Element, + type: string, + fn: EventListenerOrEventListenerObject +) => { + const listener = listening.findIndex((a) => a.element === element && a.type === type); + if (listener < 0) return; + element.removeEventListener(type, fn); + listening.splice(listener, 1); +}; + const safeRequestAnimationFrame = (callback: FrameRequestCallback) => { if (window.requestAnimationFrame) return window.requestAnimationFrame(callback); diff --git a/src/uppload.ts b/src/uppload.ts index 7bc01709..7c8e9a82 100644 --- a/src/uppload.ts +++ b/src/uppload.ts @@ -1,7 +1,7 @@ import { UpploadService } from "./service"; import { UpploadEffect } from "./effect"; import { setI18N, translate } from "./helpers/i18n"; -import { getElements, safeListen, compressImage } from "./helpers/elements"; +import { getElements, safeListen, safeUnlisten, compressImage } from "./helpers/elements"; import { colorSVG } from "./helpers/assets"; import createFocusTrap, { FocusTrap, Options } from "focus-trap"; import mitt from "mitt"; @@ -37,6 +37,7 @@ class UploadingService extends UpploadService { * Uppload image uploading widget */ export class Uppload implements IUppload { + id: string = `${+new Date()}`; services: UpploadService[] = [new DefaultService(), new UploadingService()]; effects: UpploadEffect[] = []; isOpen = false; @@ -62,6 +63,7 @@ export class Uppload implements IUppload { this.settings = {}; this.updateSettings(settings || {}); this.container = document.createElement("div"); + this.container.setAttribute("id", `uppload-${this.id}`); this.renderContainer(); this.container.classList.add("uppload-container"); const body = document.body; @@ -98,6 +100,7 @@ export class Uppload implements IUppload { updateSettings(settings: IUpploadSettings) { this.settings = { ...this.settings, ...settings }; this.emitter.emit("settingsUpdated", settings); + if (settings.id) this.id = settings.id; if (settings.lang) setI18N(settings.lang); if (settings.defaultService) this.activeService = settings.defaultService; if (settings.lang) this.lang = settings.lang; @@ -231,9 +234,11 @@ export class Uppload implements IUppload { let firstService = this.settings.defaultService; if (this.services.length === 3) this.navigate(this.services[2].name); if (firstService) this.navigate(firstService); - safeListen(document.body, "keyup", (e) => { - if ((e as KeyboardEvent).key === "Escape" && this.open) this.close(); - }); + const escape = (e) => { + if ((e as KeyboardEvent).key === "Escape" && this.isOpen) this.close(); + }; + safeUnlisten(document.body, "keyup", escape); + safeListen(document.body, "keyup", escape); setTimeout(() => { this.container.style.opacity = "1"; }, 1); @@ -341,12 +346,12 @@ export class Uppload implements IUppload { }" class="uppload-service-name"> ${ sidebar - ? `` + ? `` : "" } <${ sidebar - ? `label for="uppload-service-radio-${service.name}"` + ? `label for="uppload-service-radio-${service.name}-${this.id}"` : "button" } data-uppload-service="${service.name}"> ${ @@ -378,10 +383,10 @@ export class Uppload implements IUppload { ${this.effects .map( (effect) => ` - -