gab-social/app/javascript/gabsocial/components/popover/status_options_popover.js

236 lines
7.8 KiB
JavaScript
Raw Normal View History

2020-03-26 03:11:32 +00:00
import ImmutablePropTypes from 'react-immutable-proptypes'
import ImmutablePureComponent from 'react-immutable-pure-component'
import { defineMessages, injectIntl } from 'react-intl'
2020-04-22 06:00:11 +01:00
import { me, isStaff } from '../../initial_state'
2020-03-25 03:08:43 +00:00
import PopoverLayout from './popover_layout'
import List from '../list'
2020-03-26 03:11:32 +00:00
const messages = defineMessages({
delete: { id: 'status.delete', defaultMessage: 'Delete' },
edit: { id: 'status.edit', defaultMessage: 'Edit' },
mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
block: { id: 'account.block', defaultMessage: 'Block @{name}' },
reply: { id: 'status.reply', defaultMessage: 'Reply' },
comment: { id: 'status.comment', defaultMessage: 'Comment' },
more: { id: 'status.more', defaultMessage: 'More' },
share: { id: 'status.share', defaultMessage: 'Share' },
replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
repost: { id: 'repost', defaultMessage: 'Repost' },
quote: { id: 'status.quote', defaultMessage: 'Quote' },
repost_private: { id: 'status.repost_private', defaultMessage: 'Repost to original audience' },
cancel_repost_private: { id: 'status.cancel_repost_private', defaultMessage: 'Un-repost' },
cannot_repost: { id: 'status.cannot_repost', defaultMessage: 'This post cannot be reposted' },
cannot_quote: { id: 'status.cannot_quote', defaultMessage: 'This post cannot be quoted' },
like: { id: 'status.like', defaultMessage: 'Like' },
report: { id: 'status.report', defaultMessage: 'Report @{name}' },
muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },
unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
group_remove_account: { id: 'status.remove_account_from_group', defaultMessage: 'Remove account from group' },
group_remove_post: { id: 'status.remove_post_from_group', defaultMessage: 'Remove status from group' },
})
2020-03-25 03:08:43 +00:00
2020-03-26 03:11:32 +00:00
export default
@injectIntl
class StatusOptionsPopover extends ImmutablePureComponent {
static propTypes = {
status: ImmutablePropTypes.map.isRequired,
2020-04-22 06:00:11 +01:00
account: ImmutablePropTypes.map.isRequired,
2020-03-26 03:11:32 +00:00
onOpenUnauthorizedModal: PropTypes.func.isRequired,
onOpenStatusSharePopover: PropTypes.func.isRequired,
onReply: PropTypes.func,
onQuote: PropTypes.func,
onFavorite: PropTypes.func,
onRepost: PropTypes.func,
onDelete: PropTypes.func,
onMention: PropTypes.func,
onMute: PropTypes.func,
onBlock: PropTypes.func,
onReport: PropTypes.func,
onMuteConversation: PropTypes.func,
onPin: PropTypes.func,
intl: PropTypes.object.isRequired,
}
2020-04-22 06:00:11 +01:00
updateOnProps = ['status', 'account']
handleConversationMuteClick = () => {
this.props.onMuteConversation(this.props.status);
}
2020-03-26 03:11:32 +00:00
2020-04-22 06:00:11 +01:00
handleGroupRemoveAccount = () => {
const { status } = this.props;
2020-03-25 03:08:43 +00:00
2020-04-22 06:00:11 +01:00
this.props.onGroupRemoveAccount(status.getIn(['group', 'id']), status.getIn(['account', 'id']));
}
2020-03-04 03:45:16 +00:00
2020-04-22 06:00:11 +01:00
handleGroupRemovePost = () => {
const { status } = this.props;
2020-03-25 03:08:43 +00:00
2020-04-22 06:00:11 +01:00
this.props.onGroupRemoveStatus(status.getIn(['group', 'id']), status.get('id'));
}
handleReport = () => {
this.props.onReport(this.props.status);
}
handleBlockClick = () => {
this.props.onBlock(this.props.status);
}
handleMuteClick = () => {
this.props.onMute(this.props.status.get('account'));
}
handleMentionClick = () => {
this.props.onMention(this.props.status.get('account'), this.context.router.history);
}
handlePinClick = () => {
this.props.onPin(this.props.status);
}
handleDeleteClick = () => {
this.props.onDelete(this.props.status, this.context.router.history);
}
handleEditClick = () => {
this.props.onEdit(this.props.status);
}
handleRepostClick = (e) => {
if (me) {
// this.props.onRepost(this.props.status, e)
this.props.onQuote(this.props.status, this.context.router.history)
} else {
this.props.onOpenUnauthorizedModal()
2020-03-26 03:11:32 +00:00
}
2020-04-22 06:00:11 +01:00
}
getItems = () => {
const {
status,
intl,
account,
} = this.props
const mutingConversation = status.get('muted')
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'))
let menu = [];
2020-03-25 03:08:43 +00:00
2020-03-26 03:11:32 +00:00
if (!me) return menu
2020-03-25 03:08:43 +00:00
2020-04-22 06:00:11 +01:00
if (status.getIn(['account', 'id']) === me) {
2020-03-26 03:11:32 +00:00
menu.push({
2020-04-22 06:00:11 +01:00
icon: 'mute',
2020-03-26 03:11:32 +00:00
hideArrow: true,
2020-03-31 17:04:50 +01:00
title: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation),
2020-03-26 03:11:32 +00:00
onClick: this.handleConversationMuteClick,
})
}
2020-03-04 03:45:16 +00:00
2020-03-26 03:11:32 +00:00
if (status.getIn(['account', 'id']) === me) {
if (publicStatus) {
menu.push({
icon: 'circle',
hideArrow: true,
2020-03-31 17:04:50 +01:00
title: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin),
2020-03-26 03:11:32 +00:00
onClick: this.handlePinClick,
})
} else {
if (status.get('visibility') === 'private') {
menu.push({
2020-04-22 06:00:11 +01:00
icon: 'circle',
hideArrow: true,
2020-03-31 17:04:50 +01:00
title: intl.formatMessage(status.get('reblogged') ? messages.cancel_repost_private : messages.repost_private),
2020-03-26 03:11:32 +00:00
onClick: this.handleRepostClick
})
}
}
2020-04-22 06:00:11 +01:00
menu.push({
icon: 'circle',
hideArrow: true,
title: intl.formatMessage(messages.delete),
action: this.handleDeleteClick
});
menu.push({
icon: 'circle',
hideArrow: true,
title: intl.formatMessage(messages.edit), action:
this.handleEditClick
});
2020-03-26 03:11:32 +00:00
} else {
2020-04-22 06:00:11 +01:00
menu.push({
icon: 'comment',
hideArrow: true,
title: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }),
action: this.handleMentionClick
});
menu.push({
icon: 'mute',
hideArrow: true,
title: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }),
action: this.handleMuteClick
});
menu.push({
icon: 'circle',
hideArrow: true,
title: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }),
action: this.handleBlockClick
});
menu.push({
icon: 'circle',
hideArrow: true,
title: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }),
action: this.handleReport
});
2020-03-25 03:08:43 +00:00
2020-04-22 06:00:11 +01:00
// if (withGroupAdmin) {
// menu.push({
// icon: 'circle',
// hideArrow: true,
// title: intl.formatMessage(messages.group_remove_account),
// action: this.handleGroupRemoveAccount
// });
// menu.push({
// icon: 'circle',
// hideArrow: true,
// title: intl.formatMessage(messages.group_remove_post),
// action: this.handleGroupRemovePost
// });
// }
2020-03-25 03:08:43 +00:00
2020-04-22 06:00:11 +01:00
if (isStaff) {
menu.push({
title: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }),
href: `/admin/accounts/${status.getIn(['account', 'id'])}`
});
menu.push({
title: intl.formatMessage(messages.admin_status),
href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}`
});
2020-03-26 03:11:32 +00:00
}
}
2020-03-04 03:45:16 +00:00
2020-03-25 03:08:43 +00:00
return menu;
}
render() {
2020-03-26 03:11:32 +00:00
const items = this.getItems()
2020-02-24 21:56:07 +00:00
return (
2020-03-25 03:08:43 +00:00
<PopoverLayout className={_s.width240PX}>
<List
2020-04-07 02:53:23 +01:00
size='large'
2020-03-25 03:08:43 +00:00
scrollKey='profile_options'
2020-03-26 03:11:32 +00:00
items={items}
2020-03-25 03:08:43 +00:00
/>
</PopoverLayout>
2020-02-24 21:56:07 +00:00
)
}
}