Signal-Desktop/js/views/settings_view.js

336 lines
11 KiB
JavaScript
Raw Normal View History

2020-10-30 20:34:04 +00:00
// Copyright 2016-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* global i18n: false */
/* global Whisper: false */
/* global $: false */
/* eslint-disable no-new */
// eslint-disable-next-line func-names
(function () {
2018-04-27 21:25:04 +00:00
window.Whisper = window.Whisper || {};
const { Settings } = window.Signal.Types;
2016-02-19 00:13:53 +00:00
const CheckboxView = Whisper.View.extend({
initialize(options) {
2018-08-09 23:36:41 +00:00
this.name = options.name;
this.setFn = options.setFn;
this.value = options.value;
2018-04-27 21:25:04 +00:00
this.populate();
},
events: {
change: 'change',
},
change(e) {
const value = e.target.checked;
this.setFn(value);
window.log.info(this.name, 'changed to', value);
2018-04-27 21:25:04 +00:00
},
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));
2018-04-27 21:25:04 +00:00
},
});
2020-06-04 18:16:19 +00:00
const MediaCameraPermissionsSettingView = 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-camera-permissions changed to', this.value);
},
populate() {
this.$('input').prop('checked', Boolean(this.value));
},
});
const RadioButtonGroupView = Whisper.View.extend({
initialize(options) {
2018-04-27 21:25:04 +00:00
this.name = options.name;
this.setFn = options.setFn;
this.value = options.value;
2018-04-27 21:25:04 +00:00
this.populate();
},
events: {
change: 'change',
},
change(e) {
const value = this.$(e.target).val();
this.setFn(value);
window.log.info(this.name, 'changed to', value);
2018-04-27 21:25:04 +00:00
},
populate() {
this.$(`#${this.name}-${this.value}`).attr('checked', 'checked');
2018-04-27 21:25:04 +00:00
},
});
Whisper.SettingsView = Whisper.View.extend({
className: 'settings modal expand',
templateName: 'settings',
initialize() {
2018-04-27 21:25:04 +00:00
this.render();
new RadioButtonGroupView({
el: this.$('.notification-settings'),
name: 'notification-setting',
value: window.initialData.notificationSetting,
setFn: window.setNotificationSetting,
2018-04-27 21:25:04 +00:00
});
new RadioButtonGroupView({
el: this.$('.theme-settings'),
name: 'theme-setting',
value: window.initialData.themeSetting,
setFn: theme => {
$(document.body)
.removeClass('dark-theme')
.removeClass('light-theme')
2019-05-16 22:32:38 +00:00
.addClass(
`${theme === 'system' ? window.systemTheme : theme}-theme`
);
window.setThemeSetting(theme);
},
2018-04-27 21:25:04 +00:00
});
if (Settings.isDrawAttentionSupported()) {
new CheckboxView({
el: this.$('.draw-attention-setting'),
name: 'draw-attention-setting',
value: window.initialData.notificationDrawAttention,
setFn: window.setNotificationDrawAttention,
});
}
2018-04-27 21:25:04 +00:00
if (Settings.isAudioNotificationSupported()) {
new CheckboxView({
el: this.$('.audio-notification-setting'),
2018-08-09 23:36:41 +00:00
name: 'audio-notification-setting',
value: window.initialData.audioNotification,
setFn: window.setAudioNotification,
2018-04-27 21:25:04 +00:00
});
}
new CheckboxView({
el: this.$('.badge-count-muted-conversations-setting'),
name: 'badge-count-muted-conversations-setting',
value: window.initialData.countMutedConversations,
setFn: window.setCountMutedConversations,
});
2018-07-19 01:46:12 +00:00
new CheckboxView({
el: this.$('.spell-check-setting'),
2018-08-09 23:36:41 +00:00
name: 'spell-check-setting',
2018-07-19 01:46:12 +00:00
value: window.initialData.spellCheck,
2020-03-20 21:00:11 +00:00
setFn: val => {
const $msg = this.$('.spell-check-setting-message');
if (val !== window.appStartInitialSpellcheckSetting) {
$msg.show();
$msg.attr('aria-hidden', false);
} else {
$msg.hide();
$msg.attr('aria-hidden', true);
}
window.setSpellCheck(val);
},
2018-07-19 01:46:12 +00:00
});
if (Settings.isHideMenuBarSupported()) {
new CheckboxView({
el: this.$('.menu-bar-setting'),
name: 'menu-bar-setting',
value: window.initialData.hideMenuBar,
setFn: window.setHideMenuBar,
});
}
2020-06-04 18:16:19 +00:00
new CheckboxView({
el: this.$('.always-relay-calls-setting'),
name: 'always-relay-calls-setting',
value: window.initialData.alwaysRelayCalls,
setFn: window.setAlwaysRelayCalls,
});
new CheckboxView({
el: this.$('.call-ringtone-notification-setting'),
name: 'call-ringtone-notification-setting',
value: window.initialData.callRingtoneNotification,
setFn: window.setCallRingtoneNotification,
});
new CheckboxView({
el: this.$('.call-system-notification-setting'),
name: 'call-system-notification-setting',
value: window.initialData.callSystemNotification,
setFn: window.setCallSystemNotification,
});
new CheckboxView({
el: this.$('.incoming-call-notification-setting'),
name: 'incoming-call-notification-setting',
value: window.initialData.incomingCallNotification,
setFn: window.setIncomingCallNotification,
});
new MediaPermissionsSettingView({
el: this.$('.media-permissions'),
value: window.initialData.mediaPermissions,
setFn: window.setMediaPermissions,
});
2020-06-04 18:16:19 +00:00
new MediaCameraPermissionsSettingView({
el: this.$('.media-camera-permissions'),
value: window.initialData.mediaCameraPermissions,
setFn: window.setMediaCameraPermissions,
});
if (!window.initialData.isPrimary) {
const syncView = new SyncView().render();
2018-04-27 21:25:04 +00:00
this.$('.sync-setting').append(syncView.el);
}
},
events: {
'click .close': 'onClose',
2018-04-27 21:25:04 +00:00
'click .clear-data': 'onClearData',
},
render_attributes() {
2020-03-25 15:16:10 +00:00
const appStartSpellCheck = window.appStartInitialSpellcheckSetting;
2020-03-20 21:00:11 +00:00
const spellCheckDirty =
2020-03-25 15:16:10 +00:00
window.initialData.spellCheck !== appStartSpellCheck;
2020-03-20 21:00:11 +00:00
2018-04-27 21:25:04 +00:00
return {
deviceNameLabel: i18n('deviceName'),
deviceName: window.initialData.deviceName,
2018-04-27 21:25:04 +00:00
theme: i18n('theme'),
notifications: i18n('notifications'),
notificationSettingsDialog: i18n('notificationSettingsDialog'),
settings: i18n('Keyboard--preferences'),
2018-04-27 21:25:04 +00:00
disableNotifications: i18n('disableNotifications'),
nameAndMessage: i18n('nameAndMessage'),
noNameOrMessage: i18n('noNameOrMessage'),
nameOnly: i18n('nameOnly'),
notificationDrawAttention: i18n('notificationDrawAttention'),
2018-04-27 21:25:04 +00:00
audioNotificationDescription: i18n('audioNotificationDescription'),
isAudioNotificationSupported: Settings.isAudioNotificationSupported(),
isHideMenuBarSupported: Settings.isHideMenuBarSupported(),
isDrawAttentionSupported: Settings.isDrawAttentionSupported(),
2020-07-20 18:32:23 +00:00
hasSystemTheme: true,
themeLight: i18n('themeLight'),
themeDark: i18n('themeDark'),
2019-05-16 22:32:38 +00:00
themeSystem: i18n('themeSystem'),
2018-04-27 21:25:04 +00:00
hideMenuBar: i18n('hideMenuBar'),
clearDataHeader: i18n('clearDataHeader'),
clearDataButton: i18n('clearDataButton'),
clearDataExplanation: i18n('clearDataExplanation'),
2020-06-04 18:16:19 +00:00
calling: i18n('calling'),
countMutedConversationsDescription: i18n(
'countMutedConversationsDescription'
),
2020-06-04 18:16:19 +00:00
alwaysRelayCallsDescription: i18n('alwaysRelayCallsDescription'),
alwaysRelayCallsDetail: i18n('alwaysRelayCallsDetail'),
callRingtoneNotificationDescription: i18n(
'callRingtoneNotificationDescription'
),
callSystemNotificationDescription: i18n(
'callSystemNotificationDescription'
),
incomingCallNotificationDescription: i18n(
'incomingCallNotificationDescription'
),
permissions: i18n('permissions'),
mediaPermissionsDescription: i18n('mediaPermissionsDescription'),
2020-06-04 18:16:19 +00:00
mediaCameraPermissionsDescription: i18n(
'mediaCameraPermissionsDescription'
),
2019-01-16 03:03:56 +00:00
generalHeader: i18n('general'),
2018-07-19 01:46:12 +00:00
spellCheckDescription: i18n('spellCheckDescription'),
2020-03-20 21:00:11 +00:00
spellCheckHidden: spellCheckDirty ? 'false' : 'true',
spellCheckDisplay: spellCheckDirty ? 'inherit' : 'none',
2020-03-25 15:16:10 +00:00
spellCheckDirtyText: appStartSpellCheck
? i18n('spellCheckWillBeDisabled')
: i18n('spellCheckWillBeEnabled'),
2018-04-27 21:25:04 +00:00
};
},
onClose() {
window.closeSettings();
},
onClearData() {
window.deleteAllData();
window.closeSettings();
},
});
const SyncView = Whisper.View.extend({
2018-04-27 21:25:04 +00:00
templateName: 'syncSettings',
className: 'syncSettings',
events: {
'click .sync': 'sync',
},
initialize() {
this.lastSyncTime = window.initialData.lastSyncTime;
},
enable() {
2018-04-27 21:25:04 +00:00
this.$('.sync').text(i18n('syncNow'));
this.$('.sync').removeAttr('disabled');
},
disable() {
2018-04-27 21:25:04 +00:00
this.$('.sync').attr('disabled', 'disabled');
this.$('.sync').text(i18n('syncing'));
},
onsuccess() {
window.setLastSyncTime(Date.now());
this.lastSyncTime = Date.now();
window.log.info('sync successful');
2018-04-27 21:25:04 +00:00
this.enable();
this.render();
},
ontimeout() {
window.log.error('sync timed out');
2018-04-27 21:25:04 +00:00
this.$('.synced_at').hide();
this.$('.sync_failed').show();
this.enable();
},
async sync() {
2018-04-27 21:25:04 +00:00
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();
2018-04-27 21:25:04 +00:00
}
},
render_attributes() {
const attrs = {
2018-04-27 21:25:04 +00:00
sync: i18n('sync'),
syncNow: i18n('syncNow'),
syncExplanation: i18n('syncExplanation'),
syncFailed: i18n('syncFailed'),
};
let date = this.lastSyncTime;
2018-04-27 21:25:04 +00:00
if (date) {
date = new Date(date);
attrs.lastSynced = i18n('lastSynced');
attrs.syncDate = date.toLocaleDateString();
attrs.syncTime = date.toLocaleTimeString();
}
return attrs;
},
});
2016-02-19 00:13:53 +00:00
})();