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..e823c740e --- /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/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; + } + } + } +}