{"version":3,"sources":["webpack:///./app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js","webpack:///./app/javascript/mastodon/components/edited_timestamp/index.js","webpack:///./app/javascript/mastodon/features/status/components/detailed_status.js","webpack:///./app/javascript/mastodon/features/status/components/action_bar.js","webpack:///./app/javascript/mastodon/features/status/index.js"],"names":["connect","state","statusId","dropdownPlacement","getIn","openDropdownId","openedViaKeyboard","items","loading","dispatch","onOpen","id","onItemClick","keyboard","fetchHistory","openDropdownMenu","onClose","closeDropdownMenu","DropdownMenu","EditedTimestamp","index","openModal","injectIntl","React","PureComponent","handleItemClick","item","i","this","props","renderHeader","defaultMessage","values","count","size","renderItem","onClick","onKeyPress","formattedDate","timestamp","get","short","formattedName","accountId","label","name","date","className","data-index","render","intl","scrollable","formatDate","hour12","month","day","hour","minute","messages","defineMessages","public_short","unlisted_short","private_short","direct_short","DetailedStatus","ImmutablePureComponent","height","handleAccountClick","e","button","ctrlKey","metaKey","context","router","preventDefault","history","push","status","stopPropagation","handleOpenVideo","options","onOpenVideo","handleExpandedToggle","onToggleHidden","setRef","c","node","_measureHeight","handleModalLink","href","target","nodeName","parentNode","window","open","handleTranslate","onTranslate","heightJustChanged","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","outerStyle","boxSizing","compact","pictureInPicture","media","applicationLink","reblogLink","reblogIcon","favouriteLink","edited","attachment","src","alt","duration","poster","backgroundColor","foregroundColor","accentColor","sensitive","visible","showMedia","blurhash","onToggleVisibility","onToggleMediaVisibility","preview","frameRate","width","inline","standalone","onOpenMedia","length","card","Fragment","rel","visibilityIcon","icon","text","formatMessage","visibilityLink","title","includes","Link","to","value","style","ref","classNames","account","localDomain","domain","expanded","onExpandedToggle","Date","year","contextTypes","PropTypes","object","propTypes","ImmutablePropTypes","map","func","isRequired","bool","string","contains","inUse","available","delete","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","copy","blockDomain","unblockDomain","unmute","unblock","openOriginalPage","ActionBar","relationship","handleReplyClick","onReply","handleReblogClick","onReblog","handleFavouriteClick","onFavourite","handleBookmarkClick","onBookmark","handleDeleteClick","onDelete","handleRedraftClick","handleEditClick","onEdit","handleDirectClick","onDirect","handleMentionClick","onMention","handleMuteClick","onMute","onUnmute","handleBlockClick","onBlock","onUnblock","handleBlockDomain","onBlockDomain","split","handleUnblockDomain","onUnblockDomain","handleConversationMuteClick","onMuteConversation","handleReport","onReport","handlePinClick","onPin","handleShare","navigator","url","handleEmbed","onEmbed","handleCopy","clipboard","writeText","signedIn","permissions","identity","publicStatus","pinnableStatus","mutingConversation","writtenByMe","me","isRemote","menu","action","PERMISSION_MANAGE_USERS","shareButton","replyIcon","reblogPrivate","reblogTitle","disabled","active","animate","direction","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","blockDomainConfirm","Status","getStatus","makeGetStatus","getPictureInPicture","makeGetPictureInPicture","getAncestorsIds","createSelector","_","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","pop","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","isLoading","askReplyConfirmation","trim","fullscreen","defaultMediaVisibility","loadedStatusId","undefined","handleToggleMediaVisibility","unfavourite","type","handlePin","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","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","componentWillMount","fetchStatus","componentDidMount","attachFullscreenListener","componentWillReceiveProps","nextProps","_scrolledIntoView","align_top","container","element","querySelectorAll","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","requestAnimationFrame","componentWillUnmount","detachFullscreenListener","ancestors","descendants","multiColumn","isLocal","isIndexable","handlers","moveUp","moveDown","boost","openProfile","toggleHidden","toggleSensitive","openMedia","bindToDocument","showBackButton","extraButton","aria-label","scrollKey","tabIndex","textForScreenReader","Helmet","displayName","username","prefix","str","num","slice","titleFromStatus","content"],"mappings":"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","file":"js/features/status-b5c8f31d7337551bf2ac.chunk.js","sourcesContent":["import { connect } from 'react-redux';\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  dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),\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, dropdownPlacement, keyboard) {\n    dispatch(fetchHistory(statusId));\n    dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));\n  },\n\n  onClose (id) {\n    dispatch(closeDropdownMenu(id));\n  },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\nimport DropdownMenu from './containers/dropdown_menu_container';\nimport { connect } from 'react-redux';\nimport { openModal } from 'mastodon/actions/modal';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport InlineAccount from 'mastodon/components/inline_account';\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n  onItemClick (index) {\n    dispatch(openModal('COMPARE_HISTORY', { index, statusId }));\n  },\n\n});\n\nexport default @connect(null, mapDispatchToProps)\n@injectIntl\nclass EditedTimestamp extends React.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 {{count} time} other {{count} 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","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport StatusContent from '../../../components/status_content';\nimport MediaGallery from '../../../components/media_gallery';\nimport { Link } from 'react-router-dom';\nimport { injectIntl, defineMessages, FormattedDate } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from '../../video';\nimport Audio from '../../audio';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport AnimatedNumber from 'mastodon/components/animated_number';\nimport PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';\nimport EditedTimestamp from 'mastodon/components/edited_timestamp';\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: 'Direct' },\n});\n\nexport default  @injectIntl\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  render () {\n    const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;\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 reblogIcon = 'retweet';\n    let favouriteLink = '';\n    let edited = '';\n\n    if (this.props.measureHeight) {\n      outerStyle.height = `${this.state.height}px`;\n    }\n\n    if (pictureInPicture.get('inUse')) {\n      media = <PictureInPicturePlaceholder />;\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\n        media = (\n          <Audio\n            src={attachment.get('url')}\n            alt={attachment.get('description')}\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\n        media = (\n          <Video\n            preview={attachment.get('preview_url')}\n            frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}\n            blurhash={attachment.get('blurhash')}\n            src={attachment.get('url')}\n            alt={attachment.get('description')}\n            width={300}\n            height={150}\n            inline\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            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 = <React.Fragment> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></React.Fragment>;\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 = <React.Fragment> · <Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></React.Fragment>;\n\n    if (['private', 'direct'].includes(status.get('visibility'))) {\n      reblogLink = '';\n    } else if (this.context.router) {\n      reblogLink = (\n        <React.Fragment>\n          <React.Fragment> · </React.Fragment>\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        </React.Fragment>\n      );\n    } else {\n      reblogLink = (\n        <React.Fragment>\n          <React.Fragment> · </React.Fragment>\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        </React.Fragment>\n      );\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        <React.Fragment>\n          <React.Fragment> · </React.Fragment>\n          <EditedTimestamp statusId={status.get('id')} timestamp={status.get('edited_at')} />\n        </React.Fragment>\n      );\n    }\n\n    return (\n      <div style={outerStyle}>\n        <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })}>\n          <a href={`/@${status.getIn(['account', 'acct'])}`} 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          />\n\n          {media}\n\n          <div className='detailed-status__meta'>\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'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n            </a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport IconButton from '../../../components/icon_button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport DropdownMenuContainer from '../../../containers/dropdown_menu_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { me } from '../../../initial_state';\nimport classNames from 'classnames';\nimport { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';\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: 'Direct message @{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: 'Favourite' },\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 status in the moderation interface' },\n  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },\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\nexport default @connect(mapStateToProps)\n@injectIntl\nclass ActionBar extends React.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      text: this.props.status.get('search_index'),\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 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) {\n      if (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      menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n      menu.push(null);\n    }\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 });\n      menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });\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 });\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 });\n      }\n\n      menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });\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 });\n        }\n      }\n\n      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {\n        menu.push(null);\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    }\n\n    const shareButton = ('share' in navigator) && publicStatus && (\n      <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>\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        {shareButton}\n\n        <div className='detailed-status__action-bar-dropdown'>\n          <DropdownMenuContainer size={18} icon='ellipsis-h' disabled={!signedIn} status={status} items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n        </div>\n      </div>\n    );\n  }\n\n}\n","import Immutable from 'immutable';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { createSelector } from 'reselect';\nimport { fetchStatus } from '../../actions/statuses';\nimport MissingIndicator from '../../components/missing_indicator';\nimport LoadingIndicator from 'mastodon/components/loading_indicator';\nimport DetailedStatus from './components/detailed_status';\nimport ActionBar from './components/action_bar';\nimport Column from '../ui/components/column';\nimport {\n  favourite,\n  unfavourite,\n  bookmark,\n  unbookmark,\n  reblog,\n  unreblog,\n  pin,\n  unpin,\n} from '../../actions/interactions';\nimport {\n  replyCompose,\n  mentionCompose,\n  directCompose,\n} from '../../actions/compose';\nimport {\n  muteStatus,\n  unmuteStatus,\n  deleteStatus,\n  editStatus,\n  hideStatus,\n  revealStatus,\n  translateStatus,\n  undoStatusTranslation,\n} from '../../actions/statuses';\nimport {\n  unblockAccount,\n  unmuteAccount,\n} from '../../actions/accounts';\nimport {\n  blockDomain,\n  unblockDomain,\n} from '../../actions/domain_blocks';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initBlockModal } from '../../actions/blocks';\nimport { initBoostModal } from '../../actions/boosts';\nimport { initReport } from '../../actions/reports';\nimport { makeGetStatus, makeGetPictureInPicture } from '../../selectors';\nimport ScrollContainer from 'mastodon/containers/scroll_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport StatusContainer from '../../containers/status_container';\nimport { openModal } from '../../actions/modal';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport { boostModal, deleteModal } from '../../initial_state';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\nimport { textForScreenReader, defaultMediaVisibility } from '../../components/status';\nimport Icon from 'mastodon/components/icon';\nimport { Helmet } from 'react-helmet';\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? Favourites 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  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: 'Hide 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  if (str.length > num) {\n    return str.slice(0, num) + '…';\n  } else {\n    return str;\n  }\n};\n\nconst titleFromStatus = status => {\n  const displayName = status.getIn(['account', 'display_name']);\n  const username = status.getIn(['account', 'username']);\n  const prefix = displayName.trim().length === 0 ? username : displayName;\n  const text = status.get('search_index');\n\n  return `${prefix}: \"${truncate(text, 30)}\"`;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\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,\n    descendantsIds: ImmutablePropTypes.list,\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  componentWillMount () {\n    this.props.dispatch(fetchStatus(this.props.params.statusId));\n  }\n\n  componentDidMount () {\n    attachFullscreenListener(this.onFullScreenChange);\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n      this._scrolledIntoView = false;\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('INTERACTION', {\n        type: 'favourite',\n        accountId: status.getIn(['account', 'id']),\n        url: status.get('url'),\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('CONFIRM', {\n          message: intl.formatMessage(messages.replyMessage),\n          confirm: intl.formatMessage(messages.replyConfirm),\n          onConfirm: () => dispatch(replyCompose(status, this.context.router.history)),\n        }));\n      } else {\n        dispatch(replyCompose(status, this.context.router.history));\n      }\n    } else {\n      dispatch(openModal('INTERACTION', {\n        type: 'reply',\n        accountId: status.getIn(['account', 'id']),\n        url: status.get('url'),\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('INTERACTION', {\n        type: 'reblog',\n        accountId: status.getIn(['account', 'id']),\n        url: status.get('url'),\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('CONFIRM', {\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  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) => {\n    this.props.dispatch(openModal('MEDIA', { statusId: this.props.status.get('id'), media, index }));\n  }\n\n  handleOpenVideo = (media, options) => {\n    this.props.dispatch(openModal('VIDEO', { statusId: this.props.status.get('id'), media, options }));\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')));\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('EMBED', { url: status.get('url') }));\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('CONFIRM', {\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  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) {\n    return list.map(id => (\n      <StatusContainer\n        key={id}\n        id={id}\n        onMoveUp={this.handleMoveUp}\n        onMoveDown={this.handleMoveDown}\n        contextType='thread'\n      />\n    ));\n  }\n\n  setRef = c => {\n    this.node = c;\n  }\n\n  componentDidUpdate () {\n    if (this._scrolledIntoView) {\n      return;\n    }\n\n    const { status, ancestorsIds } = this.props;\n\n    if (status && ancestorsIds && ancestorsIds.size > 0) {\n      const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];\n\n      window.requestAnimationFrame(() => {\n        element.scrollIntoView(true);\n      });\n      this._scrolledIntoView = true;\n    }\n  }\n\n  componentWillUnmount () {\n    detachFullscreenListener(this.onFullScreenChange);\n  }\n\n  onFullScreenChange = () => {\n    this.setState({ fullscreen: isFullscreen() });\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        <Column>\n          <ColumnBackButton multiColumn={multiColumn} />\n          <MissingIndicator />\n        </Column>\n      );\n    }\n\n    if (ancestorsIds && ancestorsIds.size > 0) {\n      ancestors = <div>{this.renderChildren(ancestorsIds)}</div>;\n    }\n\n    if (descendantsIds && descendantsIds.size > 0) {\n      descendants = <div>{this.renderChildren(descendantsIds)}</div>;\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'>\n          <div className={classNames('scrollable', { fullscreen })} ref={this.setRef}>\n            {ancestors}\n\n            <HotKeys handlers={handlers}>\n              <div className={classNames('focusable', 'detailed-status__wrapper')} 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(status)}</title>\n          <meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />\n        </Helmet>\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}