{"version":3,"sources":["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":["messages","defineMessages","delete","id","defaultMessage","redraft","edit","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","local_only","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","arguments","handleReplyClick","this","props","onReply","status","handleReblogClick","e","onReblog","handleFavouriteClick","onFavourite","handleBookmarkClick","onBookmark","handleDeleteClick","onDelete","context","router","history","handleRedraftClick","handleEditClick","onEdit","handleDirectClick","onDirect","get","handleMentionClick","onMention","handleMuteClick","relationship","onMute","onUnmute","account","handleBlockClick","onBlock","onUnblock","handleBlockDomain","onBlockDomain","split","handleUnblockDomain","onUnblockDomain","handleConversationMuteClick","onMuteConversation","handleReport","onReport","handlePinClick","onPin","handleShare","navigator","url","handleEmbed","onEmbed","handleCopy","clipboard","writeText","render","intl","signedIn","permissions","identity","publicStatus","includes","pinnableStatus","mutingConversation","federated","writtenByMe","getIn","me","isRemote","replyIcon","menu","push","text","formatMessage","href","action","dangerous","name","domain","PERMISSION_MANAGE_USERS","PERMISSION_MANAGE_FEDERATION","reblogPrivate","reblogTitle","_jsx","className","IconButton","title","icon","onClick","classNames","disabled","active","animate","DropdownMenuContainer","size","items","direction","contextTypes","PropTypes","object","connect","mapStateToProps","state","_ref","injectIntl","statusId","openDropdownId","openedViaKeyboard","loading","mapDispatchToProps","dispatch","_ref2","onOpen","onItemClick","keyboard","fetchHistory","openDropdownMenu","onClose","closeDropdownMenu","DropdownMenu","EditedTimestamp","handleItemClick","item","i","renderHeader","FormattedMessage","values","count","renderItem","index","onKeyPress","formattedDate","RelativeTimestamp","timestamp","short","formattedName","InlineAccount","accountId","label","date","scrollable","formatDate","hour12","month","day","hour","minute","Icon","openModal","modalType","modalProps","public_short","unlisted_short","private_short","direct_short","DetailedStatus","ImmutablePureComponent","height","handleAccountClick","button","ctrlKey","metaKey","preventDefault","stopPropagation","handleOpenVideo","options","onOpenVideo","handleExpandedToggle","onToggleHidden","setRef","c","node","_measureHeight","handleModalLink","target","nodeName","parentNode","window","open","handleTranslate","onTranslate","heightJustChanged","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","_properStatus","getAttachmentAspectRatio","attachments","outerStyle","boxSizing","compact","pictureInPicture","media","applicationLink","reblogLink","localOnly","reblogIcon","favouriteLink","edited","language","PictureInPicturePlaceholder","aspectRatio","attachment","description","Audio","src","alt","lang","duration","poster","backgroundColor","foregroundColor","accentColor","sensitive","visible","showMedia","blurhash","onToggleVisibility","onToggleMediaVisibility","Video","preview","frameRate","width","MediaGallery","standalone","onOpenMedia","length","Card","card","_jsxs","_Fragment","children","rel","visibilityIcon","visibilityLink","Link","to","AnimatedNumber","value","statusContentProps","hashtagBar","getHashtagBarForStatus","expanded","style","ref","fixedWidth","Avatar","DisplayName","localDomain","_jsx2","StatusContent","onExpandedToggle","FormattedDate","Date","year","propTypes","ImmutablePropTypes","map","func","isRequired","bool","string","contains","inUse","available","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","handleToggleMediaVisibility","unfavourite","type","handlePin","askReplyConfirmation","message","confirm","onConfirm","replyCompose","handleModalReblog","privacy","unreblog","shiftKey","boostModal","initBoostModal","unbookmark","withRedraft","deleteModal","deleteStatus","editStatus","directCompose","mentionCompose","handleOpenMedia","handleHotkeyOpenMedia","startTime","initMuteModal","unmuteStatus","muteStatus","handleToggleHidden","revealStatus","hideStatus","handleToggleAll","ancestorsIds","descendantsIds","statusIds","concat","toJS","undoStatusTranslation","translateStatus","initBlockModal","initReport","handleUnmuteClick","unmuteAccount","handleUnblockClick","unblockAccount","handleBlockDomainClick","handleUnblockDomainClick","handleHotkeyMoveUp","handleMoveUp","handleHotkeyMoveDown","handleMoveDown","handleHotkeyReply","handleHotkeyFavourite","handleHotkeyBoost","handleHotkeyMention","handleHotkeyOpenProfile","handleHotkeyToggleHidden","handleHotkeyToggleSensitive","_selectChild","indexOf","onFullScreenChange","isFullscreen","shouldUpdateScroll","prevRouterProps","_ref3","_location$state","_prevRouterProps$loca","_this$node","location","mastodonModalKey","child","querySelector","offsetTop","UNSAFE_componentWillMount","fetchStatus","params","componentDidMount","attachFullscreenListener","_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","requestAnimationFrame","_this$node2","_document$querySelect","offset","document","getBoundingClientRect","bottom","scrollingElement","body","scrollBy","_prevProps$status","componentWillUnmount","detachFullscreenListener","descendants","isLoading","Column","LoadingIndicator","BundleColumnError","errorType","isLocal","isIndexable","handlers","moveUp","moveDown","boost","openProfile","toggleHidden","toggleSensitive","openMedia","bindToDocument","ColumnHeader","showBackButton","extraButton","ScrollContainer","scrollKey","HotKeys","tabIndex","textForScreenReader","Helmet","content","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-be84e0f8e5756c6b135a.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';\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  local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },\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\n  static contextTypes = {\n    router: PropTypes.object,\n    identity: PropTypes.object,\n  };\n\n  static propTypes = {\n    status: ImmutablePropTypes.map.isRequired,\n    relationship: ImmutablePropTypes.map,\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  };\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.context.router.history);\n  };\n\n  handleRedraftClick = () => {\n    this.props.onDelete(this.props.status, this.context.router.history, true);\n  };\n\n  handleEditClick = () => {\n    this.props.onEdit(this.props.status, this.context.router.history);\n  };\n\n  handleDirectClick = () => {\n    this.props.onDirect(this.props.status.get('account'), this.context.router.history);\n  };\n\n  handleMentionClick = () => {\n    this.props.onMention(this.props.status.get('account'), this.context.router.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.get('acct').split('@')[1]);\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.context.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 federated          = !status.get('local_only');\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 && federated) {\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    if (status.get('in_reply_to_id', null) === null) {\n      replyIcon = 'reply';\n    } else {\n      replyIcon = 'reply-all';\n    }\n\n    const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';\n\n    let reblogTitle;\n    if (status.get('reblogged')) {\n      reblogTitle = intl.formatMessage(messages.cancel_reblog_private);\n    } else if (publicStatus) {\n      reblogTitle = intl.formatMessage(messages.reblog);\n    } else if (reblogPrivate) {\n      reblogTitle = intl.formatMessage(messages.reblog_private);\n    } else {\n      reblogTitle = intl.formatMessage(messages.cannot_reblog);\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} 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' 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' 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' onClick={this.handleBookmarkClick} /></div>\n\n        <div className='detailed-status__action-bar-dropdown'>\n          <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n        </div>\n      </div>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(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\nconst mapStateToProps = (state, { statusId }) => ({\n  openDropdownId: state.getIn(['dropdown_menu', 'openId']),\n  openedViaKeyboard: state.getIn(['dropdown_menu', '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 { Icon }  from 'mastodon/components/icon';\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: intl.formatDate(timestamp, { hour12: false, month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) }} /> <Icon id='caret-down' />\n        </button>\n      </DropdownMenu>\n    );\n  }\n\n}\n\nexport default connect(null, mapDispatchToProps)(injectIntl(EditedTimestamp));\n","import PropTypes from 'prop-types';\n\nimport { injectIntl, defineMessages, FormattedDate, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Link } from 'react-router-dom';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\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';\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\nconst messages = defineMessages({\n  public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },\n  unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n  private_short: { id: 'privacy.private.short', defaultMessage: 'Followers only' },\n  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },\n  local_only: { id: 'status.local_only', defaultMessage: 'This post is only visible by other users of your instance' },\n});\n\nclass DetailedStatus extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\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  };\n\n  state = {\n    height: null,\n  };\n\n  handleAccountClick = (e) => {\n    if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.context.router) {\n      e.preventDefault();\n      this.context.router.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 { intl, compact, pictureInPicture } = this.props;\n\n    if (!status) {\n      return null;\n    }\n\n    let media           = '';\n    let applicationLink = '';\n    let reblogLink = '';\n    let localOnly = '';\n    let reblogIcon = 'retweet';\n    let favouriteLink = '';\n    let edited = '';\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 visibilityIconInfo = {\n      'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },\n      'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },\n      'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },\n      'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },\n    };\n\n    const visibilityIcon = visibilityIconInfo[status.get('visibility')];\n    const visibilityLink = <> · <Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></>;\n\n    if (['private', 'direct'].includes(status.get('visibility'))) {\n      reblogLink = '';\n    } else if (this.context.router) {\n      reblogLink = (\n        <>\n          {' · '}\n          <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`} className='detailed-status__link'>\n            <Icon id={reblogIcon} />\n            <span className='detailed-status__reblogs'>\n              <AnimatedNumber value={status.get('reblogs_count')} />\n            </span>\n          </Link>\n        </>\n      );\n    } else {\n      reblogLink = (\n        <>\n          {' · '}\n          <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>\n            <Icon id={reblogIcon} />\n            <span className='detailed-status__reblogs'>\n              <AnimatedNumber value={status.get('reblogs_count')} />\n            </span>\n          </a>\n        </>\n      );\n    }\n\n    if(status.get('local_only')) {\n      localOnly = <span> · <i className='fa fa-chain-broken' title={intl.formatMessage(messages.local_only)} /></span>;\n    }\n\n    if (this.context.router) {\n      favouriteLink = (\n        <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`} className='detailed-status__link'>\n          <Icon id='star' />\n          <span className='detailed-status__favorites'>\n            <AnimatedNumber value={status.get('favourites_count')} />\n          </span>\n        </Link>\n      );\n    } else {\n      favouriteLink = (\n        <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>\n          <Icon id='star' />\n          <span className='detailed-status__favorites'>\n            <AnimatedNumber value={status.get('favourites_count')} />\n          </span>\n        </a>\n      );\n    }\n\n    if (status.get('edited_at')) {\n      edited = (\n        <>\n          {' · '}\n          <EditedTimestamp statusId={status.get('id')} timestamp={status.get('edited_at')} />\n        </>\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' className='status__prepend-icon' fixedWidth /></div>\n              <FormattedMessage id='status.direct_indicator' defaultMessage='Private mention' />\n            </div>\n          )}\n          <a href={status.getIn(['account', 'url'])} 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('activity_pub_type') === 'Article' || !status.get('hidden')}\n            onExpandedToggle={this.handleExpandedToggle}\n            onTranslate={this.handleTranslate}\n            {...statusContentProps}\n          />\n\n          {status.get('activity_pub_type') === 'Article' ? null : media}\n\n          {expanded && hashtagBar}\n\n          <div className='detailed-status__meta'>\n            <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'>\n              <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n            </a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}{localOnly}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n\nexport default injectIntl(DetailedStatus);\n","import PropTypes from 'prop-types';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Helmet } from 'react-helmet';\n\nimport Immutable from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { connect } from 'react-redux';\nimport { createSelector } from 'reselect';\n\nimport { HotKeys } from 'react-hotkeys';\n\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';\n\nimport {\n  unblockAccount,\n  unmuteAccount,\n} from '../../actions/accounts';\nimport { initBlockModal } from '../../actions/blocks';\nimport { initBoostModal } from '../../actions/boosts';\nimport {\n  replyCompose,\n  mentionCompose,\n  directCompose,\n} from '../../actions/compose';\nimport {\n  blockDomain,\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\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\n  static contextTypes = {\n    router: PropTypes.object,\n    identity: PropTypes.object,\n  };\n\n  static propTypes = {\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  };\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.context.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.context.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.context.router.history)),\n          },\n        }));\n      } else {\n        dispatch(replyCompose(status, this.context.router.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(status, privacy));\n  };\n\n  handleReblogClick = (status, e) => {\n    const { dispatch } = this.props;\n    const { signedIn } = this.context.identity;\n\n    if (signedIn) {\n      if (status.get('reblogged')) {\n        dispatch(unreblog(status));\n      } else {\n        if ((e && e.shiftKey) || !boostModal) {\n          this.handleModalReblog(status);\n        } else {\n          dispatch(initBoostModal({ 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 = domain => {\n    this.props.dispatch(openModal({\n      modalType: 'CONFIRM',\n      modalProps: {\n        message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,\n        confirm: this.props.intl.formatMessage(messages.blockDomainConfirm),\n        onConfirm: () => this.props.dispatch(blockDomain(domain)),\n      },\n    }));\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.context.router.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  setRef = c => {\n    this.node = c;\n  };\n\n  _scrollStatusIntoView () {\n    const { status, multiColumn } = this.props;\n\n    if (status) {\n      window.requestAnimationFrame(() => {\n        this.node?.querySelector('.detailed-status__wrapper')?.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    const child = this.node?.querySelector('.detailed-status__wrapper');\n    if (child) {\n      return [0, child.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'} /></button>\n          )}\n        />\n\n        <ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>\n          <div className={classNames('scrollable', { fullscreen })} ref={this.setRef}>\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)}>\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 injectIntl(connect(makeMapStateToProps)(Status));\n"],"sourceRoot":""}