diff --git a/app/soapbox/components/ui/index.ts b/app/soapbox/components/ui/index.ts index 67ed49f37..302738ed9 100644 --- a/app/soapbox/components/ui/index.ts +++ b/app/soapbox/components/ui/index.ts @@ -27,3 +27,4 @@ export { default as Tabs } from './tabs/tabs'; export { default as Text } from './text/text'; export { default as Textarea } from './textarea/textarea'; export { default as Tooltip } from './tooltip/tooltip'; +export { default as Widget } from './widget/widget'; diff --git a/app/soapbox/components/ui/widget/widget.tsx b/app/soapbox/components/ui/widget/widget.tsx new file mode 100644 index 000000000..e5cc6dfd1 --- /dev/null +++ b/app/soapbox/components/ui/widget/widget.tsx @@ -0,0 +1,30 @@ +import React from 'react'; + +import { Stack, Text } from 'soapbox/components/ui'; + +interface IWidgetTitle { + title: string | React.ReactNode +} + +const WidgetTitle = ({ title }: IWidgetTitle): JSX.Element => ( + {title} +); + +const WidgetBody: React.FC = ({ children }): JSX.Element => ( + {children} +); + +interface IWidget { + title: string | React.ReactNode, +} + +const Widget: React.FC = ({ title, children }): JSX.Element => { + return ( + + + {children} + + ); +}; + +export default Widget; diff --git a/app/soapbox/features/crypto_donate/components/crypto_donate_panel.tsx b/app/soapbox/features/crypto_donate/components/crypto_donate_panel.tsx index 9ec9e97e0..6dd4fe946 100644 --- a/app/soapbox/features/crypto_donate/components/crypto_donate_panel.tsx +++ b/app/soapbox/features/crypto_donate/components/crypto_donate_panel.tsx @@ -1,9 +1,8 @@ -import classNames from 'classnames'; import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; -import Icon from 'soapbox/components/icon'; +import { Widget } from 'soapbox/components/ui'; import { useAppSelector, useSoapboxConfig } from 'soapbox/hooks'; import SiteWallet from './site_wallet'; @@ -24,13 +23,7 @@ const CryptoDonatePanel: React.FC = ({ limit = 3 }): JSX.Ele const hasMore = more > 0; return ( -
-
- - - - -
+ }>
= ({ limit = 3 }): JSX.Ele values={{ count: more }} /> } -
+ ); }; diff --git a/app/soapbox/features/ui/components/trends-panel.tsx b/app/soapbox/features/ui/components/trends-panel.tsx index e0f9684e3..4fa4a7b26 100644 --- a/app/soapbox/features/ui/components/trends-panel.tsx +++ b/app/soapbox/features/ui/components/trends-panel.tsx @@ -3,11 +3,11 @@ import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import { useDispatch } from 'react-redux'; +import { Widget } from 'soapbox/components/ui'; import { useAppSelector } from 'soapbox/hooks'; import { fetchTrends } from '../../../actions/trends'; import Hashtag from '../../../components/hashtag'; -import { Stack, Text } from '../../../components/ui'; interface ITrendsPanel { limit: number @@ -35,17 +35,11 @@ const TrendsPanel = ({ limit }: ITrendsPanel) => { } return ( - - - - - - - {sortedTrends.map((hashtag: ImmutableMap) => ( - - ))} - - + }> + {sortedTrends.map((hashtag: ImmutableMap) => ( + + ))} + ); }; diff --git a/app/soapbox/features/ui/components/who-to-follow-panel.tsx b/app/soapbox/features/ui/components/who-to-follow-panel.tsx index d55f04585..cea616407 100644 --- a/app/soapbox/features/ui/components/who-to-follow-panel.tsx +++ b/app/soapbox/features/ui/components/who-to-follow-panel.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { useDispatch } from 'react-redux'; -import { Stack, Text } from 'soapbox/components/ui'; +import { Widget } from 'soapbox/components/ui'; import { useAppSelector } from 'soapbox/hooks'; import { fetchSuggestions, dismissSuggestion } from '../../../actions/suggestions'; @@ -37,24 +37,18 @@ const WhoToFollowPanel = ({ limit }: IWhoToFollowPanel) => { } return ( - - - - - - - {suggestionsToRender.map((suggestion: ImmutableMap) => ( - , but it isn't - id={suggestion.get('account')} - actionIcon={require('@tabler/icons/icons/x.svg')} - actionTitle={intl.formatMessage(messages.dismissSuggestion)} - onActionClick={handleDismiss} - /> - ))} - - + }> + {suggestionsToRender.map((suggestion: ImmutableMap) => ( + , but it isn't + id={suggestion.get('account')} + actionIcon={require('@tabler/icons/icons/x.svg')} + actionTitle={intl.formatMessage(messages.dismissSuggestion)} + onActionClick={handleDismiss} + /> + ))} + ); };