import PropTypes from "prop-types"; import { defineMessages, injectIntl, FormattedMessage } from "react-intl"; import classNames from "classnames"; import { Link } from "react-router-dom"; import ImmutablePropTypes from "react-immutable-proptypes"; import ImmutablePureComponent from "react-immutable-pure-component"; import { HotKeys } from "react-hotkeys"; import AttachmentList from "mastodon/components/attachment_list"; import AvatarComposite from "mastodon/components/avatar_composite"; import { IconButton } from "mastodon/components/icon_button"; import { RelativeTimestamp } from "mastodon/components/relative_timestamp"; import StatusContent from "mastodon/components/status_content"; import DropdownMenuContainer from "mastodon/containers/dropdown_menu_container"; import { autoPlayGif } from "mastodon/initial_state"; const messages = defineMessages({ more: { id: "status.more", defaultMessage: "More" }, open: { id: "conversation.open", defaultMessage: "View conversation" }, reply: { id: "status.reply", defaultMessage: "Reply" }, markAsRead: { id: "conversation.mark_as_read", defaultMessage: "Mark as read" }, delete: { id: "conversation.delete", defaultMessage: "Delete conversation" }, muteConversation: { id: "status.mute_conversation", defaultMessage: "Mute conversation" }, unmuteConversation: { id: "status.unmute_conversation", defaultMessage: "Unmute conversation" }, }); class Conversation extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, }; static propTypes = { conversationId: PropTypes.string.isRequired, accounts: ImmutablePropTypes.list.isRequired, lastStatus: ImmutablePropTypes.map, unread:PropTypes.bool.isRequired, scrollKey: PropTypes.string, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, markRead: PropTypes.func.isRequired, delete: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, }; handleMouseEnter = ({ currentTarget }) => { if (autoPlayGif) { return; } const emojis = currentTarget.querySelectorAll(".custom-emoji"); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; emoji.src = emoji.getAttribute("data-original"); } }; handleMouseLeave = ({ currentTarget }) => { if (autoPlayGif) { return; } const emojis = currentTarget.querySelectorAll(".custom-emoji"); for (var i = 0; i < emojis.length; i++) { let emoji = emojis[i]; emoji.src = emoji.getAttribute("data-static"); } }; handleClick = () => { if (!this.context.router) { return; } const { lastStatus, unread, markRead } = this.props; if (unread) { markRead(); } this.context.router.history.push(`/@${lastStatus.getIn(["account", "acct"])}/${lastStatus.get("id")}`); }; handleMarkAsRead = () => { this.props.markRead(); }; handleReply = () => { this.props.reply(this.props.lastStatus, this.context.router.history); }; handleDelete = () => { this.props.delete(); }; handleHotkeyMoveUp = () => { this.props.onMoveUp(this.props.conversationId); }; handleHotkeyMoveDown = () => { this.props.onMoveDown(this.props.conversationId); }; handleConversationMute = () => { this.props.onMute(this.props.lastStatus); }; handleShowMore = () => { this.props.onToggleHidden(this.props.lastStatus); }; render () { const { accounts, lastStatus, unread, scrollKey, intl } = this.props; if (lastStatus === null) { return null; } const menu = [ { text: intl.formatMessage(messages.open), action: this.handleClick }, null, ]; menu.push({ text: intl.formatMessage(lastStatus.get("muted") ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute }); if (unread) { menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead }); menu.push(null); } menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete }); const names = accounts.map(a => ).reduce((prev, cur) => [prev, ", ", cur]); const handlers = { reply: this.handleReply, open: this.handleClick, moveUp: this.handleHotkeyMoveUp, moveDown: this.handleHotkeyMoveDown, toggleHidden: this.handleShowMore, }; return (
{unread && }
{names} }} />
{lastStatus.get("media_attachments").size > 0 && ( )}
); } } export default injectIntl(Conversation);