From 0f044ad8e85116bb431ffac1d2e6a5f72ead7a9d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 1 Apr 2022 15:45:48 -0500 Subject: [PATCH] Create StatusActionButton component --- .../components/status-action-button.tsx | 64 +++++++++++++++++++ app/soapbox/components/status_action_bar.js | 30 ++++----- .../components/ui/icon-button/icon-button.tsx | 2 +- 3 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 app/soapbox/components/status-action-button.tsx diff --git a/app/soapbox/components/status-action-button.tsx b/app/soapbox/components/status-action-button.tsx new file mode 100644 index 000000000..826df3f62 --- /dev/null +++ b/app/soapbox/components/status-action-button.tsx @@ -0,0 +1,64 @@ +import classNames from 'classnames'; +import React from 'react'; +import { Link } from 'react-router-dom'; + +import { IconButton, Text } from 'soapbox/components/ui'; + +interface IStatusActionCounter { + count: number, + to?: string, +} + +/** Action button numerical counter, eg "5" likes */ +const StatusActionCounter: React.FC = ({ to, count = 0 }): JSX.Element => { + const text = {count}; + return to ? {text} : text; +}; + +interface IStatusActionButton { + icon: string, + onClick: () => void, + count: number, + active?: boolean, + title?: string, + to?: string, +} + +/** Status action container element */ +const StatusAction: React.FC = ({ children }) => { + return ( +
+ {children} +
+ ); +}; + +/** Action button (eg "Like") for a Status */ +const StatusActionButton: React.FC = ({ icon, title, to, active = false, onClick, count = 0 }): JSX.Element => { + + const handleClick: React.EventHandler = (e) => { + onClick(); + e.stopPropagation(); + e.preventDefault(); + }; + + return ( + + + + {count ? ( + + ) : null} + + ); +}; + +export { StatusAction, StatusActionButton, StatusActionCounter }; +export default StatusActionButton; diff --git a/app/soapbox/components/status_action_bar.js b/app/soapbox/components/status_action_bar.js index 6f144953a..45331fb38 100644 --- a/app/soapbox/components/status_action_bar.js +++ b/app/soapbox/components/status_action_bar.js @@ -10,6 +10,7 @@ import { Link, withRouter } from 'react-router-dom'; import { simpleEmojiReact } from 'soapbox/actions/emoji_reacts'; import EmojiSelector from 'soapbox/components/emoji_selector'; +import { StatusAction, StatusActionButton } from 'soapbox/components/status-action-button'; import DropdownMenuContainer from 'soapbox/containers/dropdown_menu_container'; import { isUserTouching } from 'soapbox/is_mobile'; import { isStaff, isAdmin } from 'soapbox/utils/accounts'; @@ -643,25 +644,18 @@ class StatusActionBar extends ImmutablePureComponent { return (
-
- + - {replyCount !== 0 ? ( - - {replyCount} - - ) : null} -
- -
+ {reblogButton} {reblogCount !== 0 && {reblogCount}} -
+
+ -
+
); } diff --git a/app/soapbox/components/ui/icon-button/icon-button.tsx b/app/soapbox/components/ui/icon-button/icon-button.tsx index 467c8e4cd..2d8c27b7f 100644 --- a/app/soapbox/components/ui/icon-button/icon-button.tsx +++ b/app/soapbox/components/ui/icon-button/icon-button.tsx @@ -10,7 +10,7 @@ interface IIconButton { iconClassName?: string, disabled?: boolean, src: string, - onClick?: () => void, + onClick?: React.EventHandler, text?: string, title?: string, transparent?: boolean