{"version":3,"sources":["webpack:///./app/javascript/material-icons/400-24px/bookmark-fill.svg?4516","webpack:///./app/javascript/mastodon/features/status/components/action_bar.jsx","webpack:///./app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js","webpack:///./app/javascript/mastodon/components/edited_timestamp/index.jsx","webpack:///./app/javascript/mastodon/features/status/components/detailed_status.jsx","webpack:///./app/javascript/mastodon/features/status/index.jsx"],"names":["_path","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","_ref","title","titleId","props","xmlns","height","viewBox","width","id","d","messages","defineMessages","delete","defaultMessage","redraft","edit","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","bookmark","more","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","admin_domain","copy","blockDomain","unblockDomain","unmute","unblock","openOriginalPage","ActionBar","PureComponent","constructor","_defineProperty","this","onReply","status","onReblog","onFavourite","onBookmark","onDelete","history","onEdit","onDirect","get","onMention","relationship","onMute","onUnmute","account","onBlock","onUnblock","onBlockDomain","onUnblockDomain","split","onMuteConversation","onReport","onPin","navigator","url","onEmbed","clipboard","writeText","render","intl","signedIn","permissions","identity","publicStatus","includes","pinnableStatus","mutingConversation","writtenByMe","getIn","me","isRemote","replyIcon","replyIconComponent","menu","push","text","formatMessage","href","action","handleCopy","handleShare","handleEmbed","handlePinClick","handleConversationMuteClick","handleEditClick","handleDeleteClick","dangerous","handleRedraftClick","name","handleMentionClick","handleMuteClick","handleBlockClick","handleReport","domain","handleUnblockDomain","handleBlockDomain","PERMISSION_MANAGE_USERS","PERMISSION_MANAGE_FEDERATION","concat","ReplyIcon","ReplyAllIcon","reblogPrivate","reblogTitle","reblogIconComponent","RepeatActiveIcon","RepeatPrivateActiveIcon","RepeatIcon","RepeatPrivateIcon","RepeatDisabledIcon","_jsx","className","IconButton","icon","iconComponent","onClick","handleReplyClick","classNames","disabled","active","handleReblogClick","animate","StarIcon","StarBorderIcon","handleFavouriteClick","BookmarkIcon","BookmarkBorderIcon","handleBookmarkClick","DropdownMenuContainer","MoreHorizIcon","items","direction","withRouter","connect","mapStateToProps","state","withIdentity","injectIntl","statusId","openDropdownId","dropdownMenu","openId","openedViaKeyboard","keyboard","loading","mapDispatchToProps","dispatch","_ref2","onOpen","onItemClick","fetchHistory","openDropdownMenu","onClose","closeDropdownMenu","DropdownMenu","EditedTimestamp","item","i","FormattedMessage","values","count","size","index","onKeyPress","formattedDate","RelativeTimestamp","timestamp","short","formattedName","InlineAccount","accountId","label","date","renderItem","scrollable","renderHeader","handleItemClick","formatDate","month","day","hour","minute","openModal","modalType","modalProps","DetailedStatus","ImmutablePureComponent","button","ctrlKey","metaKey","preventDefault","stopPropagation","options","onOpenVideo","onToggleHidden","c","node","_measureHeight","target","nodeName","parentNode","window","open","onTranslate","heightJustChanged","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","_properStatus","getAttachmentAspectRatio","attachments","outerStyle","boxSizing","compact","pictureInPicture","media","applicationLink","reblogLink","favouriteLink","language","PictureInPicturePlaceholder","aspectRatio","attachment","description","Audio","src","alt","lang","duration","poster","backgroundColor","foregroundColor","accentColor","sensitive","visible","showMedia","blurhash","onToggleVisibility","onToggleMediaVisibility","Video","preview","frameRate","handleOpenVideo","MediaGallery","standalone","onOpenMedia","Card","card","_jsxs","_Fragment","children","rel","visibilityLink","VisibilityIcon","visibility","Link","to","AnimatedNumber","value","handleModalLink","statusContentProps","hashtagBar","getHashtagBarForStatus","expanded","style","ref","setRef","Icon","AlternateEmailIcon","handleAccountClick","Avatar","DisplayName","localDomain","_jsx2","StatusContent","onExpandedToggle","handleExpandedToggle","handleTranslate","FormattedDate","Date","year","ImmutablePropTypes","map","PropTypes","func","isRequired","bool","string","contains","inUse","available","WithRouterPropTypes","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","statusTitleWithAttachments","detailedStatus","replyConfirm","replyMessage","blockDomainConfirm","titleFromStatus","displayName","username","user","trim","attachmentCount","truncate","str","num","arr","Array","from","slice","join","Status","_this","fullscreen","defaultMediaVisibility","loadedStatusId","undefined","unfavourite","type","askReplyConfirmation","message","confirm","onConfirm","replyCompose","privacy","unreblog","shiftKey","boostModal","handleModalReblog","unbookmark","withRedraft","deleteModal","deleteStatus","editStatus","router","directCompose","mentionCompose","startTime","handleOpenMedia","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","ancestorsIds","descendantsIds","statusIds","toJS","undoStatusTranslation","translateStatus","initBlockModal","initReport","unmuteAccount","unblockAccount","initDomainBlockModal","handleMoveUp","handleMoveDown","handleToggleHidden","handleToggleMediaVisibility","_selectChild","indexOf","statusNode","isFullscreen","prevRouterProps","_ref3","_location$state","_prevRouterProps$loca","location","mastodonModalKey","offsetTop","UNSAFE_componentWillMount","fetchStatus","params","componentDidMount","attachFullscreenListener","onFullScreenChange","_scrollStatusIntoView","UNSAFE_componentWillReceiveProps","nextProps","align_top","container","element","querySelectorAll","scrollTop","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","ancestors","StatusContainer","onMoveUp","onMoveDown","contextType","previousId","nextId","rootId","multiColumn","requestIdleCallback","_this$statusNode","_document$querySelect","offset","document","querySelector","getBoundingClientRect","bottom","scrollingElement","body","scrollBy","_prevProps$status","componentWillUnmount","detachFullscreenListener","descendants","isLoading","Column","LoadingIndicator","BundleColumnError","errorType","isLocal","isIndexable","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleHotkeyToggleHidden","toggleSensitive","handleHotkeyToggleSensitive","openMedia","handleHotkeyOpenMedia","bindToDocument","ColumnHeader","showBackButton","extraButton","handleToggleAll","VisibilityOffIcon","ScrollContainer","scrollKey","shouldUpdateScroll","setContainerRef","HotKeys","tabIndex","textForScreenReader","setStatusRef","handleDirectClick","handleUnmuteClick","handleUnblockClick","handleBlockDomainClick","handleUnblockDomainClick","handlePin","Helmet","content","identityContextPropShape","object","makeMapStateToProps","getStatus","makeGetStatus","getPictureInPicture","makeGetPictureInPicture","getAncestorsIds","createSelector","_","inReplyTos","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","ids","pop","replies","reverse","forEach","insertAt","findIndex","idx","splice"],"mappings":"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","file":"js/features/status-2335f87dd0546e5ce815.chunk.js","sourcesContent":["var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgBookmarkFill(_ref) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n height: 24,\n viewBox: \"0 -960 960 960\",\n width: 24,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M200-120v-640q0-33 23.5-56.5T280-840h400q33 0 56.5 23.5T760-760v640L480-240 200-120Z\"\n })));\n}\nexport default SvgBookmarkFill;","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { withRouter } from 'react-router-dom';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';\nimport BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';\nimport MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';\nimport RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';\nimport ReplyIcon from '@/material-icons/400-24px/reply.svg?react';\nimport ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';\nimport StarIcon from '@/material-icons/400-24px/star-fill.svg?react';\nimport StarBorderIcon from '@/material-icons/400-24px/star.svg?react';\nimport RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';\nimport RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';\nimport RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';\nimport RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';\nimport { identityContextPropShape, withIdentity } from 'mastodon/identity_context';\nimport { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';\nimport { WithRouterPropTypes } from 'mastodon/utils/react_router';\n\nimport { IconButton } from '../../../components/icon_button';\nimport DropdownMenuContainer from '../../../containers/dropdown_menu_container';\nimport { me } from '../../../initial_state';\n\nconst messages = defineMessages({\n delete: { id: 'status.delete', defaultMessage: 'Delete' },\n redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\n edit: { id: 'status.edit', defaultMessage: 'Edit' },\n direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },\n mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n reblog: { id: 'status.reblog', defaultMessage: 'Boost' },\n reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },\n cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },\n cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },\n bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n more: { id: 'status.more', defaultMessage: 'More' },\n mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n block: { id: 'status.block', defaultMessage: 'Block @{name}' },\n report: { id: 'status.report', defaultMessage: 'Report @{name}' },\n share: { id: 'status.share', defaultMessage: 'Share' },\n pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },\n unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },\n embed: { id: 'status.embed', defaultMessage: 'Embed' },\n admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },\n admin_status: { id: 'status.admin_status', defaultMessage: 'Open this post in the moderation interface' },\n admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },\n copy: { id: 'status.copy', defaultMessage: 'Copy link to post' },\n blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' },\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },\n});\n\nconst mapStateToProps = (state, { status }) => ({\n relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),\n});\n\nclass ActionBar extends PureComponent {\n static propTypes = {\n identity: identityContextPropShape,\n status: ImmutablePropTypes.map.isRequired,\n relationship: ImmutablePropTypes.record,\n onReply: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onBookmark: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDirect: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onMute: PropTypes.func,\n onUnmute: PropTypes.func,\n onBlock: PropTypes.func,\n onUnblock: PropTypes.func,\n onBlockDomain: PropTypes.func,\n onUnblockDomain: PropTypes.func,\n onMuteConversation: PropTypes.func,\n onReport: PropTypes.func,\n onPin: PropTypes.func,\n onEmbed: PropTypes.func,\n intl: PropTypes.object.isRequired,\n ...WithRouterPropTypes,\n };\n\n handleReplyClick = () => {\n this.props.onReply(this.props.status);\n };\n\n handleReblogClick = (e) => {\n this.props.onReblog(this.props.status, e);\n };\n\n handleFavouriteClick = () => {\n this.props.onFavourite(this.props.status);\n };\n\n handleBookmarkClick = (e) => {\n this.props.onBookmark(this.props.status, e);\n };\n\n handleDeleteClick = () => {\n this.props.onDelete(this.props.status, this.props.history);\n };\n\n handleRedraftClick = () => {\n this.props.onDelete(this.props.status, this.props.history, true);\n };\n\n handleEditClick = () => {\n this.props.onEdit(this.props.status, this.props.history);\n };\n\n handleDirectClick = () => {\n this.props.onDirect(this.props.status.get('account'), this.props.history);\n };\n\n handleMentionClick = () => {\n this.props.onMention(this.props.status.get('account'), this.props.history);\n };\n\n handleMuteClick = () => {\n const { status, relationship, onMute, onUnmute } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('muting')) {\n onUnmute(account);\n } else {\n onMute(account);\n }\n };\n\n handleBlockClick = () => {\n const { status, relationship, onBlock, onUnblock } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('blocking')) {\n onUnblock(account);\n } else {\n onBlock(status);\n }\n };\n\n handleBlockDomain = () => {\n const { status, onBlockDomain } = this.props;\n const account = status.get('account');\n\n onBlockDomain(account);\n };\n\n handleUnblockDomain = () => {\n const { status, onUnblockDomain } = this.props;\n const account = status.get('account');\n\n onUnblockDomain(account.get('acct').split('@')[1]);\n };\n\n handleConversationMuteClick = () => {\n this.props.onMuteConversation(this.props.status);\n };\n\n handleReport = () => {\n this.props.onReport(this.props.status);\n };\n\n handlePinClick = () => {\n this.props.onPin(this.props.status);\n };\n\n handleShare = () => {\n navigator.share({\n url: this.props.status.get('url'),\n });\n };\n\n handleEmbed = () => {\n this.props.onEmbed(this.props.status);\n };\n\n handleCopy = () => {\n const url = this.props.status.get('url');\n navigator.clipboard.writeText(url);\n };\n\n render () {\n const { status, relationship, intl } = this.props;\n const { signedIn, permissions } = this.props.identity;\n\n const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n const pinnableStatus = ['public', 'unlisted', 'private'].includes(status.get('visibility'));\n const mutingConversation = status.get('muted');\n const account = status.get('account');\n const writtenByMe = status.getIn(['account', 'id']) === me;\n const isRemote = status.getIn(['account', 'username']) !== status.getIn(['account', 'acct']);\n\n let menu = [];\n\n if (publicStatus && isRemote) {\n menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });\n }\n\n menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });\n\n if (publicStatus && 'share' in navigator) {\n menu.push({ text: intl.formatMessage(messages.share), action: this.handleShare });\n }\n\n if (publicStatus && (signedIn || !isRemote)) {\n menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n }\n\n if (signedIn) {\n menu.push(null);\n\n if (writtenByMe) {\n if (pinnableStatus) {\n menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n menu.push(null);\n }\n\n menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true });\n menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true });\n } else {\n menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });\n menu.push(null);\n\n if (relationship && relationship.get('muting')) {\n menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.handleMuteClick, dangerous: true });\n }\n\n if (relationship && relationship.get('blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.handleBlockClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.handleBlockClick, dangerous: true });\n }\n\n menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport, dangerous: true });\n\n if (account.get('acct') !== account.get('username')) {\n const domain = account.get('acct').split('@')[1];\n\n menu.push(null);\n\n if (relationship && relationship.get('domain_blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.handleUnblockDomain });\n } else {\n menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.handleBlockDomain, dangerous: true });\n }\n }\n\n if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {\n menu.push(null);\n if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {\n menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });\n menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });\n }\n if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {\n const domain = account.get('acct').split('@')[1];\n menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });\n }\n }\n }\n }\n\n let replyIcon;\n let replyIconComponent;\n\n if (status.get('in_reply_to_id', null) === null) {\n replyIcon = 'reply';\n replyIconComponent = ReplyIcon;\n } else {\n replyIcon = 'reply-all';\n replyIconComponent = ReplyAllIcon;\n }\n\n const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';\n\n let reblogTitle, reblogIconComponent;\n\n if (status.get('reblogged')) {\n reblogTitle = intl.formatMessage(messages.cancel_reblog_private);\n reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;\n } else if (publicStatus) {\n reblogTitle = intl.formatMessage(messages.reblog);\n reblogIconComponent = RepeatIcon;\n } else if (reblogPrivate) {\n reblogTitle = intl.formatMessage(messages.reblog_private);\n reblogIconComponent = RepeatPrivateIcon;\n } else {\n reblogTitle = intl.formatMessage(messages.cannot_reblog);\n reblogIconComponent = RepeatDisabledIcon;\n }\n\n return (\n <div className='detailed-status__action-bar'>\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} iconComponent={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? ReplyIcon : replyIconComponent} onClick={this.handleReplyClick} /></div>\n <div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} /></div>\n <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} /></div>\n <div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} /></div>\n\n <div className='detailed-status__action-bar-dropdown'>\n <DropdownMenuContainer icon='ellipsis-h' iconComponent={MoreHorizIcon} status={status} items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n </div>\n </div>\n );\n }\n\n}\n\nexport default withRouter(connect(mapStateToProps)(withIdentity(injectIntl(ActionBar))));\n","import { connect } from 'react-redux';\n\nimport { openDropdownMenu, closeDropdownMenu } from 'mastodon/actions/dropdown_menu';\nimport { fetchHistory } from 'mastodon/actions/history';\nimport DropdownMenu from 'mastodon/components/dropdown_menu';\n\n/**\n *\n * @param {import('mastodon/store').RootState} state\n * @param {*} props\n */\nconst mapStateToProps = (state, { statusId }) => ({\n openDropdownId: state.dropdownMenu.openId,\n openedViaKeyboard: state.dropdownMenu.keyboard,\n items: state.getIn(['history', statusId, 'items']),\n loading: state.getIn(['history', statusId, 'loading']),\n});\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n onOpen (id, onItemClick, keyboard) {\n dispatch(fetchHistory(statusId));\n dispatch(openDropdownMenu({ id, keyboard }));\n },\n\n onClose (id) {\n dispatch(closeDropdownMenu({ id }));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport { connect } from 'react-redux';\n\nimport { openModal } from 'mastodon/actions/modal';\nimport InlineAccount from 'mastodon/components/inline_account';\nimport { RelativeTimestamp } from 'mastodon/components/relative_timestamp';\n\nimport DropdownMenu from './containers/dropdown_menu_container';\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n onItemClick (index) {\n dispatch(openModal({\n modalType: 'COMPARE_HISTORY',\n modalProps: { index, statusId },\n }));\n },\n\n});\n\nclass EditedTimestamp extends PureComponent {\n\n static propTypes = {\n statusId: PropTypes.string.isRequired,\n timestamp: PropTypes.string.isRequired,\n intl: PropTypes.object.isRequired,\n onItemClick: PropTypes.func.isRequired,\n };\n\n handleItemClick = (item, i) => {\n const { onItemClick } = this.props;\n onItemClick(i);\n };\n\n renderHeader = items => {\n return (\n <FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {# time} other {# times}}' values={{ count: items.size - 1 }} />\n );\n };\n\n renderItem = (item, index, { onClick, onKeyPress }) => {\n const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />;\n const formattedName = <InlineAccount accountId={item.get('account')} />;\n\n const label = item.get('original') ? (\n <FormattedMessage id='status.history.created' defaultMessage='{name} created {date}' values={{ name: formattedName, date: formattedDate }} />\n ) : (\n <FormattedMessage id='status.history.edited' defaultMessage='{name} edited {date}' values={{ name: formattedName, date: formattedDate }} />\n );\n\n return (\n <li className='dropdown-menu__item edited-timestamp__history__item' key={item.get('created_at')}>\n <button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button>\n </li>\n );\n };\n\n render () {\n const { timestamp, intl, statusId } = this.props;\n\n return (\n <DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>\n <button className='dropdown-menu__text-button'>\n <FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: <span className='animated-number'>{intl.formatDate(timestamp, { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</span> }} />\n </button>\n </DropdownMenu>\n );\n }\n\n}\n\nexport default connect(null, mapDispatchToProps)(injectIntl(EditedTimestamp));\n","import PropTypes from 'prop-types';\n\nimport { FormattedDate, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Link, withRouter } from 'react-router-dom';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nimport AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';\nimport { AnimatedNumber } from 'mastodon/components/animated_number';\nimport EditedTimestamp from 'mastodon/components/edited_timestamp';\nimport { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';\nimport { Icon } from 'mastodon/components/icon';\nimport PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';\nimport { VisibilityIcon } from 'mastodon/components/visibility_icon';\nimport { WithRouterPropTypes } from 'mastodon/utils/react_router';\n\nimport { Avatar } from '../../../components/avatar';\nimport { DisplayName } from '../../../components/display_name';\nimport MediaGallery from '../../../components/media_gallery';\nimport StatusContent from '../../../components/status_content';\nimport Audio from '../../audio';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport Video from '../../video';\n\nimport Card from './card';\n\nclass DetailedStatus extends ImmutablePureComponent {\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onOpenMedia: PropTypes.func.isRequired,\n onOpenVideo: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n onTranslate: PropTypes.func.isRequired,\n measureHeight: PropTypes.bool,\n onHeightChange: PropTypes.func,\n domain: PropTypes.string.isRequired,\n compact: PropTypes.bool,\n showMedia: PropTypes.bool,\n pictureInPicture: ImmutablePropTypes.contains({\n inUse: PropTypes.bool,\n available: PropTypes.bool,\n }),\n onToggleMediaVisibility: PropTypes.func,\n ...WithRouterPropTypes,\n };\n\n state = {\n height: null,\n };\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.props.history) {\n e.preventDefault();\n this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);\n }\n\n e.stopPropagation();\n };\n\n handleOpenVideo = (options) => {\n this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options);\n };\n\n handleExpandedToggle = () => {\n this.props.onToggleHidden(this.props.status);\n };\n\n _measureHeight (heightJustChanged) {\n if (this.props.measureHeight && this.node) {\n scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 }));\n\n if (this.props.onHeightChange && heightJustChanged) {\n this.props.onHeightChange();\n }\n }\n }\n\n setRef = c => {\n this.node = c;\n this._measureHeight();\n };\n\n componentDidUpdate (prevProps, prevState) {\n this._measureHeight(prevState.height !== this.state.height);\n }\n\n handleModalLink = e => {\n e.preventDefault();\n\n let href;\n\n if (e.target.nodeName !== 'A') {\n href = e.target.parentNode.href;\n } else {\n href = e.target.href;\n }\n\n window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');\n };\n\n handleTranslate = () => {\n const { onTranslate, status } = this.props;\n onTranslate(status);\n };\n\n _properStatus () {\n const { status } = this.props;\n\n if (status.get('reblog', null) !== null && typeof status.get('reblog') === 'object') {\n return status.get('reblog');\n } else {\n return status;\n }\n }\n\n getAttachmentAspectRatio () {\n const attachments = this._properStatus().get('media_attachments');\n\n if (attachments.getIn([0, 'type']) === 'video') {\n return `${attachments.getIn([0, 'meta', 'original', 'width'])} / ${attachments.getIn([0, 'meta', 'original', 'height'])}`;\n } else if (attachments.getIn([0, 'type']) === 'audio') {\n return '16 / 9';\n } else {\n return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2';\n }\n }\n\n render () {\n const status = this._properStatus();\n const outerStyle = { boxSizing: 'border-box' };\n const { compact, pictureInPicture } = this.props;\n\n if (!status) {\n return null;\n }\n\n let media = '';\n let applicationLink = '';\n let reblogLink = '';\n let favouriteLink = '';\n\n if (this.props.measureHeight) {\n outerStyle.height = `${this.state.height}px`;\n }\n\n const language = status.getIn(['translation', 'language']) || status.get('language');\n\n if (pictureInPicture.get('inUse')) {\n media = <PictureInPicturePlaceholder aspectRatio={this.getAttachmentAspectRatio()} />;\n } else if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n const attachment = status.getIn(['media_attachments', 0]);\n const description = attachment.getIn(['translation', 'description']) || attachment.get('description');\n\n media = (\n <Audio\n src={attachment.get('url')}\n alt={description}\n lang={language}\n duration={attachment.getIn(['meta', 'original', 'duration'], 0)}\n poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])}\n backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}\n foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}\n accentColor={attachment.getIn(['meta', 'colors', 'accent'])}\n sensitive={status.get('sensitive')}\n visible={this.props.showMedia}\n blurhash={attachment.get('blurhash')}\n height={150}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n const attachment = status.getIn(['media_attachments', 0]);\n const description = attachment.getIn(['translation', 'description']) || attachment.get('description');\n\n media = (\n <Video\n preview={attachment.get('preview_url')}\n frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}\n aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`}\n blurhash={attachment.get('blurhash')}\n src={attachment.get('url')}\n alt={description}\n lang={language}\n width={300}\n height={150}\n onOpenVideo={this.handleOpenVideo}\n sensitive={status.get('sensitive')}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n } else {\n media = (\n <MediaGallery\n standalone\n sensitive={status.get('sensitive')}\n media={status.get('media_attachments')}\n lang={language}\n height={300}\n onOpenMedia={this.props.onOpenMedia}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n }\n } else if (status.get('spoiler_text').length === 0) {\n media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;\n }\n\n if (status.get('application')) {\n applicationLink = <>·<a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></>;\n }\n\n const visibilityLink = <>·<VisibilityIcon visibility={status.get('visibility')} /></>;\n\n if (['private', 'direct'].includes(status.get('visibility'))) {\n reblogLink = '';\n } else if (this.props.history) {\n reblogLink = (\n <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`} className='detailed-status__link'>\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n <FormattedMessage id='status.reblogs' defaultMessage='{count, plural, one {boost} other {boosts}}' values={{ count: status.get('reblogs_count') }} />\n </Link>\n );\n } else {\n reblogLink = (\n <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n <FormattedMessage id='status.reblogs' defaultMessage='{count, plural, one {boost} other {boosts}}' values={{ count: status.get('reblogs_count') }} />\n </a>\n );\n }\n\n if (this.props.history) {\n favouriteLink = (\n <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`} className='detailed-status__link'>\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n <FormattedMessage id='status.favourites' defaultMessage='{count, plural, one {favorite} other {favorites}}' values={{ count: status.get('favourites_count') }} />\n </Link>\n );\n } else {\n favouriteLink = (\n <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n <FormattedMessage id='status.favourites' defaultMessage='{count, plural, one {favorite} other {favorites}}' values={{ count: status.get('favourites_count') }} />\n </a>\n );\n }\n\n const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);\n const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0;\n\n return (\n <div style={outerStyle}>\n <div ref={this.setRef} className={classNames('detailed-status', { compact })}>\n {status.get('visibility') === 'direct' && (\n <div className='status__prepend'>\n <div className='status__prepend-icon-wrapper'><Icon id='at' icon={AlternateEmailIcon} className='status__prepend-icon' /></div>\n <FormattedMessage id='status.direct_indicator' defaultMessage='Private mention' />\n </div>\n )}\n <a href={`/@${status.getIn(['account', 'acct'])}`} data-hover-card-account={status.getIn(['account', 'id'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>\n <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={46} /></div>\n <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n </a>\n\n <StatusContent\n status={status}\n expanded={!status.get('hidden')}\n onExpandedToggle={this.handleExpandedToggle}\n onTranslate={this.handleTranslate}\n {...statusContentProps}\n />\n\n {media}\n\n {expanded && hashtagBar}\n\n <div className='detailed-status__meta'>\n <div className='detailed-status__meta__line'>\n <a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>\n <FormattedDate value={new Date(status.get('created_at'))} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n </a>\n\n {visibilityLink}\n\n {applicationLink}\n </div>\n\n {status.get('edited_at') && <div className='detailed-status__meta__line'><EditedTimestamp statusId={status.get('id')} timestamp={status.get('edited_at')} /></div>}\n\n <div className='detailed-status__meta__line'>\n {reblogLink}\n {reblogLink && <>·</>}\n {favouriteLink}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nexport default withRouter(DetailedStatus);\n","import PropTypes from 'prop-types';\n\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Helmet } from 'react-helmet';\nimport { withRouter } from 'react-router-dom';\n\nimport { createSelector } from '@reduxjs/toolkit';\nimport Immutable from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { connect } from 'react-redux';\n\nimport { HotKeys } from 'react-hotkeys';\n\nimport VisibilityIcon from '@/material-icons/400-24px/visibility.svg?react';\nimport VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';\nimport { Icon } from 'mastodon/components/icon';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\nimport ScrollContainer from 'mastodon/containers/scroll_container';\nimport BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';\nimport { identityContextPropShape, withIdentity } from 'mastodon/identity_context';\nimport { WithRouterPropTypes } from 'mastodon/utils/react_router';\n\nimport {\n unblockAccount,\n unmuteAccount,\n} from '../../actions/accounts';\nimport { initBlockModal } from '../../actions/blocks';\nimport {\n replyCompose,\n mentionCompose,\n directCompose,\n} from '../../actions/compose';\nimport {\n initDomainBlockModal,\n unblockDomain,\n} from '../../actions/domain_blocks';\nimport {\n favourite,\n unfavourite,\n bookmark,\n unbookmark,\n reblog,\n unreblog,\n pin,\n unpin,\n} from '../../actions/interactions';\nimport { openModal } from '../../actions/modal';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initReport } from '../../actions/reports';\nimport {\n fetchStatus,\n muteStatus,\n unmuteStatus,\n deleteStatus,\n editStatus,\n hideStatus,\n revealStatus,\n translateStatus,\n undoStatusTranslation,\n} from '../../actions/statuses';\nimport ColumnHeader from '../../components/column_header';\nimport { textForScreenReader, defaultMediaVisibility } from '../../components/status';\nimport StatusContainer from '../../containers/status_container';\nimport { boostModal, deleteModal } from '../../initial_state';\nimport { makeGetStatus, makeGetPictureInPicture } from '../../selectors';\nimport Column from '../ui/components/column';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\n\nimport ActionBar from './components/action_bar';\nimport DetailedStatus from './components/detailed_status';\n\n\nconst messages = defineMessages({\n deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },\n deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },\n redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },\n redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favorites and boosts will be lost, and replies to the original post will be orphaned.' },\n revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },\n hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },\n statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' },\n detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },\n});\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n const getPictureInPicture = makeGetPictureInPicture();\n\n const getAncestorsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'inReplyTos']),\n ], (statusId, inReplyTos) => {\n let ancestorsIds = Immutable.List();\n ancestorsIds = ancestorsIds.withMutations(mutable => {\n let id = statusId;\n\n while (id && !mutable.includes(id)) {\n mutable.unshift(id);\n id = inReplyTos.get(id);\n }\n });\n\n return ancestorsIds;\n });\n\n const getDescendantsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'replies']),\n state => state.get('statuses'),\n ], (statusId, contextReplies, statuses) => {\n let descendantsIds = [];\n const ids = [statusId];\n\n while (ids.length > 0) {\n let id = ids.pop();\n const replies = contextReplies.get(id);\n\n if (statusId !== id) {\n descendantsIds.push(id);\n }\n\n if (replies) {\n replies.reverse().forEach(reply => {\n if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply);\n });\n }\n }\n\n let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));\n if (insertAt !== -1) {\n descendantsIds.forEach((id, idx) => {\n if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {\n descendantsIds.splice(idx, 1);\n descendantsIds.splice(insertAt, 0, id);\n insertAt += 1;\n }\n });\n }\n\n return Immutable.List(descendantsIds);\n });\n\n const mapStateToProps = (state, props) => {\n const status = getStatus(state, { id: props.params.statusId });\n\n let ancestorsIds = Immutable.List();\n let descendantsIds = Immutable.List();\n\n if (status) {\n ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });\n descendantsIds = getDescendantsIds(state, { id: status.get('id') });\n }\n\n return {\n isLoading: state.getIn(['statuses', props.params.statusId, 'isLoading']),\n status,\n ancestorsIds,\n descendantsIds,\n askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,\n domain: state.getIn(['meta', 'domain']),\n pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }),\n };\n };\n\n return mapStateToProps;\n};\n\nconst truncate = (str, num) => {\n const arr = Array.from(str);\n if (arr.length > num) {\n return arr.slice(0, num).join('') + '…';\n } else {\n return str;\n }\n};\n\nconst titleFromStatus = (intl, status) => {\n const displayName = status.getIn(['account', 'display_name']);\n const username = status.getIn(['account', 'username']);\n const user = displayName.trim().length === 0 ? username : displayName;\n const text = status.get('search_index');\n const attachmentCount = status.get('media_attachments').size;\n\n return text ? `${user}: \"${truncate(text, 30)}\"` : intl.formatMessage(messages.statusTitleWithAttachments, { user, attachmentCount });\n};\n\nclass Status extends ImmutablePureComponent {\n static propTypes = {\n identity: identityContextPropShape,\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n isLoading: PropTypes.bool,\n ancestorsIds: ImmutablePropTypes.list.isRequired,\n descendantsIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n askReplyConfirmation: PropTypes.bool,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n pictureInPicture: ImmutablePropTypes.contains({\n inUse: PropTypes.bool,\n available: PropTypes.bool,\n }),\n ...WithRouterPropTypes\n };\n\n state = {\n fullscreen: false,\n showMedia: defaultMediaVisibility(this.props.status),\n loadedStatusId: undefined,\n };\n\n UNSAFE_componentWillMount () {\n this.props.dispatch(fetchStatus(this.props.params.statusId));\n }\n\n componentDidMount () {\n attachFullscreenListener(this.onFullScreenChange);\n\n this._scrollStatusIntoView();\n }\n\n UNSAFE_componentWillReceiveProps (nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this.props.dispatch(fetchStatus(nextProps.params.statusId));\n }\n\n if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) {\n this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') });\n }\n }\n\n handleToggleMediaVisibility = () => {\n this.setState({ showMedia: !this.state.showMedia });\n };\n\n handleFavouriteClick = (status) => {\n const { dispatch } = this.props;\n const { signedIn } = this.props.identity;\n\n if (signedIn) {\n if (status.get('favourited')) {\n dispatch(unfavourite(status));\n } else {\n dispatch(favourite(status));\n }\n } else {\n dispatch(openModal({\n modalType: 'INTERACTION',\n modalProps: {\n type: 'favourite',\n accountId: status.getIn(['account', 'id']),\n url: status.get('uri'),\n },\n }));\n }\n };\n\n handlePin = (status) => {\n if (status.get('pinned')) {\n this.props.dispatch(unpin(status));\n } else {\n this.props.dispatch(pin(status));\n }\n };\n\n handleReplyClick = (status) => {\n const { askReplyConfirmation, dispatch, intl } = this.props;\n const { signedIn } = this.props.identity;\n\n if (signedIn) {\n if (askReplyConfirmation) {\n dispatch(openModal({\n modalType: 'CONFIRM',\n modalProps: {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onConfirm: () => dispatch(replyCompose(status, this.props.history)),\n },\n }));\n } else {\n dispatch(replyCompose(status, this.props.history));\n }\n } else {\n dispatch(openModal({\n modalType: 'INTERACTION',\n modalProps: {\n type: 'reply',\n accountId: status.getIn(['account', 'id']),\n url: status.get('uri'),\n },\n }));\n }\n };\n\n handleModalReblog = (status, privacy) => {\n this.props.dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));\n };\n\n handleReblogClick = (status, e) => {\n const { dispatch } = this.props;\n const { signedIn } = this.props.identity;\n\n if (signedIn) {\n if (status.get('reblogged')) {\n dispatch(unreblog({ statusId: status.get('id') }));\n } else {\n if ((e && e.shiftKey) || !boostModal) {\n this.handleModalReblog(status);\n } else {\n dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.handleModalReblog } }));\n }\n }\n } else {\n dispatch(openModal({\n modalType: 'INTERACTION',\n modalProps: {\n type: 'reblog',\n accountId: status.getIn(['account', 'id']),\n url: status.get('uri'),\n },\n }));\n }\n };\n\n handleBookmarkClick = (status) => {\n if (status.get('bookmarked')) {\n this.props.dispatch(unbookmark(status));\n } else {\n this.props.dispatch(bookmark(status));\n }\n };\n\n handleDeleteClick = (status, history, withRedraft = false) => {\n const { dispatch, intl } = this.props;\n\n if (!deleteModal) {\n dispatch(deleteStatus(status.get('id'), history, withRedraft));\n } else {\n dispatch(openModal({\n modalType: 'CONFIRM',\n modalProps: {\n message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),\n confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),\n onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),\n },\n }));\n }\n };\n\n handleEditClick = (status, history) => {\n this.props.dispatch(editStatus(status.get('id'), history));\n };\n\n handleDirectClick = (account, router) => {\n this.props.dispatch(directCompose(account, router));\n };\n\n handleMentionClick = (account, router) => {\n this.props.dispatch(mentionCompose(account, router));\n };\n\n handleOpenMedia = (media, index, lang) => {\n this.props.dispatch(openModal({\n modalType: 'MEDIA',\n modalProps: { statusId: this.props.status.get('id'), media, index, lang },\n }));\n };\n\n handleOpenVideo = (media, lang, options) => {\n this.props.dispatch(openModal({\n modalType: 'VIDEO',\n modalProps: { statusId: this.props.status.get('id'), media, lang, options },\n }));\n };\n\n handleHotkeyOpenMedia = e => {\n const { status } = this.props;\n\n e.preventDefault();\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n this.handleOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 });\n } else {\n this.handleOpenMedia(status.get('media_attachments'), 0);\n }\n }\n };\n\n handleMuteClick = (account) => {\n this.props.dispatch(initMuteModal(account));\n };\n\n handleConversationMuteClick = (status) => {\n if (status.get('muted')) {\n this.props.dispatch(unmuteStatus(status.get('id')));\n } else {\n this.props.dispatch(muteStatus(status.get('id')));\n }\n };\n\n handleToggleHidden = (status) => {\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(status.get('id')));\n } else {\n this.props.dispatch(hideStatus(status.get('id')));\n }\n };\n\n handleToggleAll = () => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());\n\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(statusIds));\n } else {\n this.props.dispatch(hideStatus(statusIds));\n }\n };\n\n handleTranslate = status => {\n const { dispatch } = this.props;\n\n if (status.get('translation')) {\n dispatch(undoStatusTranslation(status.get('id'), status.get('poll')));\n } else {\n dispatch(translateStatus(status.get('id')));\n }\n };\n\n handleBlockClick = (status) => {\n const { dispatch } = this.props;\n const account = status.get('account');\n dispatch(initBlockModal(account));\n };\n\n handleReport = (status) => {\n this.props.dispatch(initReport(status.get('account'), status));\n };\n\n handleEmbed = (status) => {\n this.props.dispatch(openModal({\n modalType: 'EMBED',\n modalProps: { id: status.get('id') },\n }));\n };\n\n handleUnmuteClick = account => {\n this.props.dispatch(unmuteAccount(account.get('id')));\n };\n\n handleUnblockClick = account => {\n this.props.dispatch(unblockAccount(account.get('id')));\n };\n\n handleBlockDomainClick = account => {\n this.props.dispatch(initDomainBlockModal(account));\n };\n\n handleUnblockDomainClick = domain => {\n this.props.dispatch(unblockDomain(domain));\n };\n\n\n handleHotkeyMoveUp = () => {\n this.handleMoveUp(this.props.status.get('id'));\n };\n\n handleHotkeyMoveDown = () => {\n this.handleMoveDown(this.props.status.get('id'));\n };\n\n handleHotkeyReply = e => {\n e.preventDefault();\n this.handleReplyClick(this.props.status);\n };\n\n handleHotkeyFavourite = () => {\n this.handleFavouriteClick(this.props.status);\n };\n\n handleHotkeyBoost = () => {\n this.handleReblogClick(this.props.status);\n };\n\n handleHotkeyMention = e => {\n e.preventDefault();\n this.handleMentionClick(this.props.status.get('account'));\n };\n\n handleHotkeyOpenProfile = () => {\n this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);\n };\n\n handleHotkeyToggleHidden = () => {\n this.handleToggleHidden(this.props.status);\n };\n\n handleHotkeyToggleSensitive = () => {\n this.handleToggleMediaVisibility();\n };\n\n handleMoveUp = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size - 1, true);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index, true);\n } else {\n this._selectChild(index - 1, true);\n }\n }\n };\n\n handleMoveDown = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size + 1, false);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index + 2, false);\n } else {\n this._selectChild(index + 1, false);\n }\n }\n };\n\n _selectChild (index, align_top) {\n const container = this.node;\n const element = container.querySelectorAll('.focusable')[index];\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n renderChildren (list, ancestors) {\n const { params: { statusId } } = this.props;\n\n return list.map((id, i) => (\n <StatusContainer\n key={id}\n id={id}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n contextType='thread'\n previousId={i > 0 ? list.get(i - 1) : undefined}\n nextId={list.get(i + 1) || (ancestors && statusId)}\n rootId={statusId}\n />\n ));\n }\n\n setContainerRef = c => {\n this.node = c;\n };\n\n setStatusRef = c => {\n this.statusNode = c;\n };\n\n _scrollStatusIntoView () {\n const { status, multiColumn } = this.props;\n\n if (status) {\n requestIdleCallback(() => {\n this.statusNode?.scrollIntoView(true);\n\n // In the single-column interface, `scrollIntoView` will put the post behind the header,\n // so compensate for that.\n if (!multiColumn) {\n const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom;\n if (offset) {\n const scrollingElement = document.scrollingElement || document.body;\n scrollingElement.scrollBy(0, -offset);\n }\n }\n });\n }\n }\n\n componentDidUpdate (prevProps) {\n const { status, ancestorsIds } = this.props;\n\n if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) {\n this._scrollStatusIntoView();\n }\n }\n\n componentWillUnmount () {\n detachFullscreenListener(this.onFullScreenChange);\n }\n\n onFullScreenChange = () => {\n this.setState({ fullscreen: isFullscreen() });\n };\n\n shouldUpdateScroll = (prevRouterProps, { location }) => {\n // Do not change scroll when opening a modal\n if (location.state?.mastodonModalKey !== prevRouterProps?.location?.state?.mastodonModalKey) {\n return false;\n }\n\n // Scroll to focused post if it is loaded\n if (this.statusNode) {\n return [0, this.statusNode.offsetTop];\n }\n\n // Do not scroll otherwise, `componentDidUpdate` will take care of that\n return false;\n };\n\n render () {\n let ancestors, descendants;\n const { isLoading, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props;\n const { fullscreen } = this.state;\n\n if (isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n if (status === null) {\n return (\n <BundleColumnError multiColumn={multiColumn} errorType='routing' />\n );\n }\n\n if (ancestorsIds && ancestorsIds.size > 0) {\n ancestors = <>{this.renderChildren(ancestorsIds, true)}</>;\n }\n\n if (descendantsIds && descendantsIds.size > 0) {\n descendants = <>{this.renderChildren(descendantsIds)}</>;\n }\n\n const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1;\n const isIndexable = !status.getIn(['account', 'noindex']);\n\n const handlers = {\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n reply: this.handleHotkeyReply,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleHotkeyMention,\n openProfile: this.handleHotkeyOpenProfile,\n toggleHidden: this.handleHotkeyToggleHidden,\n toggleSensitive: this.handleHotkeyToggleSensitive,\n openMedia: this.handleHotkeyOpenMedia,\n };\n\n return (\n <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.detailedStatus)}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button type='button' className='column-header__button' title={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} icon={status.get('hidden') ? VisibilityOffIcon : VisibilityIcon} /></button>\n )}\n />\n\n <ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>\n <div className={classNames('scrollable', { fullscreen })} ref={this.setContainerRef}>\n {ancestors}\n\n <HotKeys handlers={handlers}>\n <div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false)} ref={this.setStatusRef}>\n <DetailedStatus\n key={`details-${status.get('id')}`}\n status={status}\n onOpenVideo={this.handleOpenVideo}\n onOpenMedia={this.handleOpenMedia}\n onToggleHidden={this.handleToggleHidden}\n onTranslate={this.handleTranslate}\n domain={domain}\n showMedia={this.state.showMedia}\n onToggleMediaVisibility={this.handleToggleMediaVisibility}\n pictureInPicture={pictureInPicture}\n />\n\n <ActionBar\n key={`action-bar-${status.get('id')}`}\n status={status}\n onReply={this.handleReplyClick}\n onFavourite={this.handleFavouriteClick}\n onReblog={this.handleReblogClick}\n onBookmark={this.handleBookmarkClick}\n onDelete={this.handleDeleteClick}\n onEdit={this.handleEditClick}\n onDirect={this.handleDirectClick}\n onMention={this.handleMentionClick}\n onMute={this.handleMuteClick}\n onUnmute={this.handleUnmuteClick}\n onMuteConversation={this.handleConversationMuteClick}\n onBlock={this.handleBlockClick}\n onUnblock={this.handleUnblockClick}\n onBlockDomain={this.handleBlockDomainClick}\n onUnblockDomain={this.handleUnblockDomainClick}\n onReport={this.handleReport}\n onPin={this.handlePin}\n onEmbed={this.handleEmbed}\n />\n </div>\n </HotKeys>\n\n {descendants}\n </div>\n </ScrollContainer>\n\n <Helmet>\n <title>{titleFromStatus(intl, status)}</title>\n <meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />\n <link rel='canonical' href={status.get('url')} />\n </Helmet>\n </Column>\n );\n }\n\n}\n\nexport default withRouter(injectIntl(connect(makeMapStateToProps)(withIdentity(Status))));\n"],"sourceRoot":""}