forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			No EOL
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			No EOL
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {Changes} from "../Osm/Changes";
 | 
						|
import Constants from "../../Models/Constants";
 | 
						|
import {UIEventSource} from "../UIEventSource";
 | 
						|
import {Utils} from "../../Utils";
 | 
						|
 | 
						|
export default class PendingChangesUploader {
 | 
						|
 | 
						|
    private lastChange: Date;
 | 
						|
 | 
						|
    constructor(changes: Changes, selectedFeature: UIEventSource<any>) {
 | 
						|
        const self = this;
 | 
						|
        this.lastChange = new Date();
 | 
						|
        changes.pendingChanges.addCallback(() => {
 | 
						|
            self.lastChange = new Date();
 | 
						|
 | 
						|
            window.setTimeout(() => {
 | 
						|
                const diff = (new Date().getTime() - self.lastChange.getTime()) / 1000;
 | 
						|
                if (Constants.updateTimeoutSec >= diff - 1) {
 | 
						|
                    changes.flushChanges("Flushing changes due to timeout");
 | 
						|
                }
 | 
						|
            }, Constants.updateTimeoutSec * 1000);
 | 
						|
        });
 | 
						|
 | 
						|
 | 
						|
        selectedFeature
 | 
						|
            .stabilized(10000)
 | 
						|
            .addCallback(feature => {
 | 
						|
                if (feature === undefined) {
 | 
						|
                    // The popup got closed - we flush
 | 
						|
                    changes.flushChanges("Flushing changes due to popup closed");
 | 
						|
                }
 | 
						|
            });
 | 
						|
 | 
						|
        if(Utils.runningFromConsole){
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        
 | 
						|
        document.addEventListener('mouseout', e => {
 | 
						|
            // @ts-ignore
 | 
						|
            if (!e.toElement && !e.relatedTarget) {
 | 
						|
                changes.flushChanges("Flushing changes due to focus lost");
 | 
						|
            }
 | 
						|
        });
 | 
						|
 | 
						|
        document.onfocus = () => {
 | 
						|
            changes.flushChanges("OnFocus")
 | 
						|
        }
 | 
						|
 | 
						|
        document.onblur = () => {
 | 
						|
            changes.flushChanges("OnFocus")
 | 
						|
        }
 | 
						|
        try {
 | 
						|
            document.addEventListener("visibilitychange", () => {
 | 
						|
                changes.flushChanges("Visibility change")
 | 
						|
            }, false);
 | 
						|
        } catch (e) {
 | 
						|
            console.warn("Could not register visibility change listener", e)
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        function onunload(e) {
 | 
						|
            if (changes.pendingChanges.data.length == 0) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            changes.flushChanges("onbeforeunload - probably closing or something similar");
 | 
						|
            e.preventDefault();
 | 
						|
            return "Saving your last changes..."
 | 
						|
        }
 | 
						|
 | 
						|
        window.onbeforeunload = onunload
 | 
						|
        // https://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad#4824156
 | 
						|
        window.addEventListener("pagehide", onunload)
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
} |