@@ -147,11 +131,9 @@ class TabsBar extends React.PureComponent {
const mapStateToProps = state => {
const me = state.get('me');
- const settings = getSettings(state);
return {
account: state.getIn(['accounts', me]),
logo: state.getIn(['soapbox', 'logo']),
- themeMode: settings.get('themeMode'),
};
};
@@ -162,9 +144,6 @@ const mapDispatchToProps = (dispatch) => ({
onOpenSidebar() {
dispatch(openSidebar());
},
- toggleTheme(setting) {
- dispatch(changeSetting(['themeMode'], setting));
- },
});
export default injectIntl(
diff --git a/app/soapbox/features/ui/components/theme_toggle.js b/app/soapbox/features/ui/components/theme_toggle.js
new file mode 100644
index 000000000..54fe27404
--- /dev/null
+++ b/app/soapbox/features/ui/components/theme_toggle.js
@@ -0,0 +1,61 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { injectIntl, defineMessages } from 'react-intl';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import Icon from '../../../components/icon';
+import { changeSetting, getSettings } from 'soapbox/actions/settings';
+import SettingToggle from '../../notifications/components/setting_toggle';
+
+const messages = defineMessages({
+ switchToLight: { id: 'tabs_bar.theme_toggle_light', defaultMessage: 'Switch to light theme' },
+ switchToDark: { id: 'tabs_bar.theme_toggle_dark', defaultMessage: 'Switch to dark theme' },
+});
+
+const mapStateToProps = state => {
+ return {
+ settings: getSettings(state),
+ };
+};
+
+const mapDispatchToProps = (dispatch) => ({
+ toggleTheme(setting) {
+ dispatch(changeSetting(['themeMode'], setting));
+ },
+});
+
+export default @connect(mapStateToProps, mapDispatchToProps)
+@injectIntl
+class ThemeToggle extends React.PureComponent {
+
+ static propTypes = {
+ intl: PropTypes.object.isRequired,
+ settings: ImmutablePropTypes.map.isRequired,
+ toggleTheme: PropTypes.func,
+ showLabel: PropTypes.bool,
+ };
+
+ handleToggleTheme = () => {
+ this.props.toggleTheme(this.props.settings.get('themeMode') === 'light' ? 'dark' : 'light');
+ }
+
+ render() {
+ const { intl, settings, showLabel } = this.props;
+ let toggle = (
+
, unchecked:
}} ariaLabel={settings.get('themeMode') === 'light' ? intl.formatMessage(messages.switchToDark) : intl.formatMessage(messages.switchToLight)} />
+ );
+
+ if (showLabel) {
+ toggle = (
+
, unchecked:
}} label={settings.get('themeMode') === 'light' ? intl.formatMessage(messages.switchToDark) : intl.formatMessage(messages.switchToLight)} />
+ );
+ }
+
+ return (
+
+ {toggle}
+
+ );
+ }
+
+}
diff --git a/app/styles/application.scss b/app/styles/application.scss
index cc7f50243..bb3d0ca82 100644
--- a/app/styles/application.scss
+++ b/app/styles/application.scss
@@ -61,6 +61,7 @@
@import 'components/still-image';
@import 'components/timeline-queue-header';
@import 'components/badge';
+@import 'components/theme-toggle';
@import 'components/trends';
@import 'components/wtf-panel';
@import 'components/profile-info-panel';
diff --git a/app/styles/components/sidebar-menu.scss b/app/styles/components/sidebar-menu.scss
index e6b4d15a5..e8f59d047 100644
--- a/app/styles/components/sidebar-menu.scss
+++ b/app/styles/components/sidebar-menu.scss
@@ -161,6 +161,10 @@
margin-right: 10px;
}
+ &.theme-toggle {
+ padding-top: 0;
+ }
+
&:hover {
&__title {
color: var(--primary-text-color);
diff --git a/app/styles/components/tabs-bar.scss b/app/styles/components/tabs-bar.scss
index 91a6c678a..d5083f81d 100644
--- a/app/styles/components/tabs-bar.scss
+++ b/app/styles/components/tabs-bar.scss
@@ -111,14 +111,6 @@
}
}
- &__button-theme-toggle {
- margin-left: 10px;
- padding: 0 10px;
- font-size: 20px;
-
- .fa { margin-right: 0; }
- }
-
&__button-compose {
display: block;
@media screen and (max-width: $nav-breakpoint-3) {display: none;}
@@ -149,6 +141,23 @@
display: flex;
}
+ .theme-toggle {
+ @media screen and (max-width: $nav-breakpoint-3) {display: none;}
+
+ .setting-toggle {
+ margin-top: 3px;
+ margin-left: 10px;
+
+ .react-toggle--checked {
+ .react-toggle-track {
+ background-color: var(--accent-color);
+ }
+ &:hover:not(.react-toggle--disabled) .react-toggle-track {
+ background-color: var(--accent-color--bright);
+ }
+ }
+ }
+ }
}
.tabs-bar__link {
diff --git a/app/styles/components/theme-toggle.scss b/app/styles/components/theme-toggle.scss
new file mode 100644
index 000000000..f1a33e66b
--- /dev/null
+++ b/app/styles/components/theme-toggle.scss
@@ -0,0 +1,19 @@
+.theme-toggle {
+ .setting-toggle {
+
+ &__label {
+ margin-bottom: 0px;
+ vertical-align: middle;
+ }
+
+ .react-toggle {
+ vertical-align: middle;
+
+ &-track-check,
+ &-track-x {
+ height: 15px;
+ color: #fff;
+ }
+ }
+ }
+}