import React from 'react' import PropTypes from 'prop-types' import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { defineMessages, injectIntl } from 'react-intl' import { NavLink } from 'react-router-dom' import { me } from '../initial_state' import Text from './text' import StatusActionBarItem from './status_action_bar_item' import { CX } from '../constants' class StatusActionBar extends ImmutablePureComponent { // updateOnProps = ['status'] handleShareClick = () => { this.props.onShare(this.shareButton, this.props.status) } handleReplyClick = () => { this.props.onReply(this.props.status, null, true) } handleFavoriteClick = () => { this.props.onFavorite(this.props.status) } handleRepostClick = () => { this.props.onRepost(this.props.status) } handleQuoteClick = () => { this.props.onQuote(this.props.status) } openLikesList = () => { this.props.onOpenLikes(this.props.status) } openRepostsList = () => { this.props.onOpenReposts(this.props.status) } setShareButton = (n) => { this.shareButton = n } render() { const { status, intl, isCompact, } = this.props const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')) const replyCount = status.get('replies_count') const repostCount = status.get('reblogs_count') const favoriteCount = status.get('favourites_count') const hasInteractions = favoriteCount > 0 || replyCount > 0 || repostCount > 0 const shouldCondense = ( !!status.get('card') || status.get('media_attachments').size > 0 || !!status.get('quote') ) && !hasInteractions const statusUrl = `/${status.getIn(['account', 'acct'])}/posts/${status.get('id')}` const myStatus = status.getIn(['account', 'id']) === me const containerClasses = CX({ d: 1, px10: !isCompact, mt10: !shouldCondense, mt5: shouldCondense, }) const innerContainerClasses = CX({ d: 1, py2: 1, flexRow: 1, w100PC: 1, borderTop1PX: !shouldCondense && !isCompact, borderColorSecondary: !shouldCondense || isCompact, borderBottom1PX: isCompact, mt5: hasInteractions, }) const likeBtnClasses = CX({ d: 1, text: 1, cursorPointer: myStatus, fw400: 1, noUnderline: 1, underline_onHover: myStatus, bgTransparent: 1, mr10: 1, py5: 1, }) const interactionBtnClasses = CX({ d: 1, text: 1, cursorPointer: 1, fw400: 1, noUnderline: 1, underline_onHover: 1, bgTransparent: 1, mr10: 1, py5: 1, }) const interactionContainerClasses = CX({ d: 1, flexRow: 1, aiEnd: 1, px5: !isCompact, px15: isCompact, }) return ( <div className={containerClasses}> { hasInteractions && <div className={interactionContainerClasses}> { favoriteCount > 0 && <button className={likeBtnClasses} onClick={this.openLikesList} disabled={!myStatus} > <Text color='secondary' size='small'> {intl.formatMessage(messages.likesLabel, { number: favoriteCount, })} </Text> </button> } { replyCount > 0 && <NavLink className={interactionBtnClasses} to={statusUrl} > <Text color='secondary' size='small'> {intl.formatMessage(messages.commentsLabel, { number: replyCount, })} </Text> </NavLink> } { repostCount > 0 && <button className={interactionBtnClasses} onClick={this.openRepostsList}> <Text color='secondary' size='small'> {intl.formatMessage(messages.repostsLabel, { number: repostCount, })} </Text> </button> } </div> } <div className={innerContainerClasses}> <div className={[_s.d, _s.flexRow, _s.py2, _s.w100PC].join(' ')}> <StatusActionBarItem title={intl.formatMessage(messages.like)} icon={!!status.get('favourited') ? 'liked' : 'like'} active={!!status.get('favourited')} onClick={this.handleFavoriteClick} isCompact={isCompact} /> <StatusActionBarItem title={intl.formatMessage(messages.comment)} icon='comment' onClick={this.handleReplyClick} isCompact={isCompact} /> <StatusActionBarItem title={intl.formatMessage(messages.repost)} altTitle={!publicStatus ? intl.formatMessage(messages.cannot_repost) : ''} icon={!publicStatus ? 'lock' : 'repost'} disabled={!publicStatus} active={!!status.get('reblogged')} onClick={this.handleRepostClick} isCompact={isCompact} /> <StatusActionBarItem title={intl.formatMessage(messages.quote)} altTitle={!publicStatus ? intl.formatMessage(messages.cannot_repost) : ''} icon={!publicStatus ? 'lock' : 'quote'} disabled={!publicStatus} onClick={this.handleQuoteClick} isCompact={isCompact} /> <StatusActionBarItem title={intl.formatMessage(messages.share)} altTitle={intl.formatMessage(messages.share)} buttonRef={this.setShareButton} icon='share' onClick={this.handleShareClick} isCompact={isCompact} /> </div> </div> </div> ) } } const messages = defineMessages({ share: { id: 'status.share', defaultMessage: 'Share' }, comment: { id: 'status.comment', defaultMessage: 'Comment' }, quote: { id: 'status.quote', defaultMessage: 'Quote' }, repost: { id: 'status.repost', defaultMessage: 'Repost' }, cannot_repost: { id: 'status.cannot_repost', defaultMessage: 'This post cannot be reposted' }, like: { id: 'status.like', defaultMessage: 'Like' }, likesLabel: { id: 'likes.label', defaultMessage: '{number, plural, one {# like} other {# likes}}' }, repostsLabel: { id: 'reposts.label', defaultMessage: '{number, plural, one {# repost} other {# reposts}}' }, commentsLabel: { id: 'comments.label', defaultMessage: '{number, plural, one {# comment} other {# comments}}' }, }) StatusActionBar.propTypes = { intl: PropTypes.object.isRequired, onFavorite: PropTypes.func.isRequired, onQuote: PropTypes.func.isRequired, onReply: PropTypes.func.isRequired, onRepost: PropTypes.func.isRequired, onShare: PropTypes.func.isRequired, status: ImmutablePropTypes.map.isRequired, onOpenLikes: PropTypes.func.isRequired, onOpenReposts: PropTypes.func.isRequired, isCompact: PropTypes.bool, } export default injectIntl(StatusActionBar)