/* 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 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 === 'system' ? window.systemTheme : 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 MediaPermissionsSettingView({ el: this.$('.media-permissions'), value: window.initialData.mediaPermissions, setFn: window.setMediaPermissions, }); 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(), hasSystemTheme: window.platform === 'darwin', themeLight: i18n('themeLight'), themeDark: i18n('themeDark'), themeSystem: i18n('themeSystem'), hideMenuBar: i18n('hideMenuBar'), clearDataHeader: i18n('clearDataHeader'), clearDataButton: i18n('clearDataButton'), clearDataExplanation: i18n('clearDataExplanation'), permissions: i18n('permissions'), mediaPermissionsDescription: i18n('mediaPermissionsDescription'), generalHeader: i18n('general'), spellCheckDescription: i18n('spellCheckDescription'), sendLinkPreviews: i18n('sendLinkPreviews'), linkPreviewsDescription: i18n('linkPreviewsDescription'), }; }, 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; }, }); })();