diff --git a/res/css/views/elements/_Field.scss b/res/css/views/elements/_Field.scss index 4f6e868249..75cc2bec34 100644 --- a/res/css/views/elements/_Field.scss +++ b/res/css/views/elements/_Field.scss @@ -64,7 +64,7 @@ limitations under the License. .mx_Field input:focus + label, .mx_Field input:not(:placeholder-shown) + label, -.mx_Field select:focus + label { +.mx_Field select + label /* Always show a select's label on top to not collide with the value */ { transition: font-size 0.25s ease-out 0s, color 0.25s ease-out 0s, diff --git a/res/css/views/settings/tabs/_GeneralSettingsTab.scss b/res/css/views/settings/tabs/_GeneralSettingsTab.scss index 2cfaebfb4d..cbf56ab559 100644 --- a/res/css/views/settings/tabs/_GeneralSettingsTab.scss +++ b/res/css/views/settings/tabs/_GeneralSettingsTab.scss @@ -14,11 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_GeneralSettingsTab_changePassword { +.mx_GeneralSettingsTab_changePassword, +.mx_GeneralSettingsTab_themeSection { display: block; } -.mx_GeneralSettingsTab_changePassword .mx_Field { +.mx_GeneralSettingsTab_changePassword .mx_Field, +.mx_GeneralSettingsTab_themeSection .mx_Field { display: block; margin-right: 100px; // Align with the other fields on the page } @@ -32,6 +34,13 @@ limitations under the License. margin-top: 0; } -.mx_GeneralSettingsTab_accountSection > .mx_EmailAddresses { +.mx_GeneralSettingsTab_themeSection .mx_Field select { + display: block; + width: 100%; +} + +.mx_GeneralSettingsTab_accountSection > .mx_EmailAddresses, +.mx_GeneralSettingsTab_accountSection > .mx_PhoneNumbers, +.mx_GeneralSettingsTab_languageInput { margin-right: 100px; // Align with the other fields on the page } \ No newline at end of file diff --git a/src/components/views/settings/tabs/GeneralSettingsTab.js b/src/components/views/settings/tabs/GeneralSettingsTab.js index 44237bacfb..6f4ebed848 100644 --- a/src/components/views/settings/tabs/GeneralSettingsTab.js +++ b/src/components/views/settings/tabs/GeneralSettingsTab.js @@ -24,8 +24,15 @@ import { DragDropContext } from 'react-beautiful-dnd'; import ProfileSettings from "../ProfileSettings"; import EmailAddresses from "../EmailAddresses"; import PhoneNumbers from "../PhoneNumbers"; +import Field from "../../elements/Field"; +import * as languageHandler from "../../../../languageHandler"; +import {SettingLevel} from "../../../../settings/SettingsStore"; +import SettingsStore from "../../../../settings/SettingsStore"; +import LanguageDropdown from "../../elements/LanguageDropdown"; +const PlatformPeg = require("../../../../PlatformPeg"); const sdk = require('../../../../index'); const Modal = require("../../../../Modal"); +const dis = require("../../../../dispatcher"); export default class GeneralSettingsTab extends React.Component { static childContextTypes = { @@ -34,6 +41,11 @@ export default class GeneralSettingsTab extends React.Component { constructor() { super(); + + this.state = { + language: languageHandler.getCurrentLanguage(), + theme: SettingsStore.getValueAt(SettingLevel.ACCOUNT, "theme"), + }; } getChildContext() { @@ -42,6 +54,22 @@ export default class GeneralSettingsTab extends React.Component { }; } + _onLanguageChange = (newLanguage) => { + if (this.state.language === newLanguage) return; + + SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLanguage); + this.setState({language: newLanguage}); + PlatformPeg.get().reload(); + }; + + _onThemeChange = (e) => { + const newTheme = e.target.value; + if (this.state.theme === newTheme) return; + + SettingsStore.setValue("theme", null, SettingLevel.ACCOUNT, newTheme); + dis.dispatch({action: 'set_theme', value: newTheme}); + }; + _onPasswordChangeError = (err) => { // TODO: Figure out a design that doesn't involve replacing the current dialog let errMsg = err.error || ""; @@ -114,19 +142,28 @@ export default class GeneralSettingsTab extends React.Component { } _renderLanguageSection() { + // TODO: Convert to new-styled Field return (
{_t("Language and region")} -

LANGUAGE SECTION

+
); } _renderThemeSection() { + // TODO: Re-enable theme selection once the themes actually work return ( -
+
{_t("Theme")} -

THEME SECTION

+ + + + + +
); }