You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /*
 | |
|  * vim: ts=4:sw=4:expandtab
 | |
|  */
 | |
| (function () {
 | |
|     'use strict';
 | |
|     window.Whisper = window.Whisper || {};
 | |
| 
 | |
|     Whisper.InstallView = Whisper.View.extend({
 | |
|         templateName: 'install_flow_template',
 | |
|         id: 'install',
 | |
|         className: 'main',
 | |
|         render_attributes: function() {
 | |
|             var playStoreHref = 'https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms';
 | |
|             var appStoreHref = 'https://itunes.apple.com/us/app/signal-private-messenger/id874139669';
 | |
|             var twitterHref = 'https://twitter.com/whispersystems';
 | |
|             return {
 | |
|                 installWelcome: i18n('installWelcome'),
 | |
|                 installTagline: i18n('installTagline'),
 | |
|                 installGetStartedButton: i18n('installGetStartedButton'),
 | |
|                 installSignalLink: this.i18n_with_links('installSignalLinks', playStoreHref, appStoreHref),
 | |
|                 installIHaveSignalButton: i18n('installGotIt'),
 | |
|                 installFollowUs: this.i18n_with_links('installFollowUs', twitterHref),
 | |
|                 installAndroidInstructions: i18n('installAndroidInstructions'),
 | |
|                 installLinkingWithNumber: i18n('installLinkingWithNumber'),
 | |
|                 installComputerName: i18n('installComputerName'),
 | |
|                 installFinalButton: i18n('installFinalButton'),
 | |
|                 installTooManyDevices: i18n('installTooManyDevices'),
 | |
|                 ok: i18n('ok'),
 | |
|             };
 | |
|         },
 | |
|         initialize: function(options) {
 | |
|             this.counter = 0;
 | |
| 
 | |
|             this.render();
 | |
| 
 | |
|             var deviceName = textsecure.storage.user.getDeviceName();
 | |
|             if (!deviceName) {
 | |
|                 if (navigator.userAgent.match('Mac OS')) {
 | |
|                     deviceName = 'Mac';
 | |
|                 } else if (navigator.userAgent.match('Linux')) {
 | |
|                     deviceName = 'Linux';
 | |
|                 } else if (navigator.userAgent.match('Windows')) {
 | |
|                     deviceName = 'Windows';
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             this.$('#device-name').val(deviceName);
 | |
|             this.$('#step1').show();
 | |
|             this.connect();
 | |
|             this.on('disconnected', this.reconnect);
 | |
|         },
 | |
|         connect: function() {
 | |
|             this.clearQR();
 | |
|             var accountManager = getAccountManager();
 | |
|             accountManager.registerSecondDevice(
 | |
|                 this.setProvisioningUrl.bind(this),
 | |
|                 this.confirmNumber.bind(this),
 | |
|                 this.incrementCounter.bind(this)
 | |
|             ).catch(this.handleDisconnect.bind(this));
 | |
|         },
 | |
|         handleDisconnect: function(e) {
 | |
|             if (e.message === 'websocket closed') {
 | |
|                 this.showConnectionError();
 | |
|                 this.trigger('disconnected');
 | |
|             } else if (e.name === 'HTTPError' && e.code == 411) {
 | |
|                 this.showTooManyDevices();
 | |
|             } else {
 | |
|                 throw e;
 | |
|             }
 | |
|         },
 | |
|         reconnect: function() {
 | |
|             setTimeout(this.connect.bind(this), 10000);
 | |
|         },
 | |
|         close: function() {
 | |
|             this.remove();
 | |
|             Whisper.events.trigger('openInbox');
 | |
|         },
 | |
|         events: function() {
 | |
|             return {
 | |
|                 'click .error-dialog .ok': 'connect',
 | |
|                 'click .step1': this.selectStep.bind(this, 1),
 | |
|                 'click .step2': this.selectStep.bind(this, 2),
 | |
|                 'click .step3': this.selectStep.bind(this, 3)
 | |
|             };
 | |
|         },
 | |
|         clearQR: function() {
 | |
|             this.$('#qr').text(i18n("installConnecting"));
 | |
|         },
 | |
|         setProvisioningUrl: function(url) {
 | |
|             this.$('#qr').html('');
 | |
|             new QRCode(this.$('#qr')[0]).makeCode(url);
 | |
|         },
 | |
|         confirmNumber: function(number) {
 | |
|             var parsed = libphonenumber.parse(number);
 | |
|             if (!libphonenumber.isValidNumber(parsed)) {
 | |
|                 throw new Error('Invalid number ' + number);
 | |
|             }
 | |
|             this.$('#step4 .number').text(libphonenumber.format(
 | |
|                 parsed,
 | |
|                 libphonenumber.PhoneNumberFormat.INTERNATIONAL
 | |
|             ));
 | |
|             this.selectStep(4);
 | |
|             this.$('#device-name').focus();
 | |
|             return new Promise(function(resolve, reject) {
 | |
|                 this.$('#step4 .cancel').click(function(e) {
 | |
|                     reject();
 | |
|                 });
 | |
|                 this.$('#step4').submit(function(e) {
 | |
|                     e.stopPropagation();
 | |
|                     e.preventDefault();
 | |
|                     var name = this.$('#device-name').val();
 | |
|                     name = name.replace(/\0/g,''); // strip unicode null
 | |
|                     if (name.trim().length === 0) {
 | |
|                         this.$('#device-name').focus();
 | |
|                         return;
 | |
|                     }
 | |
|                     this.$('.progress-dialog .status').text(i18n('installGeneratingKeys'));
 | |
|                     this.selectStep(5);
 | |
|                     resolve(name);
 | |
|                 }.bind(this));
 | |
|             }.bind(this));
 | |
|         },
 | |
|         incrementCounter: function() {
 | |
|             this.$('.progress-dialog .bar').css('width', (++this.counter * 100 / 100) + '%');
 | |
|         },
 | |
|         selectStep: function(step) {
 | |
|             this.$('.step').hide();
 | |
|             this.$('#step' + step).show();
 | |
|         },
 | |
|         showSync: function() {
 | |
|             this.$('.progress-dialog .status').text(i18n('installSyncingGroupsAndContacts'));
 | |
|             this.$('.progress-dialog .bar').addClass('progress-bar-striped active');
 | |
|         },
 | |
|         showTooManyDevices: function() {
 | |
|             this.selectStep('TooManyDevices');
 | |
|         },
 | |
|         showConnectionError: function() {
 | |
|             this.$('#qr').text(i18n("installConnectionFailed"));
 | |
|         },
 | |
|         hideDots: function() {
 | |
|             this.$('#step3 .nav .dot').hide();
 | |
|         }
 | |
|     });
 | |
| })();
 |