1 line
No EOL
64 KiB
Text
1 line
No EOL
64 KiB
Text
{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/status/components/detailed_status.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/status/components/action_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/components/column_back_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/status/index.js"],"names":["DetailedStatus","height","e","button","ctrlKey","altKey","metaKey","context","router","preventDefault","state","history","location","mastodonBackSteps","push","props","status","getIn","stopPropagation","destination","media","startTime","onOpenVideo","c","node","_measureHeight","href","target","nodeName","parentNode","window","open","heightJustChanged","this","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","render","get","expanded","onToggleHidden","settings","outerStyle","boxSizing","compact","mediaIcon","applicationLink","reblogLink","reblogIcon","favouriteLink","pollId","size","some","item","attachment","src","alt","duration","preload","preview","blurhash","inline","sensitive","letterbox","fullwidth","preventPlayback","handleOpenVideo","autoplay","visible","showMedia","onToggleVisibility","onToggleMediaVisibility","standalone","hidden","onOpenMedia","card","className","rel","id","to","value","onClick","handleModalLink","style","ref","setRef","classNames","data-status-by","handleAccountClick","account","localDomain","domain","collapsed","onExpandedToggle","parseClick","onUpdate","handleChildUpdate","tagLinks","rewriteMentions","disabled","Date","hour12","year","month","day","hour","minute","visibility","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","isRequired","func","bool","string","messages","defineMessages","delete","redraft","direct","mention","reply","reblog","reblog_private","cannot_reblog","favourite","bookmark","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","copy","ActionBar","injectIntl","onReply","onReblog","onFavourite","onBookmark","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","handleConversationMuteClick","handleDeleteClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","isStaff","accountAdminLink","statusAdminLink","undefined","shareButton","title","icon","handleShare","reblog_disabled","reblog_message","handleReplyClick","active","handleReblogClick","animate","handleFavouriteClick","handleBookmarkClick","items","direction","ariaLabel","React","PureComponent","ColumnBackButton","event","shiftKey","go","goBack","handleClick","fixedWidth","defaultMessage","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","tootHeading","Status","connect","getStatus","makeGetStatus","getAncestorsIds","createSelector","_","statusId","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","length","shift","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","askReplyConfirmation","trim","fullscreen","isExpanded","threadExpanded","loadedStatusId","revealBehindCW","setExpansion","dispatch","unfavourite","favouriteModal","handleModalFavourite","openModal","message","confirm","onDoNotAsk","changeLocalSetting","onConfirm","replyCompose","unreblog","handleModalReblog","missingMediaDescription","boostModal","unbookmark","withRedraft","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","initMuteModal","unmuteStatus","muteStatus","initBlockModal","initReport","handleToggleMediaVisibility","handleMoveUp","handleMoveDown","_selectChild","indexOf","column","scrollTop","isFullscreen","prevRouterProps","mastodonModalOpen","componentDidMount","attachFullscreenListener","onFullScreenChange","fetchStatus","element","querySelectorAll","requestAnimationFrame","scrollIntoView","getDerivedStateFromProps","update","updated","defaultMediaVisibility","autoUnfoldCW","align_top","container","offsetTop","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","componentWillUnmount","detachFullscreenListener","ancestors","descendants","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyBookmark","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleSpoiler","handleExpandedToggle","toggleSensitive","handleHotkeyToggleSensitive","setColumnRef","label","handleHeaderClick","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","scrollKey","shouldUpdateScroll","tabIndex","textForScreenReader","handleOpenMedia","handlePin"],"mappings":"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","file":"flavours/glitch/async/status.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from 'flavours/glitch/components/avatar';\nimport DisplayName from 'flavours/glitch/components/display_name';\nimport StatusContent from 'flavours/glitch/components/status_content';\nimport MediaGallery from 'flavours/glitch/components/media_gallery';\nimport AttachmentList from 'flavours/glitch/components/attachment_list';\nimport { Link } from 'react-router-dom';\nimport { FormattedDate, FormattedNumber } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from 'flavours/glitch/features/video';\nimport Audio from 'flavours/glitch/features/audio';\nimport VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';\nimport scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport PollContainer from 'flavours/glitch/containers/poll_container';\nimport Icon from 'flavours/glitch/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 settings: ImmutablePropTypes.map.isRequired,\n onOpenMedia: PropTypes.func.isRequired,\n onOpenVideo: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func,\n expanded: PropTypes.bool,\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.altKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);\n }\n\n e.stopPropagation();\n }\n\n parseClick = (e, destination) => {\n if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(destination, state);\n }\n\n e.stopPropagation();\n }\n\n handleOpenVideo = (media, startTime) => {\n this.props.onOpenVideo(media, startTime);\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 handleChildUpdate = () => {\n this._measureHeight();\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 { expanded, onToggleHidden, settings } = this.props;\n const outerStyle = { boxSizing: 'border-box' };\n const { compact } = this.props;\n\n if (!status) {\n return null;\n }\n\n let media = null;\n let mediaIcon = null;\n let applicationLink = '';\n let reblogLink = '';\n let reblogIcon = 'retweet';\n let favouriteLink = '';\n\n if (this.props.measureHeight) {\n outerStyle.height = `${this.state.height}px`;\n }\n\n if (status.get('poll')) {\n media = <PollContainer pollId={status.get('poll')} />;\n mediaIcon = 'tasks';\n } else if (status.get('media_attachments').size > 0) {\n if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {\n media = <AttachmentList media={status.get('media_attachments')} />;\n } else if (status.getIn(['media_attachments', 0, 'type']) === '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 mediaIcon = 'music';\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n const attachment = status.getIn(['media_attachments', 0]);\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 inline\n sensitive={status.get('sensitive')}\n letterbox={settings.getIn(['media', 'letterbox'])}\n fullwidth={settings.getIn(['media', 'fullwidth'])}\n preventPlayback={!expanded}\n onOpenVideo={this.handleOpenVideo}\n autoplay\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n mediaIcon = 'video-camera';\n } else {\n media = (\n <MediaGallery\n standalone\n sensitive={status.get('sensitive')}\n media={status.get('media_attachments')}\n letterbox={settings.getIn(['media', 'letterbox'])}\n fullwidth={settings.getIn(['media', 'fullwidth'])}\n hidden={!expanded}\n onOpenMedia={this.props.onOpenMedia}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n mediaIcon = 'picture-o';\n }\n } else if (status.get('card')) {\n media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card')} />;\n mediaIcon = 'link';\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 })} data-status-by={status.getIn(['account', 'acct'])}>\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\n status={status}\n media={media}\n mediaIcon={mediaIcon}\n expanded={expanded}\n collapsed={false}\n onExpandedToggle={onToggleHidden}\n parseClick={this.parseClick}\n onUpdate={this.handleChildUpdate}\n tagLinks={settings.get('tag_misleading_links')}\n rewriteMentions={settings.get('rewrite_mentions')}\n disabled\n />\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} · <VisibilityIcon visibility={status.get('visibility')} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport IconButton from 'flavours/glitch/components/icon_button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { me, isStaff } from 'flavours/glitch/util/initial_state';\nimport { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links';\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 cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },\n bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n 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 onBookmark: PropTypes.func.isRequired,\n onMute: PropTypes.func,\n onMuteConversation: PropTypes.func,\n onBlock: PropTypes.func,\n onDelete: PropTypes.func.isRequired,\n onDirect: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\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, 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 }\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 } 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 && (accountAdminLink || statusAdminLink)) {\n menu.push(null);\n if (accountAdminLink !== undefined) {\n menu.push({\n text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }),\n href: accountAdminLink(status.getIn(['account', 'id'])),\n });\n }\n if (statusAdminLink !== undefined) {\n menu.push({\n text: intl.formatMessage(messages.admin_status),\n href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')),\n });\n }\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 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' && me !== status.getIn(['account', 'id'])));\n let reblog_message = status.get('visibility') === 'private' ? messages.reblog_private : messages.reblog;\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_id', null) === null ? 'reply' : 'reply-all'} 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(reblog_message)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>\n <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>\n {shareButton}\n <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>\n\n <div className='detailed-status__action-bar-dropdown'>\n <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' ariaLabel='More' />\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport Icon from 'flavours/glitch/components/icon';\n\nexport default class ColumnBackButton extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n handleClick = (event) => {\n // if history is exhausted, or we would leave mastodon, just go to root.\n if (window.history.state) {\n const state = this.context.router.history.location.state;\n if (event.shiftKey && state && state.mastodonBackSteps) {\n this.context.router.history.go(-state.mastodonBackSteps);\n } else {\n this.context.router.history.goBack();\n }\n } else {\n this.context.router.history.push('/');\n }\n }\n\n render () {\n return (\n <button onClick={this.handleClick} className='column-back-button'>\n <Icon id='chevron-left' className='column-back-button__icon' fixedWidth />\n <FormattedMessage id='column_back_button.label' defaultMessage='Back' />\n </button>\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 'flavours/glitch/actions/statuses';\nimport MissingIndicator from 'flavours/glitch/components/missing_indicator';\nimport DetailedStatus from './components/detailed_status';\nimport ActionBar from './components/action_bar';\nimport Column from 'flavours/glitch/features/ui/components/column';\nimport {\n favourite,\n unfavourite,\n bookmark,\n unbookmark,\n reblog,\n unreblog,\n pin,\n unpin,\n} from 'flavours/glitch/actions/interactions';\nimport {\n replyCompose,\n mentionCompose,\n directCompose,\n} from 'flavours/glitch/actions/compose';\nimport { changeLocalSetting } from 'flavours/glitch/actions/local_settings';\nimport { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses';\nimport { initMuteModal } from 'flavours/glitch/actions/mutes';\nimport { initBlockModal } from 'flavours/glitch/actions/blocks';\nimport { initReport } from 'flavours/glitch/actions/reports';\nimport { makeGetStatus } from 'flavours/glitch/selectors';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport ColumnBackButton from 'flavours/glitch/components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport StatusContainer from 'flavours/glitch/containers/status_container';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen';\nimport { autoUnfoldCW } from 'flavours/glitch/util/content_warning';\nimport { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status';\nimport Icon from 'flavours/glitch/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? You will lose all replies, boosts and favourites to it.' },\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 tootHeading: { id: 'column.toot', defaultMessage: 'Toots and replies' },\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 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 };\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 settings: ImmutablePropTypes.map.isRequired,\n ancestorsIds: ImmutablePropTypes.list,\n descendantsIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n askReplyConfirmation: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n };\n\n state = {\n fullscreen: false,\n 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\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 }\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 handleExpandedToggle = () => {\n 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 handleModalFavourite = (status) => {\n this.props.dispatch(favourite(status));\n }\n\n handleFavouriteClick = (status, e) => {\n if (status.get('favourited')) {\n this.props.dispatch(unfavourite(status));\n } else {\n if ((e && e.shiftKey) || !favouriteModal) {\n this.handleModalFavourite(status);\n } else {\n this.props.dispatch(openModal('FAVOURITE', { status, onFavourite: this.handleModalFavourite }));\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 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 onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),\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 const { dispatch } = this.props;\n\n if (status.get('reblogged')) {\n dispatch(unreblog(status));\n } else {\n dispatch(reblog(status));\n }\n }\n\n handleReblogClick = (status, e) => {\n const { settings, dispatch } = this.props;\n\n if (settings.get('confirm_boost_missing_media_description') && status.get('media_attachments').some(item => !item.get('description')) && !status.get('reblogged')) {\n dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog, missingMediaDescription: true }));\n } else if ((e && e.shiftKey) || !boostModal) {\n this.handleModalReblog(status);\n } else {\n dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));\n }\n }\n\n handleBookmarkClick = (status) => {\n if (status.get('bookmarked')) {\n this.props.dispatch(unbookmark(status));\n } else {\n this.props.dispatch(bookmark(status));\n }\n }\n\n handleDeleteClick = (status, history, withRedraft = false) => {\n const { dispatch, intl } = this.props;\n\n if (!deleteModal) {\n dispatch(deleteStatus(status.get('id'), history, withRedraft));\n } else {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),\n confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),\n onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),\n }));\n }\n }\n\n handleDirectClick = (account, router) => {\n this.props.dispatch(directCompose(account, router));\n }\n\n handleMentionClick = (account, router) => {\n this.props.dispatch(mentionCompose(account, router));\n }\n\n handleOpenMedia = (media, index) => {\n this.props.dispatch(openModal('MEDIA', { media, index }));\n }\n\n handleOpenVideo = (media, time) => {\n this.props.dispatch(openModal('VIDEO', { media, time }));\n }\n\n 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 { isExpanded } = this.state;\n this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded });\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 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 let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`, state);\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) {\n return list.map(id => (\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 />\n ));\n }\n\n setExpansion = value => {\n this.setState({ isExpanded: value });\n }\n\n setRef = c => {\n this.node = c;\n }\n\n setColumnRef = c => {\n this.column = c;\n }\n\n componentDidUpdate (prevProps) {\n if (this.props.params.statusId && (this.props.params.statusId !== prevProps.params.statusId || prevProps.ancestorsIds.size < this.props.ancestorsIds.size)) {\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 }\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 if ((((prevRouterProps || {}).location || {}).state || {}).mastodonModalOpen) return false;\n return !(location.state && location.state.mastodonModalOpen);\n }\n\n render () {\n let ancestors, descendants;\n const { setExpansion } = this;\n const { status, settings, ancestorsIds, descendantsIds, intl, domain } = this.props;\n const { fullscreen, isExpanded } = this.state;\n\n if (status === null) {\n return (\n <Column>\n <ColumnBackButton />\n <MissingIndicator />\n </Column>\n );\n }\n\n if (ancestorsIds && ancestorsIds.size > 0) {\n ancestors = <div>{this.renderChildren(ancestorsIds)}</div>;\n }\n\n if (descendantsIds && descendantsIds.size > 0) {\n descendants = <div>{this.renderChildren(descendantsIds)}</div>;\n }\n\n const handlers = {\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n reply: this.handleHotkeyReply,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n bookmark: this.handleHotkeyBookmark,\n mention: this.handleHotkeyMention,\n openProfile: this.handleHotkeyOpenProfile,\n toggleSpoiler: this.handleExpandedToggle,\n toggleSensitive: this.handleHotkeyToggleSensitive,\n };\n\n return (\n <Column ref={this.setColumnRef} label={intl.formatMessage(messages.detailedStatus)}>\n <ColumnHeader\n icon='comment'\n title={intl.formatMessage(messages.tootHeading)}\n onClick={this.handleHeaderClick}\n showBackButton\n extraButton={(\n <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} aria-pressed={!isExpanded ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>\n )}\n />\n\n <ScrollContainer scrollKey='thread' shouldUpdateScroll={this.shouldUpdateScroll}>\n <div className={classNames('scrollable', 'detailed-status__wrapper', { fullscreen })} ref={this.setRef}>\n {ancestors}\n\n <HotKeys handlers={handlers}>\n <div className='focusable' tabIndex='0' aria-label={textForScreenReader(intl, status, false, !status.get('hidden'))}>\n <DetailedStatus\n status={status}\n settings={settings}\n onOpenVideo={this.handleOpenVideo}\n onOpenMedia={this.handleOpenMedia}\n expanded={isExpanded}\n onToggleHidden={this.handleExpandedToggle}\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 onBookmark={this.handleBookmarkClick}\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":""} |