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.
		
		
		
		
		
			
		
			
				
	
	
		
			328 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			328 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
| /* global i18n: false */
 | |
| /* global Whisper: false */
 | |
| /* global $: false */
 | |
| 
 | |
| /* eslint-disable no-new */
 | |
| 
 | |
| // eslint-disable-next-line func-names
 | |
| (function() {
 | |
|   'use strict';
 | |
| 
 | |
|   window.Whisper = window.Whisper || {};
 | |
|   const { Settings } = window.Signal.Types;
 | |
| 
 | |
|   const CheckboxView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.name = options.name;
 | |
|       this.setFn = options.setFn;
 | |
|       this.value = options.value;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|     },
 | |
|     change(e) {
 | |
|       const value = e.target.checked;
 | |
|       this.setFn(value);
 | |
|       window.log.info(this.name, 'changed to', value);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$('input').prop('checked', !!this.value);
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const MediaPermissionsSettingView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.value = options.value;
 | |
|       this.setFn = options.setFn;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|     },
 | |
|     change(e) {
 | |
|       this.value = e.target.checked;
 | |
|       this.setFn(this.value);
 | |
|       window.log.info('media-permissions changed to', this.value);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$('input').prop('checked', Boolean(this.value));
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const MessageTTLSettingView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.value = options.value;
 | |
|       this.setFn = options.setFn;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|       input: 'input',
 | |
|     },
 | |
|     change(e) {
 | |
|       this.value = e.target.value;
 | |
|       this.setFn(this.value);
 | |
|       window.log.info('message-ttl-setting changed to', this.value);
 | |
|     },
 | |
|     input(e) {
 | |
|       this.value = e.target.value;
 | |
|       this.$('label').html(`${this.value} Hours`);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$('input').val(this.value);
 | |
|       this.$('label').html(`${this.value} Hours`);
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const ReadReceiptSettingView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.value = options.value;
 | |
|       this.setFn = options.setFn;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|     },
 | |
|     change(e) {
 | |
|       this.value = e.target.checked;
 | |
|       this.setFn(this.value);
 | |
|       window.log.info('read-receipt-setting changed to', this.value);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$('input').prop('checked', Boolean(this.value));
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const TypingIndicatorsSettingView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.value = options.value;
 | |
|       this.setFn = options.setFn;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|     },
 | |
|     change(e) {
 | |
|       this.value = e.target.checked;
 | |
|       this.setFn(this.value);
 | |
|       window.log.info('typing-indicators-setting changed to', this.value);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$('input').prop('checked', Boolean(this.value));
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const RadioButtonGroupView = Whisper.View.extend({
 | |
|     initialize(options) {
 | |
|       this.name = options.name;
 | |
|       this.setFn = options.setFn;
 | |
|       this.value = options.value;
 | |
|       this.populate();
 | |
|     },
 | |
|     events: {
 | |
|       change: 'change',
 | |
|     },
 | |
|     change(e) {
 | |
|       const value = this.$(e.target).val();
 | |
|       this.setFn(value);
 | |
|       window.log.info(this.name, 'changed to', value);
 | |
|     },
 | |
|     populate() {
 | |
|       this.$(`#${this.name}-${this.value}`).attr('checked', 'checked');
 | |
|     },
 | |
|   });
 | |
|   Whisper.SettingsView = Whisper.View.extend({
 | |
|     className: 'settings modal expand',
 | |
|     templateName: 'settings',
 | |
|     initialize() {
 | |
|       this.render();
 | |
|       new RadioButtonGroupView({
 | |
|         el: this.$('.notification-settings'),
 | |
|         name: 'notification-setting',
 | |
|         value: window.initialData.notificationSetting,
 | |
|         setFn: window.setNotificationSetting,
 | |
|       });
 | |
|       new RadioButtonGroupView({
 | |
|         el: this.$('.theme-settings'),
 | |
|         name: 'theme-setting',
 | |
|         value: window.initialData.themeSetting,
 | |
|         setFn: theme => {
 | |
|           $(document.body)
 | |
|             .removeClass('dark-theme')
 | |
|             .removeClass('light-theme')
 | |
|             .addClass(`${theme}-theme`);
 | |
|           window.setThemeSetting(theme);
 | |
|         },
 | |
|       });
 | |
|       if (Settings.isAudioNotificationSupported()) {
 | |
|         new CheckboxView({
 | |
|           el: this.$('.audio-notification-setting'),
 | |
|           name: 'audio-notification-setting',
 | |
|           value: window.initialData.audioNotification,
 | |
|           setFn: window.setAudioNotification,
 | |
|         });
 | |
|       }
 | |
|       new CheckboxView({
 | |
|         el: this.$('.spell-check-setting'),
 | |
|         name: 'spell-check-setting',
 | |
|         value: window.initialData.spellCheck,
 | |
|         setFn: window.setSpellCheck,
 | |
|       });
 | |
|       if (Settings.isHideMenuBarSupported()) {
 | |
|         new CheckboxView({
 | |
|           el: this.$('.menu-bar-setting'),
 | |
|           name: 'menu-bar-setting',
 | |
|           value: window.initialData.hideMenuBar,
 | |
|           setFn: window.setHideMenuBar,
 | |
|         });
 | |
|       }
 | |
|       new CheckboxView({
 | |
|         el: this.$('.link-preview-setting'),
 | |
|         name: 'link-preview-setting',
 | |
|         value: window.initialData.linkPreviewSetting,
 | |
|         setFn: window.setLinkPreviewSetting,
 | |
|       });
 | |
|       new MediaPermissionsSettingView({
 | |
|         el: this.$('.media-permissions'),
 | |
|         value: window.initialData.mediaPermissions,
 | |
|         setFn: window.setMediaPermissions,
 | |
|       });
 | |
|       new ReadReceiptSettingView({
 | |
|         el: this.$('.read-receipt-setting'),
 | |
|         value: window.initialData.readReceiptSetting,
 | |
|         setFn: window.setReadReceiptSetting,
 | |
|       });
 | |
|       new TypingIndicatorsSettingView({
 | |
|         el: this.$('.typing-indicators-setting'),
 | |
|         value: window.initialData.typingIndicatorsSetting,
 | |
|         setFn: window.setTypingIndicatorsSetting,
 | |
|       });
 | |
|       new MessageTTLSettingView({
 | |
|         el: this.$('.message-ttl-setting'),
 | |
|         value: window.initialData.messageTTL,
 | |
|         setFn: window.setMessageTTL,
 | |
|       });
 | |
|       const blockedNumberView = new Whisper.BlockedNumberView().render();
 | |
|       this.$('.blocked-user-setting').append(blockedNumberView.el);
 | |
| 
 | |
|       if (!window.initialData.isPrimary) {
 | |
|         const syncView = new SyncView().render();
 | |
|         this.$('.sync-setting').append(syncView.el);
 | |
|       }
 | |
|     },
 | |
|     events: {
 | |
|       'click .close': 'onClose',
 | |
|       'click .clear-data': 'onClearData',
 | |
|     },
 | |
|     render_attributes() {
 | |
|       return {
 | |
|         deviceNameLabel: i18n('deviceName'),
 | |
|         deviceName: window.initialData.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(),
 | |
|         isHideMenuBarSupported: Settings.isHideMenuBarSupported(),
 | |
|         themeLight: i18n('themeLight'),
 | |
|         themeDark: i18n('themeDark'),
 | |
|         hideMenuBar: i18n('hideMenuBar'),
 | |
|         clearDataHeader: i18n('clearDataHeader'),
 | |
|         clearDataButton: i18n('clearDataButton'),
 | |
|         clearDataExplanation: i18n('clearDataExplanation'),
 | |
|         permissions: i18n('permissions'),
 | |
|         mediaPermissionsDescription: i18n('mediaPermissionsDescription'),
 | |
|         generalHeader: i18n('general'),
 | |
|         readReceiptSettingDescription: i18n('readReceiptSettingDescription'),
 | |
|         typingIndicatorsSettingDescription: i18n(
 | |
|           'typingIndicatorsSettingDescription'
 | |
|         ),
 | |
|         messageTTL: i18n('messageTTL'),
 | |
|         messageTTLSettingDescription: i18n('messageTTLSettingDescription'),
 | |
|         messageTTLSettingWarning: i18n('messageTTLSettingWarning'),
 | |
|         spellCheckHeader: i18n('spellCheck'),
 | |
|         spellCheckDescription: i18n('spellCheckDescription'),
 | |
|         blockedHeader: 'Blocked Users',
 | |
|         linkPreviews: i18n('linkPreviews'),
 | |
|         linkPreviewsSettingDescription: i18n('linkPreviewsSettingDescription'),
 | |
|       };
 | |
|     },
 | |
|     onClose() {
 | |
|       window.closeSettings();
 | |
|     },
 | |
|     onClearData() {
 | |
|       window.deleteAllData();
 | |
|       window.closeSettings();
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   const SyncView = Whisper.View.extend({
 | |
|     templateName: 'syncSettings',
 | |
|     className: 'syncSettings',
 | |
|     events: {
 | |
|       'click .sync': 'sync',
 | |
|     },
 | |
|     initialize() {
 | |
|       this.lastSyncTime = window.initialData.lastSyncTime;
 | |
|     },
 | |
|     enable() {
 | |
|       this.$('.sync').text(i18n('syncNow'));
 | |
|       this.$('.sync').removeAttr('disabled');
 | |
|     },
 | |
|     disable() {
 | |
|       this.$('.sync').attr('disabled', 'disabled');
 | |
|       this.$('.sync').text(i18n('syncing'));
 | |
|     },
 | |
|     onsuccess() {
 | |
|       window.setLastSyncTime(Date.now());
 | |
|       this.lastSyncTime = Date.now();
 | |
|       window.log.info('sync successful');
 | |
|       this.enable();
 | |
|       this.render();
 | |
|     },
 | |
|     ontimeout() {
 | |
|       window.log.error('sync timed out');
 | |
|       this.$('.synced_at').hide();
 | |
|       this.$('.sync_failed').show();
 | |
|       this.enable();
 | |
|     },
 | |
|     async sync() {
 | |
|       this.$('.sync_failed').hide();
 | |
|       if (window.initialData.isPrimary) {
 | |
|         window.log.warn('Tried to sync from device 1');
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       this.disable();
 | |
|       try {
 | |
|         await window.makeSyncRequest();
 | |
|         this.onsuccess();
 | |
|       } catch (error) {
 | |
|         this.ontimeout();
 | |
|       }
 | |
|     },
 | |
|     render_attributes() {
 | |
|       const attrs = {
 | |
|         sync: i18n('sync'),
 | |
|         syncNow: i18n('syncNow'),
 | |
|         syncExplanation: i18n('syncExplanation'),
 | |
|         syncFailed: i18n('syncFailed'),
 | |
|       };
 | |
|       let date = this.lastSyncTime;
 | |
|       if (date) {
 | |
|         date = new Date(date);
 | |
|         attrs.lastSynced = i18n('lastSynced');
 | |
|         attrs.syncDate = date.toLocaleDateString();
 | |
|         attrs.syncTime = date.toLocaleTimeString();
 | |
|       }
 | |
|       return attrs;
 | |
|     },
 | |
|   });
 | |
| })();
 |