diff --git a/containers/libreportal/frontend/js/components/app/app-tabbed-manager.js b/containers/libreportal/frontend/js/components/app/app-tabbed-manager.js index f6fe575..8cae508 100755 --- a/containers/libreportal/frontend/js/components/app/app-tabbed-manager.js +++ b/containers/libreportal/frontend/js/components/app/app-tabbed-manager.js @@ -708,11 +708,16 @@ class AppTabbedManager { this.switchTab('tasks'); } - // Monitor URL changes for app navigation - this.setupURLMonitoring(); - - // Listen for task creation events - this.setupTaskEventListeners(); + // Monitor URL changes for app navigation + listen for task events. These + // add window-level listeners (popstate, taskCreated/Completed/Updated), so + // bind them ONCE for the lifetime of this singleton — initialize() re-runs + // on every /app navigation (the `initialized` flag is never set true), and + // without this guard each visit stacked another set of window listeners. + if (!this._listenersWired) { + this._listenersWired = true; + this.setupURLMonitoring(); + this.setupTaskEventListeners(); + } // Set initial active tab (only if no task parameter) if (!taskId) {