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.
		
		
		
		
		
			
		
			
				
	
	
		
			244 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
/* global storage: false */
 | 
						|
/* global textsecure: false */
 | 
						|
/* global i18n: false */
 | 
						|
/* global Whisper: false */
 | 
						|
 | 
						|
/* eslint-disable */
 | 
						|
 | 
						|
(function() {
 | 
						|
  'use strict';
 | 
						|
  window.Whisper = window.Whisper || {};
 | 
						|
  const { Database } = window.Whisper;
 | 
						|
  const { OS, Logs } = window.Signal;
 | 
						|
  const { Settings } = window.Signal.Types;
 | 
						|
 | 
						|
  var CheckboxView = Whisper.View.extend({
 | 
						|
    initialize: function(options) {
 | 
						|
      this.name = options.name;
 | 
						|
      this.defaultValue = options.defaultValue;
 | 
						|
      this.event = options.event;
 | 
						|
      this.populate();
 | 
						|
    },
 | 
						|
    events: {
 | 
						|
      change: 'change',
 | 
						|
    },
 | 
						|
    change: function(e) {
 | 
						|
      var value = e.target.checked;
 | 
						|
      storage.put(this.name, value);
 | 
						|
      console.log(this.name, 'changed to', value);
 | 
						|
      if (this.event) {
 | 
						|
        this.$el.trigger(this.event);
 | 
						|
      }
 | 
						|
    },
 | 
						|
    populate: function() {
 | 
						|
      var value = storage.get(this.name, this.defaultValue);
 | 
						|
      this.$('input').prop('checked', !!value);
 | 
						|
    },
 | 
						|
  });
 | 
						|
  var RadioButtonGroupView = Whisper.View.extend({
 | 
						|
    initialize: function(options) {
 | 
						|
      this.name = options.name;
 | 
						|
      this.defaultValue = options.defaultValue;
 | 
						|
      this.event = options.event;
 | 
						|
      this.populate();
 | 
						|
    },
 | 
						|
    events: {
 | 
						|
      change: 'change',
 | 
						|
    },
 | 
						|
    change: function(e) {
 | 
						|
      var value = this.$(e.target).val();
 | 
						|
      storage.put(this.name, value);
 | 
						|
      console.log(this.name, 'changed to', value);
 | 
						|
      if (this.event) {
 | 
						|
        this.$el.trigger(this.event);
 | 
						|
      }
 | 
						|
    },
 | 
						|
    populate: function() {
 | 
						|
      var value = storage.get(this.name, this.defaultValue);
 | 
						|
      this.$('#' + this.name + '-' + value).attr('checked', 'checked');
 | 
						|
    },
 | 
						|
  });
 | 
						|
  Whisper.SettingsView = Whisper.View.extend({
 | 
						|
    className: 'settings modal expand',
 | 
						|
    templateName: 'settings',
 | 
						|
    initialize: function() {
 | 
						|
      this.deviceName = textsecure.storage.user.getDeviceName();
 | 
						|
      this.render();
 | 
						|
      new RadioButtonGroupView({
 | 
						|
        el: this.$('.notification-settings'),
 | 
						|
        defaultValue: 'message',
 | 
						|
        name: 'notification-setting',
 | 
						|
      });
 | 
						|
      new RadioButtonGroupView({
 | 
						|
        el: this.$('.theme-settings'),
 | 
						|
        defaultValue: 'android',
 | 
						|
        name: 'theme-setting',
 | 
						|
        event: 'change-theme',
 | 
						|
      });
 | 
						|
      if (Settings.isAudioNotificationSupported()) {
 | 
						|
        new CheckboxView({
 | 
						|
          el: this.$('.audio-notification-setting'),
 | 
						|
          defaultValue: false,
 | 
						|
          name: 'audio-notification',
 | 
						|
        });
 | 
						|
      }
 | 
						|
      new CheckboxView({
 | 
						|
        el: this.$('.menu-bar-setting'),
 | 
						|
        defaultValue: false,
 | 
						|
        name: 'hide-menu-bar',
 | 
						|
        event: 'change-hide-menu',
 | 
						|
      });
 | 
						|
      if (textsecure.storage.user.getDeviceId() != '1') {
 | 
						|
        var syncView = new SyncView().render();
 | 
						|
        this.$('.sync-setting').append(syncView.el);
 | 
						|
      }
 | 
						|
    },
 | 
						|
    events: {
 | 
						|
      'click .close': 'remove',
 | 
						|
      'click .clear-data': 'onClearData',
 | 
						|
    },
 | 
						|
    render_attributes: function() {
 | 
						|
      return {
 | 
						|
        deviceNameLabel: i18n('deviceName'),
 | 
						|
        deviceName: this.deviceName,
 | 
						|
        theme: i18n('theme'),
 | 
						|
        notifications: i18n('notifications'),
 | 
						|
        notificationSettingsDialog: i18n('notificationSettingsDialog'),
 | 
						|
        settings: i18n('settings'),
 | 
						|
        disableNotifications: i18n('disableNotifications'),
 | 
						|
        nameAndMessage: i18n('nameAndMessage'),
 | 
						|
        noNameOrMessage: i18n('noNameOrMessage'),
 | 
						|
        nameOnly: i18n('nameOnly'),
 | 
						|
        audioNotificationDescription: i18n('audioNotificationDescription'),
 | 
						|
        isAudioNotificationSupported: Settings.isAudioNotificationSupported(),
 | 
						|
        themeAndroidDark: i18n('themeAndroidDark'),
 | 
						|
        hideMenuBar: i18n('hideMenuBar'),
 | 
						|
        clearDataHeader: i18n('clearDataHeader'),
 | 
						|
        clearDataButton: i18n('clearDataButton'),
 | 
						|
        clearDataExplanation: i18n('clearDataExplanation'),
 | 
						|
      };
 | 
						|
    },
 | 
						|
    onClearData: function() {
 | 
						|
      var clearDataView = new ClearDataView().render();
 | 
						|
      $('body').append(clearDataView.el);
 | 
						|
    },
 | 
						|
  });
 | 
						|
 | 
						|
  /* jshint ignore:start */
 | 
						|
  /* eslint-enable */
 | 
						|
 | 
						|
  const CLEAR_DATA_STEPS = {
 | 
						|
    CHOICE: 1,
 | 
						|
    DELETING: 2,
 | 
						|
  };
 | 
						|
  const ClearDataView = Whisper.View.extend({
 | 
						|
    templateName: 'clear-data',
 | 
						|
    className: 'full-screen-flow overlay',
 | 
						|
    events: {
 | 
						|
      'click .cancel': 'onCancel',
 | 
						|
      'click .delete-all-data': 'onDeleteAllData',
 | 
						|
    },
 | 
						|
    initialize() {
 | 
						|
      this.step = CLEAR_DATA_STEPS.CHOICE;
 | 
						|
    },
 | 
						|
    onCancel() {
 | 
						|
      this.remove();
 | 
						|
    },
 | 
						|
    async onDeleteAllData() {
 | 
						|
      console.log('Deleting everything!');
 | 
						|
      this.step = CLEAR_DATA_STEPS.DELETING;
 | 
						|
      this.render();
 | 
						|
 | 
						|
      try {
 | 
						|
        await Database.close();
 | 
						|
        console.log('All database connections closed. Starting delete.');
 | 
						|
      } catch (error) {
 | 
						|
        console.log('Something went wrong closing all database connections.');
 | 
						|
      }
 | 
						|
 | 
						|
      this.clearAllData();
 | 
						|
    },
 | 
						|
    async clearAllData() {
 | 
						|
      try {
 | 
						|
        await Promise.all([Logs.deleteAll(), Database.drop()]);
 | 
						|
      } catch (error) {
 | 
						|
        console.log(
 | 
						|
          'Something went wrong deleting all data:',
 | 
						|
          error && error.stack ? error.stack : error
 | 
						|
        );
 | 
						|
      }
 | 
						|
      window.restart();
 | 
						|
    },
 | 
						|
    render_attributes() {
 | 
						|
      return {
 | 
						|
        isStep1: this.step === CLEAR_DATA_STEPS.CHOICE,
 | 
						|
        header: i18n('deleteAllDataHeader'),
 | 
						|
        body: i18n('deleteAllDataBody'),
 | 
						|
        cancelButton: i18n('cancel'),
 | 
						|
        deleteButton: i18n('deleteAllDataButton'),
 | 
						|
 | 
						|
        isStep2: this.step === CLEAR_DATA_STEPS.DELETING,
 | 
						|
        deleting: i18n('deleteAllDataProgress'),
 | 
						|
      };
 | 
						|
    },
 | 
						|
  });
 | 
						|
 | 
						|
  /* eslint-disable */
 | 
						|
  /* jshint ignore:end */
 | 
						|
 | 
						|
  var SyncView = Whisper.View.extend({
 | 
						|
    templateName: 'syncSettings',
 | 
						|
    className: 'syncSettings',
 | 
						|
    events: {
 | 
						|
      'click .sync': 'sync',
 | 
						|
    },
 | 
						|
    enable: function() {
 | 
						|
      this.$('.sync').text(i18n('syncNow'));
 | 
						|
      this.$('.sync').removeAttr('disabled');
 | 
						|
    },
 | 
						|
    disable: function() {
 | 
						|
      this.$('.sync').attr('disabled', 'disabled');
 | 
						|
      this.$('.sync').text(i18n('syncing'));
 | 
						|
    },
 | 
						|
    onsuccess: function() {
 | 
						|
      storage.put('synced_at', Date.now());
 | 
						|
      console.log('sync successful');
 | 
						|
      this.enable();
 | 
						|
      this.render();
 | 
						|
    },
 | 
						|
    ontimeout: function() {
 | 
						|
      console.log('sync timed out');
 | 
						|
      this.$('.synced_at').hide();
 | 
						|
      this.$('.sync_failed').show();
 | 
						|
      this.enable();
 | 
						|
    },
 | 
						|
    sync: function() {
 | 
						|
      this.$('.sync_failed').hide();
 | 
						|
      if (textsecure.storage.user.getDeviceId() != '1') {
 | 
						|
        this.disable();
 | 
						|
        var syncRequest = window.getSyncRequest();
 | 
						|
        syncRequest.addEventListener('success', this.onsuccess.bind(this));
 | 
						|
        syncRequest.addEventListener('timeout', this.ontimeout.bind(this));
 | 
						|
      } else {
 | 
						|
        console.log('Tried to sync from device 1');
 | 
						|
      }
 | 
						|
    },
 | 
						|
    render_attributes: function() {
 | 
						|
      var attrs = {
 | 
						|
        sync: i18n('sync'),
 | 
						|
        syncNow: i18n('syncNow'),
 | 
						|
        syncExplanation: i18n('syncExplanation'),
 | 
						|
        syncFailed: i18n('syncFailed'),
 | 
						|
      };
 | 
						|
      var date = storage.get('synced_at');
 | 
						|
      if (date) {
 | 
						|
        date = new Date(date);
 | 
						|
        attrs.lastSynced = i18n('lastSynced');
 | 
						|
        attrs.syncDate = date.toLocaleDateString();
 | 
						|
        attrs.syncTime = date.toLocaleTimeString();
 | 
						|
      }
 | 
						|
      return attrs;
 | 
						|
    },
 | 
						|
  });
 | 
						|
})();
 |