{"version":3,"sources":["webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/edited_timestamp/index.jsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/status_banner.tsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/filter_warning.tsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/components/detailed_status.tsx","webpack:///./app/javascript/material-icons/400-24px/chat.svg","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/components/action_bar.jsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/index.jsx"],"names":["connect","mapStateToProps","state","_ref","statusId","openDropdownId","dropdownMenu","openId","openedViaKeyboard","keyboard","items","getIn","loading","mapDispatchToProps","dispatch","_ref2","onOpen","id","onItemClick","fetchHistory","openDropdownMenu","onClose","closeDropdownMenu","DropdownMenu","EditedTimestamp","PureComponent","constructor","arguments","_defineProperty","item","i","this","props","_jsx","FormattedMessage","defaultMessage","values","count","size","index","onClick","onKeyPress","formattedDate","RelativeTimestamp","timestamp","get","short","formattedName","InlineAccount","accountId","label","name","date","className","render","intl","renderItem","scrollable","renderHeader","handleItemClick","formatDate","month","day","hour","minute","openModal","modalType","modalProps","injectIntl","BannerVariant","StatusBanner","children","variant","expanded","Warning","FilterWarning","title","Filter","span","chunks","DetailedStatus","_status$get","status","onOpenMedia","onOpenVideo","onTranslate","measureHeight","onHeightChange","domain","showMedia","withLogo","pictureInPicture","onToggleMediaVisibility","onToggleHidden","properStatus","height","setHeight","useState","showDespiteFilter","setShowDespiteFilter","nodeRef","useRef","history","useAppHistory","rewriteMentions","useAppSelector","local_settings","tagMisleadingLinks","mediaOutsideCW","letterboxMedia","fullwidthMedia","handleOpenVideo","useCallback","options","lang","handleFilterToggle","_measureHeight","heightJustChanged","current","scheduleIdleTask","Math","ceil","scrollHeight","handleRef","c","handleChildUpdate","handleTranslate","parseClick","e","destination","button","ctrlKey","altKey","metaKey","preventDefault","push","stopPropagation","applicationLink","reblogLink","contentMedia","contentMediaIcons","extraMedia","media","mediaIcons","outerStyle","boxSizing","language","PictureInPicturePlaceholder","some","AttachmentList","includes","MediaGallery","standalone","sensitive","letterbox","fullwidth","hidden","visible","onToggleVisibility","attachment","description","Audio","src","alt","duration","poster","backgroundColor","foregroundColor","accentColor","blurhash","Video","preview","frameRate","aspectRatio","inline","width","preventPlayback","Card","card","PollContainer","pollId","_jsxs","_Fragment","href","target","rel","visibilityLink","VisibilityIcon","visibility","Link","to","AnimatedNumber","value","favouriteLink","statusContentProps","hashtagBar","getHashtagBarForStatus","matchedFilters","style","ref","classNames","Permalink","Avatar","account","DisplayName","localDomain","IconLogo","join","_jsx2","StatusContent","collapsed","onExpandedToggle","onUpdate","tagLinks","disabled","FormattedDate","Date","year","_path","_extends","Object","assign","bind","n","length","t","r","hasOwnProperty","call","apply","titleId","xmlns","viewBox","fill","d","messages","defineMessages","delete","redraft","edit","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","bookmark","more","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","admin_domain","copy","openOriginalPage","ActionBar","onReply","onReblog","onFavourite","onBookmark","onDelete","onEdit","onDirect","onMention","onMute","onBlock","onMuteConversation","onReport","onPin","navigator","url","onEmbed","clipboard","writeText","signedIn","permissions","identity","publicStatus","pinnableStatus","mutingConversation","writtenByMe","me","isRemote","replyIcon","replyIconComponent","menu","text","formatMessage","action","handleCopy","handleShare","handleEmbed","handlePinClick","handleConversationMuteClick","handleEditClick","handleDeleteClick","dangerous","handleRedraftClick","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","PERMISSION_MANAGE_USERS","accountAdminLink","statusAdminLink","PERMISSION_MANAGE_FEDERATION","undefined","split","ReplyIcon","ReplyAllIcon","reblogPrivate","reblogTitle","reblogIconComponent","RepeatActiveIcon","RepeatPrivateActiveIcon","RepeatIcon","RepeatPrivateIcon","RepeatDisabledIcon","IconButton","icon","iconComponent","handleReplyClick","active","handleReblogClick","animate","StarIcon","StarBorderIcon","handleFavouriteClick","BookmarkIcon","BookmarkBorderIcon","handleBookmarkClick","DropdownMenuContainer","MoreHorizIcon","direction","withIdentity","revealAll","hideAll","statusTitleWithAttachments","detailedStatus","tootHeading","titleFromStatus","displayName","username","user","trim","attachmentCount","truncate","str","num","arr","Array","from","slice","Status","ImmutablePureComponent","_this","fullscreen","isExpanded","threadExpanded","loadedStatusId","revealBehindCW","settings","revealStatus","hideStatus","setExpansion","setState","toggleFavourite","shiftKey","type","askReplyConfirmation","replyCompose","toggleReblog","unbookmark","withRedraft","deleteModal","deleteStatus","editStatus","directCompose","mentionCompose","startTime","handleOpenMedia","initMuteModal","unmuteStatus","muteStatus","ancestorsIds","descendantsIds","statusIds","concat","toJS","undoStatusTranslation","translateStatus","initBlockModal","initReport","handleToggleMediaVisibility","handleMoveUp","handleMoveDown","_selectChild","indexOf","column","scrollTop","node","statusNode","isFullscreen","prevRouterProps","_ref3","_location$state","_prevRouterProps$loca","location","mastodonModalKey","offsetTop","componentDidMount","attachFullscreenListener","onFullScreenChange","fetchStatus","params","_scrollStatusIntoView","getDerivedStateFromProps","update","updated","defaultMediaVisibility","autoUnfoldCW","align_top","container","element","querySelectorAll","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","ancestors","map","StatusContainer","onMoveUp","onMoveDown","contextType","previousId","nextId","rootId","multiColumn","requestIdleCallback","_this$statusNode","_document$querySelect","offset","document","querySelector","getBoundingClientRect","bottom","scrollingElement","body","scrollBy","componentDidUpdate","prevProps","_prevProps$status","componentWillUnmount","detachFullscreenListener","descendants","remoteHint","isLoading","Column","LoadingIndicator","BundleColumnError","errorType","isLocal","isIndexable","TimelineHint","message","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyBookmark","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleToggleHidden","toggleSensitive","handleHotkeyToggleSensitive","openMedia","handleHotkeyOpenMedia","bindToDocument","setColumnRef","ColumnHeader","ChatIcon","handleHeaderClick","showBackButton","extraButton","handleToggleAll","Icon","VisibilityOffIcon","ScrollContainer","scrollKey","shouldUpdateScroll","setContainerRef","HotKeys","tabIndex","textForScreenReader","setStatusRef","handlePin","Helmet","content","identityContextPropShape","PropTypes","object","isRequired","func","ImmutablePropTypes","bool","string","contains","inUse","available","WithRouterPropTypes","withRouter","makeMapStateToProps","getStatus","makeGetStatus","getPictureInPicture","makeGetPictureInPicture","getAncestorsIds","createSelector","_","inReplyTos","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","ids","pop","replies","reverse","forEach","insertAt","findIndex","idx","splice"],"mappings":"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","file":"js/flavours/glitch/async/status-117edd85e04183d6ff6e.chunk.js","sourcesContent":["import { connect } from 'react-redux';\n\nimport { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dropdown_menu';\nimport { fetchHistory } from 'flavours/glitch/actions/history';\nimport DropdownMenu from 'flavours/glitch/components/dropdown_menu';\n\n/**\n *\n * @param {import('flavours/glitch/store').RootState} state\n * @param {*} props\n */\nconst mapStateToProps = (state, { statusId }) => ({\n  openDropdownId: state.dropdownMenu.openId,\n  openedViaKeyboard: state.dropdownMenu.keyboard,\n  items: state.getIn(['history', statusId, 'items']),\n  loading: state.getIn(['history', statusId, 'loading']),\n});\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n  onOpen (id, onItemClick, keyboard) {\n    dispatch(fetchHistory(statusId));\n    dispatch(openDropdownMenu({ id, keyboard }));\n  },\n\n  onClose (id) {\n    dispatch(closeDropdownMenu({ id }));\n  },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport { connect } from 'react-redux';\n\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport InlineAccount from 'flavours/glitch/components/inline_account';\nimport { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp';\n\nimport DropdownMenu from './containers/dropdown_menu_container';\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n  onItemClick (index) {\n    dispatch(openModal({\n      modalType: 'COMPARE_HISTORY',\n      modalProps: { index, statusId },\n    }));\n  },\n\n});\n\nclass EditedTimestamp extends PureComponent {\n\n  static propTypes = {\n    statusId: PropTypes.string.isRequired,\n    timestamp: PropTypes.string.isRequired,\n    intl: PropTypes.object.isRequired,\n    onItemClick: PropTypes.func.isRequired,\n  };\n\n  handleItemClick = (item, i) => {\n    const { onItemClick } = this.props;\n    onItemClick(i);\n  };\n\n  renderHeader = items => {\n    return (\n      <FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {# time} other {# times}}' values={{ count: items.size - 1 }} />\n    );\n  };\n\n  renderItem = (item, index, { onClick, onKeyPress }) => {\n    const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />;\n    const formattedName = <InlineAccount accountId={item.get('account')} />;\n\n    const label = item.get('original') ? (\n      <FormattedMessage id='status.history.created' defaultMessage='{name} created {date}' values={{ name: formattedName, date: formattedDate }} />\n    ) : (\n      <FormattedMessage id='status.history.edited' defaultMessage='{name} edited {date}' values={{ name: formattedName, date: formattedDate }} />\n    );\n\n    return (\n      <li className='dropdown-menu__item edited-timestamp__history__item' key={item.get('created_at')}>\n        <button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button>\n      </li>\n    );\n  };\n\n  render () {\n    const { timestamp, intl, statusId } = this.props;\n\n    return (\n      <DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>\n        <button className='dropdown-menu__text-button'>\n          <FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: <span className='animated-number'>{intl.formatDate(timestamp, { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</span> }} />\n        </button>\n      </DropdownMenu>\n    );\n  }\n\n}\n\nexport default connect(null, mapDispatchToProps)(injectIntl(EditedTimestamp));\n","import { FormattedMessage } from 'react-intl';\n\nexport enum BannerVariant {\n  Warning = 'warning',\n  Filter = 'filter',\n}\n\nexport const StatusBanner: React.FC<{\n  children: React.ReactNode;\n  variant: BannerVariant;\n  expanded?: boolean;\n  onClick?: () => void;\n}> = ({ children, variant, expanded, onClick }) => (\n  <label\n    className={\n      variant === BannerVariant.Warning\n        ? 'content-warning'\n        : 'content-warning content-warning--filter'\n    }\n  >\n    {children}\n\n    <button className='link-button' onClick={onClick}>\n      {expanded ? (\n        <FormattedMessage\n          id='content_warning.hide'\n          defaultMessage='Hide post'\n        />\n      ) : variant === BannerVariant.Warning ? (\n        <FormattedMessage\n          id='content_warning.show_more'\n          defaultMessage='Show more'\n        />\n      ) : (\n        <FormattedMessage\n          id='content_warning.show'\n          defaultMessage='Show anyway'\n        />\n      )}\n    </button>\n  </label>\n);\n","import { FormattedMessage } from 'react-intl';\n\nimport { StatusBanner, BannerVariant } from './status_banner';\n\nexport const FilterWarning: React.FC<{\n  title: string;\n  expanded?: boolean;\n  onClick?: () => void;\n}> = ({ title, expanded, onClick }) => (\n  <StatusBanner\n    expanded={expanded}\n    onClick={onClick}\n    variant={BannerVariant.Filter}\n  >\n    <p>\n      <FormattedMessage\n        id='filter_warning.matches_filter'\n        defaultMessage='Matches filter “<span>{title}</span>”'\n        values={{\n          title,\n          span: (chunks) => <span className='filter-name'>{chunks}</span>,\n        }}\n      />\n    </p>\n  </StatusBanner>\n);\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access,\n                  @typescript-eslint/no-unsafe-call,\n                  @typescript-eslint/no-explicit-any,\n                  @typescript-eslint/no-unsafe-assignment */\n\nimport type { CSSProperties } from 'react';\nimport { useState, useRef, useCallback } from 'react';\n\nimport { FormattedDate, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Link } from 'react-router-dom';\n\nimport { AnimatedNumber } from 'flavours/glitch/components/animated_number';\nimport AttachmentList from 'flavours/glitch/components/attachment_list';\nimport EditedTimestamp from 'flavours/glitch/components/edited_timestamp';\nimport { FilterWarning } from 'flavours/glitch/components/filter_warning';\nimport type { StatusLike } from 'flavours/glitch/components/hashtag_bar';\nimport { getHashtagBarForStatus } from 'flavours/glitch/components/hashtag_bar';\nimport { IconLogo } from 'flavours/glitch/components/logo';\nimport { Permalink } from 'flavours/glitch/components/permalink';\nimport PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';\nimport { useAppHistory } from 'flavours/glitch/components/router';\nimport { VisibilityIcon } from 'flavours/glitch/components/visibility_icon';\nimport PollContainer from 'flavours/glitch/containers/poll_container';\nimport { useAppSelector } from 'flavours/glitch/store';\n\nimport { Avatar } from '../../../components/avatar';\nimport { DisplayName } from '../../../components/display_name';\nimport MediaGallery from '../../../components/media_gallery';\nimport StatusContent from '../../../components/status_content';\nimport Audio from '../../audio';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport Video from '../../video';\n\nimport Card from './card';\n\ninterface VideoModalOptions {\n  startTime: number;\n  autoPlay?: boolean;\n  defaultVolume: number;\n  componentIndex: number;\n}\n\nexport const DetailedStatus: React.FC<{\n  status: any;\n  onOpenMedia?: (status: any, index: number, lang: string) => void;\n  onOpenVideo?: (status: any, lang: string, options: VideoModalOptions) => void;\n  onTranslate?: (status: any) => void;\n  measureHeight?: boolean;\n  onHeightChange?: () => void;\n  domain: string;\n  showMedia?: boolean;\n  withLogo?: boolean;\n  pictureInPicture: any;\n  onToggleHidden?: (status: any) => void;\n  onToggleMediaVisibility?: () => void;\n  expanded: boolean;\n}> = ({\n  status,\n  onOpenMedia,\n  onOpenVideo,\n  onTranslate,\n  measureHeight,\n  onHeightChange,\n  domain,\n  showMedia,\n  withLogo,\n  pictureInPicture,\n  onToggleMediaVisibility,\n  onToggleHidden,\n  expanded,\n}) => {\n  const properStatus = status?.get('reblog') ?? status;\n  const [height, setHeight] = useState(0);\n  const [showDespiteFilter, setShowDespiteFilter] = useState(false);\n  const nodeRef = useRef<HTMLDivElement>();\n  const history = useAppHistory();\n\n  const rewriteMentions = useAppSelector(\n    (state) => state.local_settings.get('rewrite_mentions', false) as boolean,\n  );\n  const tagMisleadingLinks = useAppSelector(\n    (state) =>\n      state.local_settings.get('tag_misleading_links', false) as boolean,\n  );\n  const mediaOutsideCW = useAppSelector(\n    (state) =>\n      state.local_settings.getIn(\n        ['content_warnings', 'media_outside'],\n        false,\n      ) as boolean,\n  );\n  const letterboxMedia = useAppSelector(\n    (state) =>\n      state.local_settings.getIn(['media', 'letterbox'], false) as boolean,\n  );\n  const fullwidthMedia = useAppSelector(\n    (state) =>\n      state.local_settings.getIn(['media', 'fullwidth'], false) as boolean,\n  );\n\n  const handleOpenVideo = useCallback(\n    (options: VideoModalOptions) => {\n      const lang = (status.getIn(['translation', 'language']) ||\n        status.get('language')) as string;\n      if (onOpenVideo)\n        onOpenVideo(status.getIn(['media_attachments', 0]), lang, options);\n    },\n    [onOpenVideo, status],\n  );\n\n  const handleFilterToggle = useCallback(() => {\n    setShowDespiteFilter(!showDespiteFilter);\n  }, [showDespiteFilter, setShowDespiteFilter]);\n\n  const _measureHeight = useCallback(\n    (heightJustChanged?: boolean) => {\n      if (measureHeight && nodeRef.current) {\n        scheduleIdleTask(() => {\n          if (nodeRef.current)\n            setHeight(Math.ceil(nodeRef.current.scrollHeight) + 1);\n        });\n\n        if (onHeightChange && heightJustChanged) {\n          onHeightChange();\n        }\n      }\n    },\n    [onHeightChange, measureHeight, setHeight],\n  );\n\n  const handleRef = useCallback(\n    (c: HTMLDivElement) => {\n      nodeRef.current = c;\n      _measureHeight();\n    },\n    [_measureHeight],\n  );\n\n  const handleChildUpdate = useCallback(() => {\n    _measureHeight();\n  }, [_measureHeight]);\n\n  const handleTranslate = useCallback(() => {\n    if (onTranslate) onTranslate(status);\n  }, [onTranslate, status]);\n\n  const parseClick = useCallback(\n    (e: React.MouseEvent, destination: string) => {\n      if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey)) {\n        e.preventDefault();\n        history.push(destination);\n      }\n\n      e.stopPropagation();\n    },\n    [history],\n  );\n\n  if (!properStatus) {\n    return null;\n  }\n\n  let applicationLink;\n  let reblogLink;\n\n  //  Depending on user settings, some media are considered as parts of the\n  //  contents (affected by CW) while other will be displayed outside of the\n  //  CW.\n  const contentMedia: React.ReactNode[] = [];\n  const contentMediaIcons: string[] = [];\n  const extraMedia: React.ReactNode[] = [];\n  const extraMediaIcons: string[] = [];\n  let media = contentMedia;\n  let mediaIcons: string[] = contentMediaIcons;\n\n  if (mediaOutsideCW) {\n    media = extraMedia;\n    mediaIcons = extraMediaIcons;\n  }\n\n  const outerStyle = { boxSizing: 'border-box' } as CSSProperties;\n\n  if (measureHeight) {\n    outerStyle.height = height;\n  }\n\n  const language =\n    status.getIn(['translation', 'language']) || status.get('language');\n\n  if (pictureInPicture.get('inUse')) {\n    media.push(<PictureInPicturePlaceholder />);\n    mediaIcons.push('video-camera');\n  } else if (status.get('media_attachments').size > 0) {\n    if (\n      status\n        .get('media_attachments')\n        .some(\n          (item: Immutable.Map<string, any>) => item.get('type') === 'unknown',\n        )\n    ) {\n      media.push(<AttachmentList media={status.get('media_attachments')} />);\n    } else if (\n      ['image', 'gifv', 'unknown'].includes(\n        status.getIn(['media_attachments', 0, 'type']) as string,\n      ) ||\n      status.get('media_attachments').size > 1\n    ) {\n      media.push(\n        <MediaGallery\n          standalone\n          sensitive={status.get('sensitive')}\n          media={status.get('media_attachments')}\n          lang={language}\n          height={300}\n          letterbox={letterboxMedia}\n          fullwidth={fullwidthMedia}\n          hidden={!expanded}\n          onOpenMedia={onOpenMedia}\n          visible={showMedia}\n          onToggleVisibility={onToggleMediaVisibility}\n        />,\n      );\n      mediaIcons.push('picture-o');\n    } else if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n      const attachment = status.getIn(['media_attachments', 0]);\n      const description =\n        attachment.getIn(['translation', 'description']) ||\n        attachment.get('description');\n\n      media.push(\n        <Audio\n          src={attachment.get('url')}\n          alt={description}\n          lang={language}\n          duration={attachment.getIn(['meta', 'original', 'duration'], 0)}\n          poster={\n            attachment.get('preview_url') ||\n            status.getIn(['account', 'avatar_static'])\n          }\n          backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}\n          foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}\n          accentColor={attachment.getIn(['meta', 'colors', 'accent'])}\n          sensitive={status.get('sensitive')}\n          visible={showMedia}\n          blurhash={attachment.get('blurhash')}\n          height={150}\n          onToggleVisibility={onToggleMediaVisibility}\n        />,\n      );\n      mediaIcons.push('music');\n    } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n      const attachment = status.getIn(['media_attachments', 0]);\n      const description =\n        attachment.getIn(['translation', 'description']) ||\n        attachment.get('description');\n\n      media.push(\n        <Video\n          preview={attachment.get('preview_url')}\n          frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}\n          aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`}\n          blurhash={attachment.get('blurhash')}\n          src={attachment.get('url')}\n          alt={description}\n          lang={language}\n          inline\n          width={300}\n          height={150}\n          onOpenVideo={handleOpenVideo}\n          sensitive={status.get('sensitive')}\n          visible={showMedia}\n          onToggleVisibility={onToggleMediaVisibility}\n          letterbox={letterboxMedia}\n          fullwidth={fullwidthMedia}\n          preventPlayback={!expanded}\n        />,\n      );\n      mediaIcons.push('video-camera');\n    }\n  } else if (status.get('card')) {\n    media.push(\n      <Card\n        sensitive={status.get('sensitive')}\n        onOpenMedia={onOpenMedia}\n        card={status.get('card')}\n      />,\n    );\n    mediaIcons.push('link');\n  }\n\n  if (status.get('poll')) {\n    contentMedia.push(\n      <PollContainer\n        pollId={status.get('poll')}\n        // @ts-expect-error -- Poll/PollContainer is not typed yet\n        lang={status.get('language')}\n      />,\n    );\n    contentMediaIcons.push('tasks');\n  }\n\n  if (status.get('application')) {\n    applicationLink = (\n      <>\n        ·\n        <a\n          className='detailed-status__application'\n          href={status.getIn(['application', 'website'])}\n          target='_blank'\n          rel='noopener noreferrer'\n        >\n          {status.getIn(['application', 'name'])}\n        </a>\n      </>\n    );\n  }\n\n  const visibilityLink = (\n    <>\n      ·<VisibilityIcon visibility={status.get('visibility')} />\n    </>\n  );\n\n  if (['private', 'direct'].includes(status.get('visibility') as string)) {\n    reblogLink = '';\n  } else {\n    reblogLink = (\n      <Link\n        to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`}\n        className='detailed-status__link'\n      >\n        <span className='detailed-status__reblogs'>\n          <AnimatedNumber value={status.get('reblogs_count')} />\n        </span>\n        <FormattedMessage\n          id='status.reblogs'\n          defaultMessage='{count, plural, one {boost} other {boosts}}'\n          values={{ count: status.get('reblogs_count') }}\n        />\n      </Link>\n    );\n  }\n\n  const favouriteLink = (\n    <Link\n      to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`}\n      className='detailed-status__link'\n    >\n      <span className='detailed-status__favorites'>\n        <AnimatedNumber value={status.get('favourites_count')} />\n      </span>\n      <FormattedMessage\n        id='status.favourites'\n        defaultMessage='{count, plural, one {favorite} other {favorites}}'\n        values={{ count: status.get('favourites_count') }}\n      />\n    </Link>\n  );\n\n  const { statusContentProps, hashtagBar } = getHashtagBarForStatus(\n    status as StatusLike,\n  );\n  contentMedia.push(hashtagBar);\n\n  const matchedFilters = status.get('matched_filters');\n\n  return (\n    <div style={outerStyle}>\n      <div\n        ref={handleRef}\n        className={classNames(\n          'detailed-status',\n          `detailed-status-${status.get('visibility')}`,\n        )}\n        data-status-by={status.getIn(['account', 'acct'])}\n      >\n        <Permalink\n          to={`/@${status.getIn(['account', 'acct'])}`}\n          href={status.getIn(['account', 'url'])}\n          data-hover-card-account={status.getIn(['account', 'id'])}\n          className='detailed-status__display-name'\n        >\n          <div className='detailed-status__display-avatar'>\n            <Avatar account={status.get('account')} size={46} />\n          </div>\n          <DisplayName account={status.get('account')} localDomain={domain} />\n          {withLogo && (\n            <>\n              <div className='spacer' />\n              <IconLogo />\n            </>\n          )}\n        </Permalink>\n\n        {matchedFilters && (\n          <FilterWarning\n            title={matchedFilters.join(', ')}\n            expanded={showDespiteFilter}\n            onClick={handleFilterToggle}\n          />\n        )}\n\n        {(!matchedFilters || showDespiteFilter) && (\n          <StatusContent\n            status={status}\n            media={contentMedia}\n            extraMedia={extraMedia}\n            mediaIcons={contentMediaIcons}\n            expanded={expanded}\n            collapsed={false}\n            onExpandedToggle={onToggleHidden}\n            onTranslate={handleTranslate}\n            onUpdate={handleChildUpdate}\n            tagLinks={tagMisleadingLinks}\n            rewriteMentions={rewriteMentions}\n            parseClick={parseClick}\n            disabled\n            {...(statusContentProps as any)}\n          />\n        )}\n\n        <div className='detailed-status__meta'>\n          <div className='detailed-status__meta__line'>\n            <a\n              className='detailed-status__datetime'\n              href={status.get('url')}\n              target='_blank'\n              rel='noopener noreferrer'\n            >\n              <FormattedDate\n                value={new Date(status.get('created_at') as string)}\n                year='numeric'\n                month='short'\n                day='2-digit'\n                hour='2-digit'\n                minute='2-digit'\n              />\n            </a>\n\n            {visibilityLink}\n            {applicationLink}\n          </div>\n\n          {status.get('edited_at') && (\n            <div className='detailed-status__meta__line'>\n              <EditedTimestamp\n                statusId={status.get('id')}\n                timestamp={status.get('edited_at')}\n              />\n            </div>\n          )}\n\n          <div className='detailed-status__meta__line'>\n            {reblogLink}\n            {reblogLink && <>·</>}\n            {favouriteLink}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgChat(_ref) {\n  let {\n    title,\n    titleId,\n    ...props\n  } = _ref;\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    xmlns: \"http://www.w3.org/2000/svg\",\n    height: \"24px\",\n    viewBox: \"0 -960 960 960\",\n    width: \"24px\",\n    fill: \"#5f6368\",\n    \"aria-labelledby\": titleId\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n    id: titleId\n  }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M240-400h320v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z\"\n  })));\n}\nexport default SvgChat;","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nimport BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react';\nimport BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react';\nimport MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react';\nimport RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';\nimport ReplyIcon from '@/material-icons/400-24px/reply.svg?react';\nimport ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';\nimport StarIcon from '@/material-icons/400-24px/star-fill.svg?react';\nimport StarBorderIcon from '@/material-icons/400-24px/star.svg?react';\nimport RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';\nimport RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';\nimport RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';\nimport RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';\nimport { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';\nimport { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';\nimport { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';\n\nimport { IconButton } from '../../../components/icon_button';\nimport DropdownMenuContainer from '../../../containers/dropdown_menu_container';\nimport { me } from '../../../initial_state';\n\nconst messages = defineMessages({\n  delete: { id: 'status.delete', defaultMessage: 'Delete' },\n  redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\n  edit: { id: 'status.edit', defaultMessage: 'Edit' },\n  direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },\n  mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },\n  reply: { id: 'status.reply', defaultMessage: 'Reply' },\n  reblog: { id: 'status.reblog', defaultMessage: 'Boost' },\n  reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },\n  cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },\n  cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n  favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },\n  bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n  more: { id: 'status.more', defaultMessage: 'More' },\n  mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },\n  muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n  unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n  block: { id: 'status.block', defaultMessage: 'Block @{name}' },\n  report: { id: 'status.report', defaultMessage: 'Report @{name}' },\n  share: { id: 'status.share', defaultMessage: 'Share' },\n  pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },\n  unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },\n  embed: { id: 'status.embed', defaultMessage: 'Get embed code' },\n  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },\n  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this post in the moderation interface' },\n  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },\n  copy: { id: 'status.copy', defaultMessage: 'Copy link to post' },\n  openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },\n});\n\nclass ActionBar extends PureComponent {\n  static propTypes = {\n    identity: identityContextPropShape,\n    status: ImmutablePropTypes.map.isRequired,\n    onReply: PropTypes.func.isRequired,\n    onReblog: PropTypes.func.isRequired,\n    onFavourite: PropTypes.func.isRequired,\n    onBookmark: PropTypes.func.isRequired,\n    onDelete: PropTypes.func.isRequired,\n    onEdit: PropTypes.func.isRequired,\n    onDirect: PropTypes.func.isRequired,\n    onMention: PropTypes.func.isRequired,\n    onMute: PropTypes.func,\n    onBlock: 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 = (e) => {\n    this.props.onFavourite(this.props.status, e);\n  };\n\n  handleBookmarkClick = (e) => {\n    this.props.onBookmark(this.props.status, e);\n  };\n\n  handleDeleteClick = () => {\n    this.props.onDelete(this.props.status);\n  };\n\n  handleRedraftClick = () => {\n    this.props.onDelete(this.props.status, true);\n  };\n\n  handleEditClick = () => {\n    this.props.onEdit(this.props.status);\n  };\n\n  handleDirectClick = () => {\n    this.props.onDirect(this.props.status.get('account'));\n  };\n\n  handleMentionClick = () => {\n    this.props.onMention(this.props.status.get('account'));\n  };\n\n  handleMuteClick = () => {\n    this.props.onMute(this.props.status.get('account'));\n  };\n\n  handleBlockClick = () => {\n    this.props.onBlock(this.props.status);\n  };\n\n  handleConversationMuteClick = () => {\n    this.props.onMuteConversation(this.props.status);\n  };\n\n  handleReport = () => {\n    this.props.onReport(this.props.status);\n  };\n\n  handlePinClick = () => {\n    this.props.onPin(this.props.status);\n  };\n\n  handleShare = () => {\n    navigator.share({\n      url: this.props.status.get('url'),\n    });\n  };\n\n  handleEmbed = () => {\n    this.props.onEmbed(this.props.status);\n  };\n\n  handleCopy = () => {\n    const url = this.props.status.get('url');\n    navigator.clipboard.writeText(url);\n  };\n\n  render () {\n    const { status, intl } = this.props;\n    const { signedIn, permissions } = this.props.identity;\n\n    const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));\n    const pinnableStatus     = ['public', 'unlisted', 'private'].includes(status.get('visibility'));\n    const mutingConversation = status.get('muted');\n    const writtenByMe        = status.getIn(['account', 'id']) === me;\n    const isRemote           = status.getIn(['account', 'username']) !== status.getIn(['account', 'acct']);\n\n    let menu = [];\n\n    if (publicStatus && isRemote) {\n      menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });\n    }\n\n    menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });\n\n    if (publicStatus && 'share' in navigator) {\n      menu.push({ text: intl.formatMessage(messages.share), action: this.handleShare });\n    }\n\n    if (publicStatus && (signedIn || !isRemote)) {\n      menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n    }\n\n    if (signedIn) {\n      menu.push(null);\n\n      if (writtenByMe) {\n        if (pinnableStatus) {\n          menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n          menu.push(null);\n        }\n\n        menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });\n        menu.push(null);\n        menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });\n        menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true });\n        menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick, dangerous: true });\n      } else {\n        menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });\n        menu.push({ 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, dangerous: true });\n        menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick, dangerous: true });\n        menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport, dangerous: true });\n        if (((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {\n          menu.push(null);\n          if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {\n            if (accountAdminLink !== undefined) {\n              menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: accountAdminLink(status.getIn(['account', 'id'])) });\n            }\n            if (statusAdminLink !== undefined) {\n              menu.push({ text: intl.formatMessage(messages.admin_status), href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')) });\n            }\n          }\n          if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {\n            const domain = status.getIn(['account', 'acct']).split('@')[1];\n            menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });\n          }\n        }\n      }\n    }\n\n    let replyIcon;\n    let replyIconComponent;\n\n    if (status.get('in_reply_to_id', null) === null) {\n      replyIcon = 'reply';\n      replyIconComponent = ReplyIcon;\n    } else {\n      replyIcon = 'reply-all';\n      replyIconComponent = ReplyAllIcon;\n    }\n\n    const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';\n\n    let reblogTitle, reblogIconComponent;\n\n    if (status.get('reblogged')) {\n      reblogTitle = intl.formatMessage(messages.cancel_reblog_private);\n      reblogIconComponent = publicStatus ? RepeatActiveIcon : RepeatPrivateActiveIcon;\n    } else if (publicStatus) {\n      reblogTitle = intl.formatMessage(messages.reblog);\n      reblogIconComponent = RepeatIcon;\n    } else if (reblogPrivate) {\n      reblogTitle = intl.formatMessage(messages.reblog_private);\n      reblogIconComponent = RepeatPrivateIcon;\n    } else {\n      reblogTitle = intl.formatMessage(messages.cannot_reblog);\n      reblogIconComponent = RepeatDisabledIcon;\n    }\n\n    return (\n      <div className='detailed-status__action-bar'>\n        <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={replyIcon} iconComponent={replyIconComponent} onClick={this.handleReplyClick} /></div>\n        <div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' iconComponent={reblogIconComponent} onClick={this.handleReblogClick} /></div>\n        <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' iconComponent={status.get('favourited') ? StarIcon : StarBorderIcon} onClick={this.handleFavouriteClick} /></div>\n        <div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' iconComponent={status.get('bookmarked') ? BookmarkIcon : BookmarkBorderIcon} onClick={this.handleBookmarkClick} /></div>\n\n        <div className='detailed-status__action-bar-dropdown'>\n          <DropdownMenuContainer size={18} icon='ellipsis-h' iconComponent={MoreHorizIcon} items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n        </div>\n      </div>\n    );\n  }\n\n}\n\nexport default withIdentity(injectIntl(ActionBar));\n","import PropTypes from 'prop-types';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Helmet } from 'react-helmet';\nimport { withRouter } from 'react-router-dom';\n\nimport { createSelector } from '@reduxjs/toolkit';\nimport Immutable from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { connect } from 'react-redux';\n\nimport { HotKeys } from 'react-hotkeys';\n\nimport ChatIcon from '@/material-icons/400-24px/chat.svg?react';\nimport VisibilityIcon from '@/material-icons/400-24px/visibility.svg?react';\nimport VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';\nimport { Icon }  from 'flavours/glitch/components/icon';\nimport { LoadingIndicator } from 'flavours/glitch/components/loading_indicator';\nimport { TimelineHint } from 'flavours/glitch/components/timeline_hint';\nimport ScrollContainer from 'flavours/glitch/containers/scroll_container';\nimport BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';\nimport { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';\nimport { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';\nimport { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';\n\nimport { initBlockModal } from '../../actions/blocks';\nimport {\n  replyCompose,\n  mentionCompose,\n  directCompose,\n} from '../../actions/compose';\nimport {\n  toggleFavourite,\n  bookmark,\n  unbookmark,\n  toggleReblog,\n  pin,\n  unpin,\n} from '../../actions/interactions';\nimport { openModal } from '../../actions/modal';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initReport } from '../../actions/reports';\nimport {\n  fetchStatus,\n  muteStatus,\n  unmuteStatus,\n  deleteStatus,\n  editStatus,\n  hideStatus,\n  revealStatus,\n  translateStatus,\n  undoStatusTranslation,\n} from '../../actions/statuses';\nimport ColumnHeader from '../../components/column_header';\nimport { textForScreenReader, defaultMediaVisibility } from '../../components/status';\nimport StatusContainer from '../../containers/status_container';\nimport { deleteModal } from '../../initial_state';\nimport { makeGetStatus, makeGetPictureInPicture } from '../../selectors';\nimport Column from '../ui/components/column';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\n\nimport ActionBar from './components/action_bar';\nimport { DetailedStatus } from './components/detailed_status';\n\n\nconst messages = defineMessages({\n  revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },\n  hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },\n  statusTitleWithAttachments: { id: 'status.title.with_attachments', defaultMessage: '{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}' },\n  detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },\n  tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' },\n});\n\nconst makeMapStateToProps = () => {\n  const getStatus = makeGetStatus();\n  const getPictureInPicture = makeGetPictureInPicture();\n\n  const getAncestorsIds = createSelector([\n    (_, { id }) => id,\n    state => state.getIn(['contexts', 'inReplyTos']),\n  ], (statusId, inReplyTos) => {\n    let ancestorsIds = Immutable.List();\n    ancestorsIds = ancestorsIds.withMutations(mutable => {\n      let id = statusId;\n\n      while (id && !mutable.includes(id)) {\n        mutable.unshift(id);\n        id = inReplyTos.get(id);\n      }\n    });\n\n    return ancestorsIds;\n  });\n\n  const getDescendantsIds = createSelector([\n    (_, { id }) => id,\n    state => state.getIn(['contexts', 'replies']),\n    state => state.get('statuses'),\n  ], (statusId, contextReplies, statuses) => {\n    let descendantsIds = [];\n    const ids = [statusId];\n\n    while (ids.length > 0) {\n      let id        = ids.pop();\n      const replies = contextReplies.get(id);\n\n      if (statusId !== id) {\n        descendantsIds.push(id);\n      }\n\n      if (replies) {\n        replies.reverse().forEach(reply => {\n          if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply);\n        });\n      }\n    }\n\n    let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));\n    if (insertAt !== -1) {\n      descendantsIds.forEach((id, idx) => {\n        if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {\n          descendantsIds.splice(idx, 1);\n          descendantsIds.splice(insertAt, 0, id);\n          insertAt += 1;\n        }\n      });\n    }\n\n    return Immutable.List(descendantsIds);\n  });\n\n  const mapStateToProps = (state, props) => {\n    const status = getStatus(state, { id: props.params.statusId, contextType: 'detailed' });\n\n    let ancestorsIds   = Immutable.List();\n    let descendantsIds = Immutable.List();\n\n    if (status) {\n      ancestorsIds   = getAncestorsIds(state, { id: status.get('in_reply_to_id') });\n      descendantsIds = getDescendantsIds(state, { id: status.get('id') });\n    }\n\n    return {\n      isLoading: state.getIn(['statuses', props.params.statusId, 'isLoading']),\n      status,\n      ancestorsIds,\n      descendantsIds,\n      settings: state.get('local_settings'),\n      askReplyConfirmation: state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0,\n      domain: state.getIn(['meta', 'domain']),\n      pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }),\n    };\n  };\n\n  return mapStateToProps;\n};\n\nconst truncate = (str, num) => {\n  const arr = Array.from(str);\n  if (arr.length > num) {\n    return arr.slice(0, num).join('') + '…';\n  } else {\n    return str;\n  }\n};\n\nconst titleFromStatus = (intl, status) => {\n  const displayName = status.getIn(['account', 'display_name']);\n  const username = status.getIn(['account', 'username']);\n  const user = displayName.trim().length === 0 ? username : displayName;\n  const text = status.get('search_index');\n  const attachmentCount = status.get('media_attachments').size;\n\n  return text ? `${user}: \"${truncate(text, 30)}\"` : intl.formatMessage(messages.statusTitleWithAttachments, { user, attachmentCount });\n};\n\nclass Status extends ImmutablePureComponent {\n  static propTypes = {\n    identity: identityContextPropShape,\n    params: PropTypes.object.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    status: ImmutablePropTypes.map,\n    isLoading: PropTypes.bool,\n    settings: ImmutablePropTypes.map.isRequired,\n    ancestorsIds: ImmutablePropTypes.list.isRequired,\n    descendantsIds: ImmutablePropTypes.list.isRequired,\n    intl: PropTypes.object.isRequired,\n    askReplyConfirmation: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n    domain: PropTypes.string.isRequired,\n    pictureInPicture: ImmutablePropTypes.contains({\n      inUse: PropTypes.bool,\n      available: PropTypes.bool,\n    }),\n    ...WithRouterPropTypes\n  };\n\n  state = {\n    fullscreen: false,\n    isExpanded: undefined,\n    threadExpanded: undefined,\n    statusId: undefined,\n    loadedStatusId: undefined,\n    showMedia: undefined,\n    revealBehindCW: undefined,\n  };\n\n  componentDidMount () {\n    attachFullscreenListener(this.onFullScreenChange);\n    this.props.dispatch(fetchStatus(this.props.params.statusId));\n    this._scrollStatusIntoView();\n  }\n\n  static getDerivedStateFromProps(props, state) {\n    let update = {};\n    let updated = false;\n\n    if (props.params.statusId && state.statusId !== props.params.statusId) {\n      props.dispatch(fetchStatus(props.params.statusId));\n      update.threadExpanded = undefined;\n      update.statusId = props.params.statusId;\n      updated = true;\n    }\n\n    const revealBehindCW = props.settings.getIn(['media', 'reveal_behind_cw']);\n    if (revealBehindCW !== state.revealBehindCW) {\n      update.revealBehindCW = revealBehindCW;\n      if (revealBehindCW) update.showMedia = defaultMediaVisibility(props.status, props.settings);\n      updated = true;\n    }\n\n    if (props.status && state.loadedStatusId !== props.status.get('id')) {\n      update.showMedia = defaultMediaVisibility(props.status, props.settings);\n      update.loadedStatusId = props.status.get('id');\n      update.isExpanded = autoUnfoldCW(props.settings, props.status);\n      updated = true;\n    }\n\n    return updated ? update : null;\n  }\n\n  handleToggleHidden = () => {\n    const { status } = this.props;\n\n    if (this.props.settings.getIn(['content_warnings', 'shared_state'])) {\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    } else if (this.props.status.get('spoiler_text')) {\n      this.setExpansion(!this.state.isExpanded);\n    }\n  };\n\n  handleToggleMediaVisibility = () => {\n    this.setState({ showMedia: !this.state.showMedia });\n  };\n\n\n  handleFavouriteClick = (status, e) => {\n    const { dispatch } = this.props;\n    const { signedIn } = this.props.identity;\n\n    if (signedIn) {\n      dispatch(toggleFavourite(status.get('id'), e && e.shiftKey));\n    } else {\n      dispatch(openModal({\n        modalType: 'INTERACTION',\n        modalProps: {\n          type: 'favourite',\n          accountId: status.getIn(['account', 'id']),\n          url: status.get('uri'),\n        },\n      }));\n    }\n  };\n\n  handlePin = (status) => {\n    if (status.get('pinned')) {\n      this.props.dispatch(unpin(status));\n    } else {\n      this.props.dispatch(pin(status));\n    }\n  };\n\n  handleReplyClick = (status) => {\n    const { askReplyConfirmation, dispatch } = this.props;\n    const { signedIn } = this.props.identity;\n\n    if (signedIn) {\n      if (askReplyConfirmation) {\n        dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));\n      } else {\n        dispatch(replyCompose(status));\n      }\n    } else {\n      dispatch(openModal({\n        modalType: 'INTERACTION',\n        modalProps: {\n          type: 'reply',\n          accountId: status.getIn(['account', 'id']),\n          url: status.get('uri'),\n        },\n      }));\n    }\n  };\n\n  handleReblogClick = (status, e) => {\n    const { dispatch } = this.props;\n    const { signedIn } = this.props.identity;\n\n    if (signedIn) {\n      dispatch(toggleReblog(status.get('id'), e && e.shiftKey));\n    } else {\n      dispatch(openModal({\n        modalType: 'INTERACTION',\n        modalProps: {\n          type: 'reblog',\n          accountId: status.getIn(['account', 'id']),\n          url: status.get('uri'),\n        },\n      }));\n    }\n  };\n\n  handleBookmarkClick = (status) => {\n    if (status.get('bookmarked')) {\n      this.props.dispatch(unbookmark(status));\n    } else {\n      this.props.dispatch(bookmark(status));\n    }\n  };\n\n  handleDeleteClick = (status, withRedraft = false) => {\n    const { dispatch } = this.props;\n\n    if (!deleteModal) {\n      dispatch(deleteStatus(status.get('id'), withRedraft));\n    } else {\n      dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));\n    }\n  };\n\n  handleEditClick = (status) => {\n    const { dispatch, askReplyConfirmation } = this.props;\n\n    if (askReplyConfirmation) {\n      dispatch(openModal({ modalType: 'CONFIRM_EDIT_STATUS', modalProps: { statusId: status.get('id') } }));\n    } else {\n      dispatch(editStatus(status.get('id')));\n    }\n  };\n\n  handleDirectClick = (account) => {\n    this.props.dispatch(directCompose(account));\n  };\n\n  handleMentionClick = (account) => {\n    this.props.dispatch(mentionCompose(account));\n  };\n\n  handleOpenMedia = (media, index, lang) => {\n    this.props.dispatch(openModal({\n      modalType: 'MEDIA',\n      modalProps: { statusId: this.props.status.get('id'), media, index, lang },\n    }));\n  };\n\n  handleOpenVideo = (media, lang, options) => {\n    this.props.dispatch(openModal({\n      modalType: 'VIDEO',\n      modalProps: { statusId: this.props.status.get('id'), media, lang, options },\n    }));\n  };\n\n  handleHotkeyOpenMedia = e => {\n    const { status } = this.props;\n\n    e.preventDefault();\n\n    if (status.get('media_attachments').size > 0) {\n      if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n        this.handleOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 });\n      } else {\n        this.handleOpenMedia(status.get('media_attachments'), 0);\n      }\n    }\n  };\n\n  handleMuteClick = (account) => {\n    this.props.dispatch(initMuteModal(account));\n  };\n\n  handleConversationMuteClick = (status) => {\n    if (status.get('muted')) {\n      this.props.dispatch(unmuteStatus(status.get('id')));\n    } else {\n      this.props.dispatch(muteStatus(status.get('id')));\n    }\n  };\n\n  handleToggleAll = () => {\n    const { status, ancestorsIds, descendantsIds, settings } = this.props;\n    const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());\n    let { isExpanded } = this.state;\n\n    if (settings.getIn(['content_warnings', 'shared_state']))\n      isExpanded = !status.get('hidden');\n\n    if (!isExpanded) {\n      this.props.dispatch(revealStatus(statusIds));\n    } else {\n      this.props.dispatch(hideStatus(statusIds));\n    }\n\n    this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded });\n  };\n\n  handleTranslate = status => {\n    const { dispatch } = this.props;\n\n    if (status.get('translation')) {\n      dispatch(undoStatusTranslation(status.get('id'), status.get('poll')));\n    } else {\n      dispatch(translateStatus(status.get('id')));\n    }\n  };\n\n  handleBlockClick = (status) => {\n    const { dispatch } = this.props;\n    const account = status.get('account');\n    dispatch(initBlockModal(account));\n  };\n\n  handleReport = (status) => {\n    this.props.dispatch(initReport(status.get('account'), status));\n  };\n\n  handleEmbed = (status) => {\n    this.props.dispatch(openModal({\n      modalType: 'EMBED',\n      modalProps: { id: status.get('id') },\n    }));\n  };\n\n  handleHotkeyToggleSensitive = () => {\n    this.handleToggleMediaVisibility();\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  handleHotkeyBookmark = () => {\n    this.handleBookmarkClick(this.props.status);\n  };\n\n  handleHotkeyMention = e => {\n    e.preventDefault();\n    this.handleMentionClick(this.props.status);\n  };\n\n  handleHotkeyOpenProfile = () => {\n    this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);\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  handleHeaderClick = () => {\n    this.column.scrollTop();\n  };\n\n  renderChildren (list, ancestors) {\n    const { params: { statusId } } = this.props;\n\n    return list.map((id, i) => (\n      <StatusContainer\n        key={id}\n        id={id}\n        expanded={this.state.threadExpanded}\n        onMoveUp={this.handleMoveUp}\n        onMoveDown={this.handleMoveDown}\n        contextType='thread'\n        previousId={i > 0 ? list.get(i - 1) : undefined}\n        nextId={list.get(i + 1) || (ancestors && statusId)}\n        rootId={statusId}\n      />\n    ));\n  }\n\n  setExpansion = value => {\n    this.setState({ isExpanded: value });\n  };\n\n  setContainerRef = c => {\n    this.node = c;\n  };\n\n  setColumnRef = c => {\n    this.column = c;\n  };\n\n  setStatusRef = c => {\n    this.statusNode = c;\n  };\n\n  _scrollStatusIntoView () {\n    const { status, multiColumn } = this.props;\n\n    if (status) {\n      requestIdleCallback(() => {\n        this.statusNode?.scrollIntoView(true);\n\n        // In the single-column interface, `scrollIntoView` will put the post behind the header,\n        // so compensate for that.\n        if (!multiColumn) {\n          const offset = document.querySelector('.column-header__wrapper')?.getBoundingClientRect()?.bottom;\n          if (offset) {\n            const scrollingElement = document.scrollingElement || document.body;\n            scrollingElement.scrollBy(0, -offset);\n          }\n        }\n      });\n    }\n  }\n\n  componentDidUpdate (prevProps) {\n    const { status, ancestorsIds } = this.props;\n\n    if (status && (ancestorsIds.size > prevProps.ancestorsIds.size || prevProps.status?.get('id') !== status.get('id'))) {\n      this._scrollStatusIntoView();\n    }\n  }\n\n  componentWillUnmount () {\n    detachFullscreenListener(this.onFullScreenChange);\n  }\n\n  onFullScreenChange = () => {\n    this.setState({ fullscreen: isFullscreen() });\n  };\n\n  shouldUpdateScroll = (prevRouterProps, { location }) => {\n    // Do not change scroll when opening a modal\n    if (location.state?.mastodonModalKey !== prevRouterProps?.location?.state?.mastodonModalKey) {\n      return false;\n    }\n\n    // Scroll to focused post if it is loaded\n    if (this.statusNode) {\n      return [0, this.statusNode.offsetTop];\n    }\n\n    // Do not scroll otherwise, `componentDidUpdate` will take care of that\n    return false;\n  };\n\n  render () {\n    let ancestors, descendants, remoteHint;\n    const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props;\n    const { fullscreen } = this.state;\n\n    if (isLoading) {\n      return (\n        <Column>\n          <LoadingIndicator />\n        </Column>\n      );\n    }\n\n    if (status === null) {\n      return (\n        <BundleColumnError multiColumn={multiColumn} errorType='routing' />\n      );\n    }\n\n    const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded;\n\n    if (ancestorsIds && ancestorsIds.size > 0) {\n      ancestors = <>{this.renderChildren(ancestorsIds, true)}</>;\n    }\n\n    if (descendantsIds && descendantsIds.size > 0) {\n      descendants = <>{this.renderChildren(descendantsIds)}</>;\n    }\n\n    const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1;\n    const isIndexable = !status.getIn(['account', 'noindex']);\n\n    if (!isLocal) {\n      remoteHint = (\n        <TimelineHint\n          className={classNames(!!descendants && 'timeline-hint--with-descendants')}\n          url={status.get('url')}\n          message={<FormattedMessage id='hints.threads.replies_may_be_missing' defaultMessage='Replies from other servers may be missing.' />}\n          label={<FormattedMessage id='hints.threads.see_more' defaultMessage='See more replies on {domain}' values={{ domain: <strong>{status.getIn(['account', 'acct']).split('@')[1]}</strong> }} />}\n        />\n      );\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      bookmark: this.handleHotkeyBookmark,\n      mention: this.handleHotkeyMention,\n      openProfile: this.handleHotkeyOpenProfile,\n      toggleHidden: this.handleToggleHidden,\n      toggleSensitive: this.handleHotkeyToggleSensitive,\n      openMedia: this.handleHotkeyOpenMedia,\n    };\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.detailedStatus)}>\n        <ColumnHeader\n          icon='comment'\n          iconComponent={ChatIcon}\n          title={intl.formatMessage(messages.tootHeading)}\n          onClick={this.handleHeaderClick}\n          showBackButton\n          multiColumn={multiColumn}\n          extraButton={(\n            <button type='button' className='column-header__button' title={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll}><Icon id={!isExpanded ? 'eye-slash' : 'eye'} icon={isExpanded ? VisibilityOffIcon : VisibilityIcon} /></button>\n          )}\n        />\n\n        <ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>\n          <div className={classNames('scrollable', { fullscreen })} ref={this.setContainerRef}>\n            {ancestors}\n\n            <HotKeys handlers={handlers}>\n              <div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false, isExpanded)} ref={this.setStatusRef}>\n                <DetailedStatus\n                  key={`details-${status.get('id')}`}\n                  status={status}\n                  settings={settings}\n                  onOpenVideo={this.handleOpenVideo}\n                  onOpenMedia={this.handleOpenMedia}\n                  expanded={isExpanded}\n                  onToggleHidden={this.handleToggleHidden}\n                  onTranslate={this.handleTranslate}\n                  domain={domain}\n                  showMedia={this.state.showMedia}\n                  onToggleMediaVisibility={this.handleToggleMediaVisibility}\n                  pictureInPicture={pictureInPicture}\n                />\n\n                <ActionBar\n                  key={`action-bar-${status.get('id')}`}\n                  status={status}\n                  onReply={this.handleReplyClick}\n                  onFavourite={this.handleFavouriteClick}\n                  onReblog={this.handleReblogClick}\n                  onBookmark={this.handleBookmarkClick}\n                  onDelete={this.handleDeleteClick}\n                  onEdit={this.handleEditClick}\n                  onDirect={this.handleDirectClick}\n                  onMention={this.handleMentionClick}\n                  onMute={this.handleMuteClick}\n                  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            {remoteHint}\n          </div>\n        </ScrollContainer>\n\n        <Helmet>\n          <title>{titleFromStatus(intl, status)}</title>\n          <meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />\n          <link rel='canonical' href={status.get('url')} />\n        </Helmet>\n      </Column>\n    );\n  }\n\n}\n\nexport default withRouter(injectIntl(connect(makeMapStateToProps)(withIdentity(Status))));\n"],"sourceRoot":""}