2018-04-27 21:25:04 +00:00
|
|
|
(function() {
|
|
|
|
'use strict';
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
window.Whisper = window.Whisper || {};
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
Whisper.NetworkStatusView = Whisper.View.extend({
|
|
|
|
className: 'network-status',
|
|
|
|
templateName: 'networkStatus',
|
|
|
|
initialize: function() {
|
|
|
|
this.$el.hide();
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
this.renderIntervalHandle = setInterval(this.update.bind(this), 5000);
|
|
|
|
extension.windows.onClosed(
|
|
|
|
function() {
|
|
|
|
clearInterval(this.renderIntervalHandle);
|
|
|
|
}.bind(this)
|
|
|
|
);
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
setTimeout(this.finishConnectingGracePeriod.bind(this), 5000);
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
this.withinConnectingGracePeriod = true;
|
|
|
|
this.setSocketReconnectInterval(null);
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
window.addEventListener('online', this.update.bind(this));
|
|
|
|
window.addEventListener('offline', this.update.bind(this));
|
2017-04-12 23:41:06 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
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;
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
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;
|
|
|
|
}
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
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';
|
|
|
|
}
|
2017-01-04 03:37:56 +00:00
|
|
|
|
2018-04-27 21:25:04 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
2017-01-04 03:37:56 +00:00
|
|
|
})();
|