From 04463b8aafead83840ddde6e57c689433c9c7509 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 6 May 2022 12:37:46 -0500 Subject: [PATCH 1/8] EditProfile: use Toggle instead of Checkbox --- app/soapbox/features/edit_profile/index.tsx | 79 ++++++++++++--------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/app/soapbox/features/edit_profile/index.tsx b/app/soapbox/features/edit_profile/index.tsx index 647bb98e3..f3254dbc4 100644 --- a/app/soapbox/features/edit_profile/index.tsx +++ b/app/soapbox/features/edit_profile/index.tsx @@ -1,19 +1,16 @@ import React, { useState, useEffect, useMemo } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; +import Toggle from 'react-toggle'; import { updateNotificationSettings } from 'soapbox/actions/accounts'; import { patchMe } from 'soapbox/actions/me'; import snackbar from 'soapbox/actions/snackbar'; -import { - Checkbox, -} from 'soapbox/features/forms'; +import List, { ListItem } from 'soapbox/components/list'; import { useAppSelector, useAppDispatch, useOwnAccount, useFeatures } from 'soapbox/hooks'; import { normalizeAccount } from 'soapbox/normalizers'; import resizeImage from 'soapbox/utils/resize_image'; -import { Button, Column, Form, FormActions, FormGroup, Input, Textarea } from '../../components/ui'; -import HStack from '../../components/ui/hstack/hstack'; -import Stack from '../../components/ui/stack/stack'; +import { Button, Column, Form, FormActions, FormGroup, Input, Textarea, HStack } from '../../components/ui'; import Streamfield, { StreamfieldComponent } from '../../components/ui/streamfield/streamfield'; import ProfilePreview from './components/profile-preview'; @@ -396,61 +393,79 @@ const EditProfile: React.FC = () => { {/* HACK: wrap these checkboxes in a .simple_form container so they get styled (for now) */} {/* Need a either move, replace, or refactor these checkboxes. */} - + {features.followRequests && ( - } hint={} - checked={data.locked} - onChange={handleCheckboxChange('locked')} - /> + > + + )} {features.hideNetwork && ( - } hint={} - checked={account ? hidesNetwork(account): false} - onChange={handleHideNetworkChange} - /> + > + + )} {features.bots && ( - } hint={} - checked={data.bot} - onChange={handleCheckboxChange('bot')} - /> + > + + )} {features.muteStrangers && ( - } hint={} - checked={muteStrangers} - onChange={(e) => setMuteStrangers(e.target.checked)} - /> + > + setMuteStrangers(e.target.checked)} + /> + )} {features.profileDirectory && ( - } hint={} - checked={data.discoverable} - onChange={handleCheckboxChange('discoverable')} - /> + > + + )} {features.emailList && ( - } hint={} - checked={data.accepts_email_list} - onChange={handleCheckboxChange('accepts_email_list')} - /> + > + + )} - + {features.profileFields && ( Date: Fri, 6 May 2022 12:46:42 -0500 Subject: [PATCH 2/8] Add custom Toggle component (wrapper around react-toggle) --- app/soapbox/components/toggle.tsx | 14 ++++++++++++++ app/soapbox/features/edit_profile/index.tsx | 2 +- .../notifications/components/setting_toggle.js | 4 ++-- app/soapbox/features/soapbox_config/index.tsx | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 app/soapbox/components/toggle.tsx diff --git a/app/soapbox/components/toggle.tsx b/app/soapbox/components/toggle.tsx new file mode 100644 index 000000000..32b286efa --- /dev/null +++ b/app/soapbox/components/toggle.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import ReactToggle, { ToggleProps } from 'react-toggle'; + +/** Wrapper around react-toggle. */ +const Toggle: React.FC = ({ icons = false, ...rest }) => { + return ( + + ); +}; + +export default Toggle; diff --git a/app/soapbox/features/edit_profile/index.tsx b/app/soapbox/features/edit_profile/index.tsx index f3254dbc4..b9f6f5661 100644 --- a/app/soapbox/features/edit_profile/index.tsx +++ b/app/soapbox/features/edit_profile/index.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect, useMemo } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import Toggle from 'react-toggle'; import { updateNotificationSettings } from 'soapbox/actions/accounts'; import { patchMe } from 'soapbox/actions/me'; import snackbar from 'soapbox/actions/snackbar'; import List, { ListItem } from 'soapbox/components/list'; +import Toggle from 'soapbox/components/toggle'; import { useAppSelector, useAppDispatch, useOwnAccount, useFeatures } from 'soapbox/hooks'; import { normalizeAccount } from 'soapbox/normalizers'; import resizeImage from 'soapbox/utils/resize_image'; diff --git a/app/soapbox/features/notifications/components/setting_toggle.js b/app/soapbox/features/notifications/components/setting_toggle.js index d8cc5d556..e65ac968c 100644 --- a/app/soapbox/features/notifications/components/setting_toggle.js +++ b/app/soapbox/features/notifications/components/setting_toggle.js @@ -2,7 +2,8 @@ import PropTypes from 'prop-types'; import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Toggle from 'react-toggle'; + +import Toggle from 'soapbox/components/toggle'; export default class SettingToggle extends ImmutablePureComponent { @@ -26,7 +27,6 @@ export default class SettingToggle extends ImmutablePureComponent { id={id} checked={settings.getIn(settingPath)} onChange={this.onChange} - icons={false} onKeyDown={this.onKeyDown} /> ); diff --git a/app/soapbox/features/soapbox_config/index.tsx b/app/soapbox/features/soapbox_config/index.tsx index e734f1b87..a7bd29d58 100644 --- a/app/soapbox/features/soapbox_config/index.tsx +++ b/app/soapbox/features/soapbox_config/index.tsx @@ -1,12 +1,12 @@ import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; import React, { useState, useEffect, useMemo } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; -import Toggle from 'react-toggle'; import { updateConfig } from 'soapbox/actions/admin'; import { uploadMedia } from 'soapbox/actions/media'; import snackbar from 'soapbox/actions/snackbar'; import List, { ListItem } from 'soapbox/components/list'; +import Toggle from 'soapbox/components/toggle'; import { Column, CardHeader, From 2275a4e3fadcbaf1eed035f9e6c621a92f1f773f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 6 May 2022 12:53:47 -0500 Subject: [PATCH 3/8] Toggle: improve styles (and on dark theme) --- app/styles/components/react-toggle.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/styles/components/react-toggle.scss b/app/styles/components/react-toggle.scss index 7a75e696f..3f3ef49e4 100644 --- a/app/styles/components/react-toggle.scss +++ b/app/styles/components/react-toggle.scss @@ -28,7 +28,7 @@ } .react-toggle-track { - @apply bg-gray-200 w-[50px] p-0 rounded-full transition-colors; + @apply bg-gray-300 dark:bg-slate-700 w-[50px] p-0 rounded-full transition-colors; height: var(--input-height); } From 1609118e14247253fe156669d24afc36fd2661d1 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 6 May 2022 13:03:55 -0500 Subject: [PATCH 4/8] SettingToggle: convert to TSX --- .../components/setting_toggle.js | 35 ------------------- .../components/setting_toggle.tsx | 35 +++++++++++++++++++ app/soapbox/features/preferences/index.tsx | 2 +- 3 files changed, 36 insertions(+), 36 deletions(-) delete mode 100644 app/soapbox/features/notifications/components/setting_toggle.js create mode 100644 app/soapbox/features/notifications/components/setting_toggle.tsx diff --git a/app/soapbox/features/notifications/components/setting_toggle.js b/app/soapbox/features/notifications/components/setting_toggle.js deleted file mode 100644 index e65ac968c..000000000 --- a/app/soapbox/features/notifications/components/setting_toggle.js +++ /dev/null @@ -1,35 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import Toggle from 'soapbox/components/toggle'; - -export default class SettingToggle extends ImmutablePureComponent { - - static propTypes = { - id: PropTypes.string, - prefix: PropTypes.string, - settings: ImmutablePropTypes.map.isRequired, - settingPath: PropTypes.array.isRequired, - onChange: PropTypes.func.isRequired, - } - - onChange = ({ target }) => { - this.props.onChange(this.props.settingPath, target.checked); - } - - render() { - const { id, settings, settingPath } = this.props; - - return ( - - ); - } - -} diff --git a/app/soapbox/features/notifications/components/setting_toggle.tsx b/app/soapbox/features/notifications/components/setting_toggle.tsx new file mode 100644 index 000000000..76959bf06 --- /dev/null +++ b/app/soapbox/features/notifications/components/setting_toggle.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import Toggle from 'soapbox/components/toggle'; + +import type { Map as ImmutableMap } from 'immutable'; + +interface ISettingToggle { + /** Unique identifier for the Toggle. */ + id?: string, + /** The full user settings map. */ + settings: ImmutableMap, + /** Array of key names leading into the setting map. */ + settingPath: string[], + /** Callback when the setting is toggled. */ + onChange: (settingPath: string[], checked: boolean) => void, + +} + +/** Stateful toggle to change user settings. */ +const SettingToggle: React.FC = ({ id, settings, settingPath, onChange }) => { + + const handleChange: React.ChangeEventHandler = ({ target }) => { + onChange(settingPath, target.checked); + }; + + return ( + + ); +}; + +export default SettingToggle; diff --git a/app/soapbox/features/preferences/index.tsx b/app/soapbox/features/preferences/index.tsx index 9f02734f7..ccbd23498 100644 --- a/app/soapbox/features/preferences/index.tsx +++ b/app/soapbox/features/preferences/index.tsx @@ -101,7 +101,7 @@ const Preferences = () => { // dispatch(changeSetting(['defaultContentType'], event.target.value)); // }; - const onToggleChange = (key: string, checked: boolean) => { + const onToggleChange = (key: string[], checked: boolean) => { dispatch(changeSetting(key, checked, intl)); }; From e301255bf9c4b85a380fa277f05c16c7bb61bf79 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 6 May 2022 13:24:08 -0500 Subject: [PATCH 5/8] AccountSearch: fix text being too huge --- app/soapbox/components/account_search.js | 2 +- app/styles/components/search.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/soapbox/components/account_search.js b/app/soapbox/components/account_search.js index f9c64c31e..b2021ec34 100644 --- a/app/soapbox/components/account_search.js +++ b/app/soapbox/components/account_search.js @@ -64,7 +64,7 @@ class AccountSearch extends React.PureComponent {