forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			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)
 | |
|     }
 | |
| }
 |