Create StatusActionButton component

This commit is contained in:
Alex Gleason 2022-04-01 15:45:48 -05:00
parent 6c8bc3f329
commit 0f044ad8e8
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
3 changed files with 77 additions and 19 deletions

View File

@ -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<IStatusActionCounter> = ({ to, count = 0 }): JSX.Element => {
const text = <Text size='xs' theme='muted'>{count}</Text>;
return to ? <Link to={to}>{text}</Link> : 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 (
<div className='flex items-center space-x-0.5 p-1 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500'>
{children}
</div>
);
};
/** Action button (eg "Like") for a Status */
const StatusActionButton: React.FC<IStatusActionButton> = ({ icon, title, to, active = false, onClick, count = 0 }): JSX.Element => {
const handleClick: React.EventHandler<React.MouseEvent> = (e) => {
onClick();
e.stopPropagation();
e.preventDefault();
};
return (
<StatusAction>
<IconButton
title={title}
src={icon}
onClick={handleClick}
className={classNames('text-gray-400 hover:text-gray-600 dark:hover:text-white', {
'text-success-600 hover:text-success-600': active,
})}
/>
{count ? (
<StatusActionCounter to={to} count={count} />
) : null}
</StatusAction>
);
};
export { StatusAction, StatusActionButton, StatusActionCounter };
export default StatusActionButton;

View File

@ -10,6 +10,7 @@ import { Link, withRouter } from 'react-router-dom';
import { simpleEmojiReact } from 'soapbox/actions/emoji_reacts'; import { simpleEmojiReact } from 'soapbox/actions/emoji_reacts';
import EmojiSelector from 'soapbox/components/emoji_selector'; 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 DropdownMenuContainer from 'soapbox/containers/dropdown_menu_container';
import { isUserTouching } from 'soapbox/is_mobile'; import { isUserTouching } from 'soapbox/is_mobile';
import { isStaff, isAdmin } from 'soapbox/utils/accounts'; import { isStaff, isAdmin } from 'soapbox/utils/accounts';
@ -643,25 +644,18 @@ class StatusActionBar extends ImmutablePureComponent {
return ( return (
<div className='pt-4 flex flex-row space-x-2'> <div className='pt-4 flex flex-row space-x-2'>
<div className='flex items-center space-x-0.5 p-1 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500'> <StatusActionButton
<IconButton
title={replyTitle} title={replyTitle}
src={require('@tabler/icons/icons/message-circle.svg')} icon={require('@tabler/icons/icons/message-circle.svg')}
onClick={this.handleReplyClick} onClick={this.handleReplyClick}
className='text-gray-400 hover:text-gray-600 dark:hover:text-white' to={`/@${status.getIn(['account', 'acct'])}/posts/${status.get('id')}`}
count={replyCount}
/> />
{replyCount !== 0 ? ( <StatusAction>
<Link to={`/@${status.getIn(['account', 'acct'])}/posts/${status.get('id')}`}>
<Text size='xs' theme='muted'>{replyCount}</Text>
</Link>
) : null}
</div>
<div className='flex items-center space-x-0.5 p-1 text-gray-400 hover:text-gray-600 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500'>
{reblogButton} {reblogButton}
{reblogCount !== 0 && <Text size='xs' theme='muted' role='presentation' onClick={this.handleOpenReblogsModal}>{reblogCount}</Text>} {reblogCount !== 0 && <Text size='xs' theme='muted' role='presentation' onClick={this.handleOpenReblogsModal}>{reblogCount}</Text>}
</div> </StatusAction>
<div <div
ref={this.setRef} ref={this.setRef}
@ -704,9 +698,9 @@ class StatusActionBar extends ImmutablePureComponent {
{shareButton} {shareButton}
<div className='flex items-center space-x-0.5 p-1 text-gray-400 hover:text-gray-600 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500'> <StatusAction>
<DropdownMenuContainer items={menu} title={intl.formatMessage(messages.more)} status={status} src={require('@tabler/icons/icons/dots.svg')} direction='right' /> <DropdownMenuContainer items={menu} title={intl.formatMessage(messages.more)} status={status} src={require('@tabler/icons/icons/dots.svg')} direction='right' />
</div> </StatusAction>
</div> </div>
); );
} }

View File

@ -10,7 +10,7 @@ interface IIconButton {
iconClassName?: string, iconClassName?: string,
disabled?: boolean, disabled?: boolean,
src: string, src: string,
onClick?: () => void, onClick?: React.EventHandler<React.MouseEvent>,
text?: string, text?: string,
title?: string, title?: string,
transparent?: boolean transparent?: boolean