From ce7bc8fb6cc373e96179e57395818d6e6befd942 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 28 Mar 2024 15:55:12 +0100 Subject: [PATCH] Fix: add 'onbeforeunload' if images are uploading, see #1841 --- src/Logic/Actors/PendingChangesUploader.ts | 7 +++++-- src/Logic/ImageProviders/ImageUploadManager.ts | 8 ++++++++ src/Models/ThemeViewState.ts | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Logic/Actors/PendingChangesUploader.ts b/src/Logic/Actors/PendingChangesUploader.ts index 37070ce356..ccfeded6c5 100644 --- a/src/Logic/Actors/PendingChangesUploader.ts +++ b/src/Logic/Actors/PendingChangesUploader.ts @@ -3,9 +3,10 @@ import Constants from "../../Models/Constants" import { UIEventSource } from "../UIEventSource" import { Utils } from "../../Utils" import { Feature } from "geojson" +import { ImageUploadManager } from "../ImageProviders/ImageUploadManager" export default class PendingChangesUploader { - constructor(changes: Changes, selectedFeature: UIEventSource) { + constructor(changes: Changes, selectedFeature: UIEventSource, uploader : ImageUploadManager) { changes.pendingChanges .stabilized(Constants.updateTimeoutSec * 1000) .addCallback(() => changes.flushChanges("Flushing changes due to timeout")) @@ -48,7 +49,9 @@ export default class PendingChangesUploader { } function onunload(e) { - if (changes.pendingChanges.data.length == 0) { + const pendingChanges = changes.pendingChanges.data.length + const uploadingImages = uploader.isUploading.data + if (pendingChanges == 0 && !uploadingImages) { return } changes.flushChanges("onbeforeunload - probably closing or something similar") diff --git a/src/Logic/ImageProviders/ImageUploadManager.ts b/src/Logic/ImageProviders/ImageUploadManager.ts index f20b689d21..4179c2ca52 100644 --- a/src/Logic/ImageProviders/ImageUploadManager.ts +++ b/src/Logic/ImageProviders/ImageUploadManager.ts @@ -24,6 +24,7 @@ export class ImageUploadManager { private readonly _uploadRetriedSuccess: Map> = new Map() private readonly _osmConnection: OsmConnection private readonly _changes: Changes + public readonly isUploading: Store constructor( layout: LayoutConfig, @@ -37,6 +38,13 @@ export class ImageUploadManager { this._layout = layout this._osmConnection = osmConnection this._changes = changes + + const failed = this.getCounterFor(this._uploadFailed, "*") + const done = this.getCounterFor(this._uploadFinished, "*") + + this.isUploading = this.getCounterFor(this._uploadStarted, "*").map(startedCount => { + return startedCount > failed.data + done.data + }, [failed, done]) } /** diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index 8a3b7b75c2..49b3a29b97 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -810,7 +810,7 @@ export default class ThemeViewState implements SpecialVisualizationState { new MetaTagging(this) new TitleHandler(this.selectedElement, this.featureProperties, this) new ChangeToElementsActor(this.changes, this.featureProperties) - new PendingChangesUploader(this.changes, this.selectedElement) + new PendingChangesUploader(this.changes, this.selectedElement, this.imageUploadManager) new SelectedElementTagsUpdater(this) new BackgroundLayerResetter(this.mapProperties.rasterLayer, this.availableLayers) new PreferredRasterLayerSelector(