/* global Whisper, i18n, libloki, textsecure */ // eslint-disable-next-line func-names (function() { 'use strict'; window.Whisper = window.Whisper || {}; Whisper.DevicePairingDialogView = Whisper.View.extend({ className: 'loki-dialog device-pairing-dialog modal', templateName: 'device-pairing-dialog', initialize() { this.pubKeyRequests = []; this.pubKey = null; this.accepted = false; this.isListening = false; this.view = ''; this.render(); this.showView(); }, events: { 'click #startPairing': 'startReceivingRequests', 'click #close': 'close', 'click .waitingForRequestView .cancel': 'stopReceivingRequests', 'click .requestReceivedView .skip': 'skipDevice', 'click #allowPairing': 'allowDevice', 'click .requestAcceptedView .ok': 'stopReceivingRequests', }, render_attributes() { return { defaultTitle: i18n('pairedDevices'), waitingForRequestTitle: i18n('waitingForDeviceToRegister'), requestReceivedTitle: i18n('devicePairingReceived'), requestAcceptedTitle: i18n('devicePairingAccepted'), startPairingText: i18n('pairNewDevice'), cancelText: i18n('cancel'), closeText: i18n('close'), skipText: i18n('skip'), okText: i18n('ok'), allowPairingText: i18n('allowPairing'), }; }, startReceivingRequests() { this.trigger('startReceivingRequests'); this.isListening = true; this.showView(); }, stopReceivingRequests() { this.trigger('stopReceivingRequests'); this.isListening = false; this.showView(); }, requestReceived(secondaryDevicePubKey) { // FIFO: push at the front of the array with unshift() this.pubKeyRequests.unshift(secondaryDevicePubKey); if (!this.pubKey) { this.nextPubKey(); this.showView('requestReceived'); } }, allowDevice() { this.accepted = true; this.trigger('devicePairingRequestAccepted', this.pubKey, errors => this.transmisssionCB(errors) ); this.showView(); }, transmisssionCB(errors) { if (!errors) { this.$('.transmissionStatus').text(i18n('sent')); } else { this.$('.transmissionStatus').text(errors); } this.$('.requestAcceptedView .ok').show(); }, skipDevice() { this.trigger('devicePairingRequestRejected', this.pubKey); this.nextPubKey(); this.showView(); }, nextPubKey() { // FIFO: pop at the back of the array using pop() this.pubKey = this.pubKeyRequests.pop(); }, async showView() { const defaultView = this.$('.defaultView'); const waitingForRequestView = this.$('.waitingForRequestView'); const requestReceivedView = this.$('.requestReceivedView'); const requestAcceptedView = this.$('.requestAcceptedView'); if (!this.isListening) { const ourPubKey = textsecure.storage.user.getNumber(); defaultView.show(); requestReceivedView.hide(); waitingForRequestView.hide(); requestAcceptedView.hide(); const pubKeys = await libloki.storage.getSecondaryDevicesFor(ourPubKey); if (pubKeys && pubKeys.length > 0) { this.$('#pairedPubKeys').empty(); pubKeys.forEach(x => { this.$('#pairedPubKeys').append(`