|  |  |  | (function() { | 
					
						
							|  |  |  |   'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   window.Whisper = window.Whisper || {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Whisper.NetworkStatusView = Whisper.View.extend({ | 
					
						
							|  |  |  |     className: 'network-status', | 
					
						
							|  |  |  |     templateName: 'networkStatus', | 
					
						
							|  |  |  |     initialize: function() { | 
					
						
							|  |  |  |       this.$el.hide(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.renderIntervalHandle = setInterval(this.update.bind(this), 5000); | 
					
						
							|  |  |  |       extension.windows.onClosed( | 
					
						
							|  |  |  |         function() { | 
					
						
							|  |  |  |           clearInterval(this.renderIntervalHandle); | 
					
						
							|  |  |  |         }.bind(this) | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       setTimeout(this.finishConnectingGracePeriod.bind(this), 5000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.withinConnectingGracePeriod = true; | 
					
						
							|  |  |  |       this.setSocketReconnectInterval(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       window.addEventListener('online', this.update.bind(this)); | 
					
						
							|  |  |  |       window.addEventListener('offline', this.update.bind(this)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.model = new Backbone.Model(); | 
					
						
							|  |  |  |       this.listenTo(this.model, 'change', this.onChange); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     onReconnectTimer: function() { | 
					
						
							|  |  |  |       this.setSocketReconnectInterval(60000); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     finishConnectingGracePeriod: function() { | 
					
						
							|  |  |  |       this.withinConnectingGracePeriod = false; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     setSocketReconnectInterval: function(millis) { | 
					
						
							|  |  |  |       this.socketReconnectWaitDuration = moment.duration(millis); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     navigatorOnLine: function() { | 
					
						
							|  |  |  |       return navigator.onLine; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     getSocketStatus: function() { | 
					
						
							|  |  |  |       return window.getSocketStatus(); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     getNetworkStatus: function() { | 
					
						
							|  |  |  |       var message = ''; | 
					
						
							|  |  |  |       var instructions = ''; | 
					
						
							|  |  |  |       var hasInterruption = false; | 
					
						
							|  |  |  |       var action = null; | 
					
						
							|  |  |  |       var buttonClass = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var socketStatus = this.getSocketStatus(); | 
					
						
							|  |  |  |       switch (socketStatus) { | 
					
						
							|  |  |  |         case WebSocket.CONNECTING: | 
					
						
							|  |  |  |           message = i18n('connecting'); | 
					
						
							|  |  |  |           this.setSocketReconnectInterval(null); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         case WebSocket.OPEN: | 
					
						
							|  |  |  |           this.setSocketReconnectInterval(null); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         case WebSocket.CLOSING: | 
					
						
							|  |  |  |           message = i18n('disconnected'); | 
					
						
							|  |  |  |           instructions = i18n('checkNetworkConnection'); | 
					
						
							|  |  |  |           hasInterruption = true; | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         case WebSocket.CLOSED: | 
					
						
							|  |  |  |           message = i18n('disconnected'); | 
					
						
							|  |  |  |           instructions = i18n('checkNetworkConnection'); | 
					
						
							|  |  |  |           hasInterruption = true; | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if ( | 
					
						
							|  |  |  |         socketStatus == WebSocket.CONNECTING && | 
					
						
							|  |  |  |         !this.withinConnectingGracePeriod | 
					
						
							|  |  |  |       ) { | 
					
						
							|  |  |  |         hasInterruption = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (this.socketReconnectWaitDuration.asSeconds() > 0) { | 
					
						
							|  |  |  |         instructions = i18n('attemptingReconnection', [ | 
					
						
							|  |  |  |           this.socketReconnectWaitDuration.asSeconds(), | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (!this.navigatorOnLine()) { | 
					
						
							|  |  |  |         hasInterruption = true; | 
					
						
							|  |  |  |         message = i18n('offline'); | 
					
						
							|  |  |  |         instructions = i18n('checkNetworkConnection'); | 
					
						
							|  |  |  |       } else if (!Whisper.Registration.isDone()) { | 
					
						
							|  |  |  |         hasInterruption = true; | 
					
						
							|  |  |  |         message = i18n('Unlinked'); | 
					
						
							|  |  |  |         instructions = i18n('unlinkedWarning'); | 
					
						
							|  |  |  |         action = i18n('relink'); | 
					
						
							|  |  |  |         buttonClass = 'openInstaller'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         message: message, | 
					
						
							|  |  |  |         instructions: instructions, | 
					
						
							|  |  |  |         hasInterruption: hasInterruption, | 
					
						
							|  |  |  |         action: action, | 
					
						
							|  |  |  |         buttonClass: buttonClass, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     update: function() { | 
					
						
							|  |  |  |       var status = this.getNetworkStatus(); | 
					
						
							|  |  |  |       this.model.set(status); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     render_attributes: function() { | 
					
						
							|  |  |  |       return this.model.attributes; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     onChange: function() { | 
					
						
							|  |  |  |       this.render(); | 
					
						
							|  |  |  |       if (this.model.attributes.hasInterruption) { | 
					
						
							|  |  |  |         this.$el.slideDown(); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         this.$el.hide(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | })(); |