diff --git a/app/soapbox/actions/settings.js b/app/soapbox/actions/settings.js index 815479b96..0c2f35a8b 100644 --- a/app/soapbox/actions/settings.js +++ b/app/soapbox/actions/settings.js @@ -22,6 +22,7 @@ const defaultSettings = ImmutableMap({ defaultPrivacy: 'public', themeMode: 'light', locale: navigator.language.split(/[-_]/)[0] || 'en', + explanationBox: true, systemFont: false, dyslexicFont: false, diff --git a/app/soapbox/features/ui/components/explanation_box.js b/app/soapbox/features/ui/components/explanation_box.js index 4f27d056b..f3d84a4f0 100644 --- a/app/soapbox/features/ui/components/explanation_box.js +++ b/app/soapbox/features/ui/components/explanation_box.js @@ -1,25 +1,65 @@ import React from 'react'; import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { connect } from 'react-redux'; +import { defineMessages, injectIntl } from 'react-intl'; +import IconButton from 'soapbox/components/icon_button'; +import { changeSetting, getSettings } from 'soapbox/actions/settings'; -export default + +const messages = defineMessages({ + collapse: { id: 'explanation_box.collapse', defaultMessage: 'Collapse explanation box' }, + expand: { id: 'explanation_box.expand', defaultMessage: 'Expand explanation box' }, +}); + +const mapStateToProps = state => { + return { + settings: getSettings(state), + }; +}; + +const mapDispatchToProps = (dispatch) => ({ + toggleExplanationBox(setting) { + dispatch(changeSetting(['explanationBox'], setting)); + }, +}); + +export default @connect(mapStateToProps, mapDispatchToProps) +@injectIntl class ExplanationBox extends React.PureComponent { static propTypes = { title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), explanation: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), dismissable: PropTypes.bool, + intl: PropTypes.object.isRequired, + settings: ImmutablePropTypes.map.isRequired, + toggleExplanationBox: PropTypes.func, }; + handleToggleExplanationBox = () => { + this.props.toggleExplanationBox(this.props.settings.get('explanationBox') === true ? false : true); + } + render() { - const { title, explanation, dismissable } = this.props; + const { title, explanation, dismissable, settings, intl } = this.props; return (
- {title &&
{title}
} -
- {explanation} - {dismissable && Dismiss} -
+ {title &&
{title} + +
} + {settings.get('explanationBox') && +
+ {explanation} + {dismissable && Dismiss} +
+ }
); } diff --git a/app/styles/basics.scss b/app/styles/basics.scss index 7f5b06e0e..2dafa35a3 100644 --- a/app/styles/basics.scss +++ b/app/styles/basics.scss @@ -170,7 +170,10 @@ body { &__title { font-weight: bold; font-size: 16px; - margin-bottom: 1em; + } + + &__explanation { + margin-top: 1em; } &__dismiss {