@@ -699,6 +682,7 @@ module.exports = React.createClass({
UserSettingsStore.setUrlPreviewsDisabled(e.target.checked);
},
+ // TODO: {Travis} Make this a component ()
_renderSyncedSetting: function(setting) {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
@@ -715,11 +699,13 @@ module.exports = React.createClass({
onChange={onChange}
/>
;
},
+ // TODO: {Travis} Make this a component ()
+ // {Travis} Maybe make that part of CheckboxSetting somehow?
_renderThemeSelector: function(setting) {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
@@ -811,22 +797,23 @@ module.exports = React.createClass({
} else return ();
},
+ // TODO: {Travis} Make this a component ()
_renderLocalSetting: function(setting) {
// TODO: this ought to be a separate component so that we don't need
// to rebind the onChange each time we render
const onChange = (e) => {
- UserSettingsStore.setLocalSetting(setting.id, e.target.checked);
+ SettingsStore.setValue(setting.id, null, "device", e.target.checked);
if (setting.fn) setting.fn(e.target.checked);
};
return
;
},
diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js
index 8ee6eafad4..de79c57ec4 100644
--- a/src/components/structures/login/Login.js
+++ b/src/components/structures/login/Login.js
@@ -22,8 +22,8 @@ import { _t, _tJsx } from '../../../languageHandler';
import * as languageHandler from '../../../languageHandler';
import sdk from '../../../index';
import Login from '../../../Login';
-import UserSettingsStore from '../../../UserSettingsStore';
import PlatformPeg from '../../../PlatformPeg';
+import SettingsStore from "../../../settings/SettingsStore";
// For validating phone numbers without country codes
const PHONE_NUMBER_REGEX = /^[0-9\(\)\-\s]*$/;
@@ -312,7 +312,7 @@ module.exports = React.createClass({
_onLanguageChange: function(newLang) {
if(languageHandler.getCurrentLanguage() !== newLang) {
- UserSettingsStore.setLocalSetting('language', newLang);
+ SettingsStore.setValue("language", null, "device", newLang);
PlatformPeg.get().reload();
}
},
diff --git a/src/components/views/elements/LanguageDropdown.js b/src/components/views/elements/LanguageDropdown.js
index 6e3f73f7d5..f6e63ca6f5 100644
--- a/src/components/views/elements/LanguageDropdown.js
+++ b/src/components/views/elements/LanguageDropdown.js
@@ -20,6 +20,7 @@ import React from 'react';
import sdk from '../../../index';
import UserSettingsStore from '../../../UserSettingsStore';
import * as languageHandler from '../../../languageHandler';
+import SettingsStore from "../../../settings/SettingsStore";
function languageMatchesSearchQuery(query, language) {
if (language.label.toUpperCase().indexOf(query.toUpperCase()) == 0) return true;
@@ -54,9 +55,10 @@ export default class LanguageDropdown extends React.Component {
// If no value is given, we start with the first
// country selected, but our parent component
// doesn't know this, therefore we do this.
- const _localSettings = UserSettingsStore.getLocalSettings();
- if (_localSettings.hasOwnProperty('language')) {
- this.props.onOptionChange(_localSettings.language);
+ // TODO: {Travis} Ensure the default is *not* used for this check. It should try and use the browser.
+ const language = SettingsStore.getValue("language");
+ if (language) {
+ this.props.onOptionChange(language);
}else {
const language = languageHandler.normalizeLanguageKey(languageHandler.getLanguageFromBrowser());
this.props.onOptionChange(language);
@@ -95,12 +97,13 @@ export default class LanguageDropdown extends React.Component {
// default value here too, otherwise we need to handle null / undefined
// values between mounting and the initial value propgating
+ // TODO: {Travis} Ensure the default is *not* used for this check. It should try and use the browser.
+ let language = SettingsStore.getValue("language");
let value = null;
- const _localSettings = UserSettingsStore.getLocalSettings();
- if (_localSettings.hasOwnProperty('language')) {
- value = this.props.value || _localSettings.language;
+ if (language) {
+ value = this.props.value || language;
} else {
- const language = navigator.language || navigator.userLanguage;
+ language = navigator.language || navigator.userLanguage;
value = this.props.value || language;
}
diff --git a/src/components/views/rooms/Autocomplete.js b/src/components/views/rooms/Autocomplete.js
index ecc908a02c..b2bfb45ad4 100644
--- a/src/components/views/rooms/Autocomplete.js
+++ b/src/components/views/rooms/Autocomplete.js
@@ -6,9 +6,9 @@ import isEqual from 'lodash/isEqual';
import sdk from '../../../index';
import type {Completion} from '../../../autocomplete/Autocompleter';
import Promise from 'bluebird';
-import UserSettingsStore from '../../../UserSettingsStore';
import {getCompletions} from '../../../autocomplete/Autocompleter';
+import SettingsStore from "../../../settings/SettingsStore";
const COMPOSER_SELECTED = 0;
@@ -66,7 +66,7 @@ export default class Autocomplete extends React.Component {
});
return Promise.resolve(null);
}
- let autocompleteDelay = UserSettingsStore.getLocalSetting('autocompleteDelay', 200);
+ let autocompleteDelay = SettingsStore.getValue("autocompleteDelay");
// Don't debounce if we are already showing completions
if (this.state.completions.length > 0 || this.state.forceComplete) {
diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js
index f582cc29ef..e109371f8b 100644
--- a/src/components/views/rooms/RoomSettings.js
+++ b/src/components/views/rooms/RoomSettings.js
@@ -23,7 +23,6 @@ import sdk from '../../../index';
import Modal from '../../../Modal';
import ObjectUtils from '../../../ObjectUtils';
import dis from '../../../dispatcher';
-import UserSettingsStore from '../../../UserSettingsStore';
import AccessibleButton from '../elements/AccessibleButton';
import SettingsStore from "../../../settings/SettingsStore";
@@ -370,7 +369,8 @@ module.exports = React.createClass({
},
_isRoomBlacklistUnverified: function() {
- const blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom;
+ // TODO: {Travis} Use generic blacklistUnverifiedDevices
+ const blacklistUnverifiedDevicesPerRoom = SettingsStore.getValue("blacklistUnverifiedDevicesPerRoom");
if (blacklistUnverifiedDevicesPerRoom) {
return blacklistUnverifiedDevicesPerRoom[this.props.room.roomId];
}
@@ -378,9 +378,10 @@ module.exports = React.createClass({
},
_setRoomBlacklistUnverified: function(value) {
- const blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom || {};
+ // TODO: {Travis} Use generic blacklistUnverifiedDevices
+ const blacklistUnverifiedDevicesPerRoom = SettingsStore.getValue("blacklistUnverifiedDevicesPerRoom");
blacklistUnverifiedDevicesPerRoom[this.props.room.roomId] = value;
- UserSettingsStore.setLocalSetting('blacklistUnverifiedDevicesPerRoom', blacklistUnverifiedDevicesPerRoom);
+ SettingsStore.setValue("blacklistUnverifiedDevicesPerRoom", null, "device", blacklistUnverifiedDevicesPerRoom);
this.props.room.setBlacklistUnverifiedDevices(value);
},
@@ -591,7 +592,7 @@ module.exports = React.createClass({
const cli = MatrixClientPeg.get();
const roomState = this.props.room.currentState;
const isEncrypted = cli.isRoomEncrypted(this.props.room.roomId);
- const isGlobalBlacklistUnverified = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevices;
+ const isGlobalBlacklistUnverified = SettingsStore.getValue("blacklistUnverifiedDevices");
const isRoomBlacklistUnverified = this._isRoomBlacklistUnverified();
const settings =
diff --git a/src/languageHandler.js b/src/languageHandler.js
index a90b78c40e..599c1edb40 100644
--- a/src/languageHandler.js
+++ b/src/languageHandler.js
@@ -19,8 +19,7 @@ import request from 'browser-request';
import counterpart from 'counterpart';
import Promise from 'bluebird';
import React from 'react';
-
-import UserSettingsStore from './UserSettingsStore';
+import SettingsStore from "./settings/SettingsStore";
const i18nFolder = 'i18n/';
@@ -168,7 +167,7 @@ export function setLanguage(preferredLangs) {
}).then((langData) => {
counterpart.registerTranslations(langToUse, langData);
counterpart.setLocale(langToUse);
- UserSettingsStore.setLocalSetting('language', langToUse);
+ SettingsStore.setValue("language", null, "device", langToUse);
console.log("set language to " + langToUse);
// Set 'en' as fallback language:
diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js
index 804b5df65c..357c5eb484 100644
--- a/src/settings/SettingsStore.js
+++ b/src/settings/SettingsStore.js
@@ -157,6 +157,41 @@ const SETTINGS = {
supportedLevels: LEVELS_PRESET_ACCOUNT,
default: "light",
},
+ "webRtcForceTURN": {
+ supportedLevels: ['device'],
+ default: false,
+ displayName: _td('Disable Peer-to-Peer for 1:1 calls'),
+ },
+ "webrtc_audioinput": {
+ supportedLevels: ['device'],
+ },
+ "webrtc_videoinput": {
+ supportedLevels: ['device'],
+ },
+ "language": {
+ supportedLevels: ['device'],
+ default: "en"
+ },
+ "analyticsOptOut": {
+ supportedLevels: ['device'],
+ default: false,
+ displayName: _td('Opt out of analytics'),
+ },
+ "autocompleteDelay": {
+ supportedLevels: ['device'],
+ default: 200,
+ },
+ "blacklistUnverifiedDevicesPerRoom": {
+ // TODO: {Travis} Write a migration path to support blacklistUnverifiedDevices
+ supportedLevels: ['device'],
+ default: {},
+ },
+ "blacklistUnverifiedDevices": {
+ // TODO: {Travis} Write a migration path to support blacklistUnverifiedDevices
+ supportedLevels: ['device'],
+ default: false,
+ label: _td('Never send encrypted messages to unverified devices from this device'),
+ }
};
// Convert the above into simpler formats for the handlers