Merge branch 'issue/749' into 'develop'
[akkoma] / priv / static / packs / features / status.js.map
index 5739dd851b6e54b11b1cc552a680071b4172c380..f4688ee1749984a0f851e921cf5fa1606f9f1e00 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/status/components/detailed_status.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/status/components/action_bar.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/status/index.js"],"names":["DetailedStatus","height","e","button","ctrlKey","metaKey","_this","context","router","preventDefault","history","push","props","status","getIn","stopPropagation","media","startTime","onOpenVideo","onToggleHidden","c","node","_measureHeight","href","target","nodeName","parentNode","window","open","heightJustChanged","_this2","this","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","state","render","get","outerStyle","boxSizing","compact","applicationLink","reblogLink","reblogIcon","favouriteLink","Object","_babel_runtime_helpers_esm_jsx__WEBPACK_IMPORTED_MODULE_0__","mastodon_containers_poll_container__WEBPACK_IMPORTED_MODULE_20__","pollId","size","some","item","_components_attachment_list__WEBPACK_IMPORTED_MODULE_11__","video","_video__WEBPACK_IMPORTED_MODULE_16__","preview","src","alt","width","inline","handleOpenVideo","sensitive","_components_media_gallery__WEBPACK_IMPORTED_MODULE_10__","standalone","onOpenMedia","length","_card__WEBPACK_IMPORTED_MODULE_14__","card","className","rel","mastodon_components_icon__WEBPACK_IMPORTED_MODULE_19__","id","react_router_dom__WEBPACK_IMPORTED_MODULE_12__","to","react_intl__WEBPACK_IMPORTED_MODULE_13__","value","onClick","handleModalLink","style","react__WEBPACK_IMPORTED_MODULE_4___default","a","createElement","ref","setRef","classNames","handleAccountClick","_components_avatar__WEBPACK_IMPORTED_MODULE_7__","account","_components_display_name__WEBPACK_IMPORTED_MODULE_8__","localDomain","domain","_components_status_content__WEBPACK_IMPORTED_MODULE_9__","expanded","onExpandedToggle","handleExpandedToggle","Date","hour12","year","month","day","hour","minute","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","bool","string","messages","defineMessages","delete","defaultMessage","redraft","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","copy","ActionBar","injectIntl","onReply","onReblog","onFavourite","onDelete","onDirect","onMention","onMute","onMuteConversation","onBlock","onReport","onPin","navigator","text","url","onEmbed","textarea","document","textContent","position","body","appendChild","select","execCommand","removeChild","_this$props","intl","publicStatus","includes","mutingConversation","menu","formatMessage","action","handleCopy","handleEmbed","me","handlePinClick","handleReblogClick","handleConversationMuteClick","handleDeleteClick","handleRedraftClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","isStaff","replyIcon","shareButton","jsx","icon_button","title","icon","handleShare","reblog_disabled","handleReplyClick","disabled","active","animate","handleFavouriteClick","dropdown_menu_container","items","direction","React","PureComponent","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","blockConfirm","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","blockAndReport","Status","connect","getStatus","makeGetStatus","params","statusId","ancestorsIds","Immutable","List","descendantsIds","withMutations","mutable","unshift","ids","shift","replies","reverse","forEach","askReplyConfirmation","trim","fullscreen","dispatch","unfavourite","openModal","message","confirm","onConfirm","replyCompose","unreblog","shiftKey","boostModal","handleModalReblog","withRedraft","_this$props2","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","_this$props3","statusIds","concat","toJS","_this$props4","index_es","values","blockAccount","secondary","onSecondary","initReport","handleMoveUp","handleMoveDown","handleToggleHidden","_this$props5","_selectChild","indexOf","_this$props6","isFullscreen","componentWillMount","fetchStatus","componentDidMount","attachFullscreenListener","onFullScreenChange","componentWillReceiveProps","nextProps","_scrolledIntoView","element","querySelectorAll","focus","renderChildren","list","status_container","onMoveUp","onMoveDown","contextType","_this$props7","requestAnimationFrame","scrollIntoView","componentWillUnmount","detachFullscreenListener","ancestors","descendants","_this$props8","shouldUpdateScroll","column","column_back_button","missing_indicator","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleHotkeyToggleHidden","label","column_header","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","react_router_scroll_4_es","scrollKey","react_default","react_hotkeys_index_es","tabIndex","textForScreenReader","detailed_status","handleOpenMedia","action_bar_ActionBar","handlePin"],"mappings":"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","file":"features/status.js","sourcesContent":["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 AttachmentList from '../../../components/attachment_list';\nimport { Link } from 'react-router-dom';\nimport { FormattedDate, FormattedNumber } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from '../../video';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport PollContainer from 'mastodon/containers/poll_container';\n\nexport default class 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    measureHeight: PropTypes.bool,\n    onHeightChange: PropTypes.func,\n    domain: PropTypes.string.isRequired,\n    compact: PropTypes.bool,\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(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n    }\n\n    e.stopPropagation();\n  }\n\n  handleOpenVideo = (media, startTime) => {\n    this.props.onOpenVideo(media, startTime);\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  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 { compact } = 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\n    if (this.props.measureHeight) {\n      outerStyle.height = `${this.state.height}px`;\n    }\n\n    if (status.get('poll')) {\n      media = <PollContainer pollId={status.get('poll')} />;\n    } else if (status.get('media_attachments').size > 0) {\n      if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {\n        media = <AttachmentList media={status.get('media_attachments')} />;\n      } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n        const video = status.getIn(['media_attachments', 0]);\n\n        media = (\n          <Video\n            preview={video.get('preview_url')}\n            src={video.get('url')}\n            alt={video.get('description')}\n            width={300}\n            height={150}\n            inline\n            onOpenVideo={this.handleOpenVideo}\n            sensitive={status.get('sensitive')}\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          />\n        );\n      }\n    } else if (status.get('spoiler_text').length === 0) {\n      media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;\n    }\n\n    if (status.get('application')) {\n      applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener'>{status.getIn(['application', 'name'])}</a></span>;\n    }\n\n    if (status.get('visibility') === 'direct') {\n      reblogIcon = 'envelope';\n    } else if (status.get('visibility') === 'private') {\n      reblogIcon = 'lock';\n    }\n\n    if (status.get('visibility') === 'private') {\n      reblogLink = <Icon id={reblogIcon} />;\n    } else if (this.context.router) {\n      reblogLink = (\n        <Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>\n          <Icon id={reblogIcon} />\n          <span className='detailed-status__reblogs'>\n            <FormattedNumber value={status.get('reblogs_count')} />\n          </span>\n        </Link>\n      );\n    } else {\n      reblogLink = (\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            <FormattedNumber value={status.get('reblogs_count')} />\n          </span>\n        </a>\n      );\n    }\n\n    if (this.context.router) {\n      favouriteLink = (\n        <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>\n          <Icon id='star' />\n          <span className='detailed-status__favorites'>\n            <FormattedNumber 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            <FormattedNumber value={status.get('favourites_count')} />\n          </span>\n        </a>\n      );\n    }\n\n    return (\n      <div style={outerStyle}>\n        <div ref={this.setRef} className={classNames('detailed-status', { compact })}>\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={48} /></div>\n            <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n          </a>\n\n          <StatusContent status={status} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />\n\n          {media}\n\n          <div className='detailed-status__meta'>\n            <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener'>\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>{applicationLink} · {reblogLink} · {favouriteLink}\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\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, isStaff } from '../../../initial_state';\n\nconst messages = defineMessages({\n  delete: { id: 'status.delete', defaultMessage: 'Delete' },\n  redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\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 to original audience' },\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  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});\n\nexport default @injectIntl\nclass ActionBar extends React.PureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    status: ImmutablePropTypes.map.isRequired,\n    onReply: PropTypes.func.isRequired,\n    onReblog: PropTypes.func.isRequired,\n    onFavourite: PropTypes.func.isRequired,\n    onDelete: PropTypes.func.isRequired,\n    onDirect: PropTypes.func.isRequired,\n    onMention: PropTypes.func.isRequired,\n    onMute: PropTypes.func,\n    onMuteConversation: PropTypes.func,\n    onBlock: 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  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  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    this.props.onMute(this.props.status.get('account'));\n  }\n\n  handleConversationMuteClick = () => {\n    this.props.onMuteConversation(this.props.status);\n  }\n\n  handleBlockClick = () => {\n    this.props.onBlock(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    const textarea = document.createElement('textarea');\n\n    textarea.textContent    = url;\n    textarea.style.position = 'fixed';\n\n    document.body.appendChild(textarea);\n\n    try {\n      textarea.select();\n      document.execCommand('copy');\n    } catch (e) {\n\n    } finally {\n      document.body.removeChild(textarea);\n    }\n  }\n\n  render () {\n    const { status, intl } = this.props;\n\n    const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n    const mutingConversation = status.get('muted');\n\n    let menu = [];\n\n    if (publicStatus) {\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 (me === status.getIn(['account', 'id'])) {\n      if (publicStatus) {\n        menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n      } else {\n        if (status.get('visibility') === 'private') {\n          menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });\n        }\n      }\n\n      menu.push(null);\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.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({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });\n      menu.push(null);\n      menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });\n      menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });\n      menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });\n      if (isStaff) {\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) && status.get('visibility') === 'public' && (\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    let reblogIcon = 'retweet';\n    if (status.get('visibility') === 'direct') reblogIcon = 'envelope';\n    else if (status.get('visibility') === 'private') reblogIcon = 'lock';\n\n    let reblog_disabled = (status.get('visibility') === 'direct' || status.get('visibility') === 'private');\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 disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} 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        {shareButton}\n\n        <div className='detailed-status__action-bar-dropdown'>\n          <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' title='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 { fetchStatus } from '../../actions/statuses';\nimport MissingIndicator from '../../components/missing_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  reblog,\n  unreblog,\n  pin,\n  unpin,\n} from '../../actions/interactions';\nimport {\n  replyCompose,\n  mentionCompose,\n  directCompose,\n} from '../../actions/compose';\nimport { blockAccount } from '../../actions/accounts';\nimport {\n  muteStatus,\n  unmuteStatus,\n  deleteStatus,\n  hideStatus,\n  revealStatus,\n} from '../../actions/statuses';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initReport } from '../../actions/reports';\nimport { makeGetStatus } from '../../selectors';\nimport { ScrollContainer } from 'react-router-scroll-4';\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 } from '../../components/status';\nimport Icon from 'mastodon/components/icon';\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  blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },\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  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },\n});\n\nconst makeMapStateToProps = () => {\n  const getStatus = makeGetStatus();\n\n  const mapStateToProps = (state, props) => {\n    const status = getStatus(state, { id: props.params.statusId });\n    let ancestorsIds = Immutable.List();\n    let descendantsIds = Immutable.List();\n\n    if (status) {\n      ancestorsIds = ancestorsIds.withMutations(mutable => {\n        let id = status.get('in_reply_to_id');\n\n        while (id) {\n          mutable.unshift(id);\n          id = state.getIn(['contexts', 'inReplyTos', id]);\n        }\n      });\n\n      descendantsIds = descendantsIds.withMutations(mutable => {\n        const ids = [status.get('id')];\n\n        while (ids.length > 0) {\n          let id        = ids.shift();\n          const replies = state.getIn(['contexts', 'replies', id]);\n\n          if (status.get('id') !== id) {\n            mutable.push(id);\n          }\n\n          if (replies) {\n            replies.reverse().forEach(reply => {\n              ids.unshift(reply);\n            });\n          }\n        }\n      });\n    }\n\n    return {\n      status,\n      ancestorsIds,\n      descendantsIds,\n      askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,\n      domain: state.getIn(['meta', 'domain']),\n    };\n  };\n\n  return mapStateToProps;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\nclass Status extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    status: ImmutablePropTypes.map,\n    ancestorsIds: ImmutablePropTypes.list,\n    descendantsIds: ImmutablePropTypes.list,\n    intl: PropTypes.object.isRequired,\n    askReplyConfirmation: PropTypes.bool,\n    domain: PropTypes.string.isRequired,\n  };\n\n  state = {\n    fullscreen: false,\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\n  handleFavouriteClick = (status) => {\n    if (status.get('favourited')) {\n      this.props.dispatch(unfavourite(status));\n    } else {\n      this.props.dispatch(favourite(status));\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    let { askReplyConfirmation, dispatch, intl } = this.props;\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  }\n\n  handleModalReblog = (status) => {\n    this.props.dispatch(reblog(status));\n  }\n\n  handleReblogClick = (status, e) => {\n    if (status.get('reblogged')) {\n      this.props.dispatch(unreblog(status));\n    } else {\n      if ((e && e.shiftKey) || !boostModal) {\n        this.handleModalReblog(status);\n      } else {\n        this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));\n      }\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  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', { media, index }));\n  }\n\n  handleOpenVideo = (media, time) => {\n    this.props.dispatch(openModal('VIDEO', { media, time }));\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  handleBlockClick = (status) => {\n    const { dispatch, intl } = this.props;\n    const account = status.get('account');\n\n    dispatch(openModal('CONFIRM', {\n      message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,\n      confirm: intl.formatMessage(messages.blockConfirm),\n      onConfirm: () => dispatch(blockAccount(account.get('id'))),\n      secondary: intl.formatMessage(messages.blockAndReport),\n      onSecondary: () => {\n        dispatch(blockAccount(account.get('id')));\n        dispatch(initReport(account, status));\n      },\n    }));\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  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(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n  }\n\n  handleHotkeyToggleHidden = () => {\n    this.handleToggleHidden(this.props.status);\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);\n    } else {\n      let index = ancestorsIds.indexOf(id);\n\n      if (index === -1) {\n        index = descendantsIds.indexOf(id);\n        this._selectChild(ancestorsIds.size + index);\n      } else {\n        this._selectChild(index - 1);\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);\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);\n      } else {\n        this._selectChild(index + 1);\n      }\n    }\n  }\n\n  _selectChild (index) {\n    const element = this.node.querySelectorAll('.focusable')[index];\n\n    if (element) {\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 { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain } = this.props;\n    const { fullscreen } = this.state;\n\n    if (status === null) {\n      return (\n        <Column>\n          <ColumnBackButton />\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 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    };\n\n    return (\n      <Column label={intl.formatMessage(messages.detailedStatus)}>\n        <ColumnHeader\n          showBackButton\n          extraButton={(\n            <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} aria-pressed={status.get('hidden') ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>\n          )}\n        />\n\n        <ScrollContainer scrollKey='thread' shouldUpdateScroll={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')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>\n                <DetailedStatus\n                  status={status}\n                  onOpenVideo={this.handleOpenVideo}\n                  onOpenMedia={this.handleOpenMedia}\n                  onToggleHidden={this.handleToggleHidden}\n                  domain={domain}\n                />\n\n                <ActionBar\n                  status={status}\n                  onReply={this.handleReplyClick}\n                  onFavourite={this.handleFavouriteClick}\n                  onReblog={this.handleReblogClick}\n                  onDelete={this.handleDeleteClick}\n                  onDirect={this.handleDirectClick}\n                  onMention={this.handleMentionClick}\n                  onMute={this.handleMuteClick}\n                  onMuteConversation={this.handleConversationMuteClick}\n                  onBlock={this.handleBlockClick}\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      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/detailed_status.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/action_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/index.js"],"names":["DetailedStatus","height","e","button","ctrlKey","metaKey","context","router","preventDefault","history","push","props","status","getIn","stopPropagation","media","startTime","onOpenVideo","onToggleHidden","c","node","_measureHeight","href","target","nodeName","parentNode","window","open","heightJustChanged","this","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","state","render","get","outerStyle","boxSizing","compact","applicationLink","reblogLink","reblogIcon","favouriteLink","size","attachment","src","alt","duration","preload","preview","blurhash","width","inline","handleOpenVideo","sensitive","visible","showMedia","onToggleVisibility","onToggleMediaVisibility","standalone","onOpenMedia","length","card","className","rel","includes","id","to","value","onClick","handleModalLink","style","ref","setRef","classNames","handleAccountClick","account","localDomain","domain","expanded","onExpandedToggle","handleExpandedToggle","Date","hour12","year","month","day","hour","minute","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","bool","string","messages","defineMessages","delete","redraft","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","ActionBar","connect","relationship","injectIntl","onReply","onReblog","onFavourite","onBookmark","onDelete","onDirect","onMention","onMute","onUnmute","onBlock","onUnblock","onBlockDomain","split","onUnblockDomain","onMuteConversation","onReport","onPin","navigator","text","url","onEmbed","textarea","document","createElement","textContent","position","body","appendChild","select","execCommand","removeChild","intl","publicStatus","mutingConversation","menu","formatMessage","action","handleCopy","handleEmbed","me","handlePinClick","handleReblogClick","handleConversationMuteClick","handleDeleteClick","handleRedraftClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","handleUnblockDomain","handleBlockDomain","isStaff","replyIcon","shareButton","title","icon","handleShare","handleReplyClick","disabled","active","animate","handleFavouriteClick","handleBookmarkClick","items","direction","React","PureComponent","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","blockDomainConfirm","Status","getStatus","makeGetStatus","getAncestorsIds","createSelector","_","statusId","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","shift","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","askReplyConfirmation","trim","fullscreen","defaultMediaVisibility","loadedStatusId","undefined","dispatch","unfavourite","openModal","message","confirm","onConfirm","replyCompose","unreblog","shiftKey","boostModal","handleModalReblog","unbookmark","withRedraft","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","_properStatus","handleOpenMedia","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","statusIds","concat","toJS","initBlockModal","initReport","unmuteAccount","unblockAccount","defaultMessage","values","handleMoveUp","handleMoveDown","handleToggleHidden","handleToggleMediaVisibility","_selectChild","indexOf","isFullscreen","componentWillMount","fetchStatus","componentDidMount","attachFullscreenListener","onFullScreenChange","componentWillReceiveProps","nextProps","_scrolledIntoView","align_top","container","element","querySelectorAll","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","requestAnimationFrame","componentWillUnmount","detachFullscreenListener","ancestors","descendants","shouldUpdateScroll","multiColumn","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleHotkeyToggleHidden","toggleSensitive","handleHotkeyToggleSensitive","openMedia","handleHotkeyOpenMedia","bindToDocument","label","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","scrollKey","tabIndex","textForScreenReader","handleUnmuteClick","handleUnblockClick","handleBlockDomainClick","handleUnblockDomainClick","handlePin"],"mappings":"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","file":"features/status.js","sourcesContent":["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 { 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';\n\nexport default class 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    measureHeight: PropTypes.bool,\n    onHeightChange: PropTypes.func,\n    domain: PropTypes.string.isRequired,\n    compact: PropTypes.bool,\n    showMedia: PropTypes.bool,\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(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n    }\n\n    e.stopPropagation();\n  }\n\n  handleOpenVideo = (media, startTime) => {\n    this.props.onOpenVideo(media, startTime);\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  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 { compact } = 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\n    if (this.props.measureHeight) {\n      outerStyle.height = `${this.state.height}px`;\n    }\n\n    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            height={110}\n            preload\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            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 onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;\n    }\n\n    if (status.get('application')) {\n      applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></span>;\n    }\n\n    if (status.get('visibility') === 'direct') {\n      reblogIcon = 'envelope';\n    } else if (status.get('visibility') === 'private') {\n      reblogIcon = 'lock';\n    }\n\n    if (['private', 'direct'].includes(status.get('visibility'))) {\n      reblogLink = <Icon id={reblogIcon} />;\n    } else if (this.context.router) {\n      reblogLink = (\n        <Link to={`/statuses/${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    } else {\n      reblogLink = (\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    if (this.context.router) {\n      favouriteLink = (\n        <Link to={`/statuses/${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    return (\n      <div style={outerStyle}>\n        <div ref={this.setRef} className={classNames('detailed-status', { compact })}>\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={48} /></div>\n            <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n          </a>\n\n          <StatusContent status={status} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />\n\n          {media}\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>{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, isStaff } from '../../../initial_state';\n\nconst messages = defineMessages({\n  delete: { id: 'status.delete', defaultMessage: 'Delete' },\n  redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\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 to original audience' },\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});\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  };\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    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  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    const textarea = document.createElement('textarea');\n\n    textarea.textContent    = url;\n    textarea.style.position = 'fixed';\n\n    document.body.appendChild(textarea);\n\n    try {\n      textarea.select();\n      document.execCommand('copy');\n    } catch (e) {\n\n    } finally {\n      document.body.removeChild(textarea);\n    }\n  }\n\n  render () {\n    const { status, relationship, intl } = this.props;\n\n    const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n    const mutingConversation = status.get('muted');\n    const account            = status.get('account');\n\n    let menu = [];\n\n    if (publicStatus) {\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 (me === status.getIn(['account', 'id'])) {\n      if (publicStatus) {\n        menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n      } else {\n        if (status.get('visibility') === 'private') {\n          menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });\n        }\n      }\n\n      menu.push(null);\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.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({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });\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 (isStaff) {\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    let reblogIcon = 'retweet';\n    if (status.get('visibility') === 'direct') reblogIcon = 'envelope';\n    else if (status.get('visibility') === 'private') reblogIcon = 'lock';\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 disabled={!publicStatus} active={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} 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        {shareButton}\n        <div className='detailed-status__button'><IconButton className='bookmark-icon' 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","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 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  hideStatus,\n  revealStatus,\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 { initReport } from '../../actions/reports';\nimport { makeGetStatus } from '../../selectors';\nimport { ScrollContainer } from 'react-router-scroll-4';\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';\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\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) {\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.shift();\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          ids.unshift(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    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      status,\n      ancestorsIds,\n      descendantsIds,\n      askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,\n      domain: state.getIn(['meta', 'domain']),\n    };\n  };\n\n  return mapStateToProps;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\nclass Status extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    status: ImmutablePropTypes.map,\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  };\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    if (status.get('favourited')) {\n      this.props.dispatch(unfavourite(status));\n    } else {\n      this.props.dispatch(favourite(status));\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    let { askReplyConfirmation, dispatch, intl } = this.props;\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  }\n\n  handleModalReblog = (status) => {\n    this.props.dispatch(reblog(status));\n  }\n\n  handleReblogClick = (status, e) => {\n    if (status.get('reblogged')) {\n      this.props.dispatch(unreblog(status));\n    } else {\n      if ((e && e.shiftKey) || !boostModal) {\n        this.handleModalReblog(status);\n      } else {\n        this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));\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  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', { media, index }));\n  }\n\n  handleOpenVideo = (media, time) => {\n    this.props.dispatch(openModal('VIDEO', { media, time }));\n  }\n\n  handleHotkeyOpenMedia = e => {\n    const status = this._properStatus();\n\n    e.preventDefault();\n\n    if (status.get('media_attachments').size > 0) {\n      if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n        // TODO: toggle play/paused?\n      } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n        this.handleOpenVideo(status.getIn(['media_attachments', 0]), 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  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(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\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 { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn } = this.props;\n    const { fullscreen } = this.state;\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 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 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} aria-pressed={status.get('hidden') ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>\n          )}\n        />\n\n        <ScrollContainer scrollKey='thread' shouldUpdateScroll={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')} 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                  domain={domain}\n                  showMedia={this.state.showMedia}\n                  onToggleMediaVisibility={this.handleToggleMediaVisibility}\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                  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      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file