status.js.map 54 KB
Newer Older
Haelwenn's avatar
Haelwenn committed
1
{"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","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","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","createElement","textContent","position","body","appendChild","select","execCommand","removeChild","intl","publicStatus","includes","mutingConversation","menu","formatMessage","action","handleCopy","handleEmbed","me","handlePinClick","handleReblogClick","handleConversationMuteClick","handleDeleteClick","handleRedraftClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","isStaff","replyIcon","shareButton","title","icon","handleShare","reblog_disabled","handleReplyClick","disabled","active","animate","handleFavouriteClick","items","direction","React","PureComponent","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","Status","connect","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","withRedraft","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","statusIds","concat","toJS","initBlockModal","initReport","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","bindToDocument","label","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","scrollKey","tabIndex","textForScreenReader","handleOpenMedia","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, FormattedNumber } 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';\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'>{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 { 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  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 { 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 } 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});\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  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 } = 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  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    };\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                  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                  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":""}