(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(); } } }); })();