import classNames from 'classnames'; import React from 'react'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { FormattedDate, FormattedMessage, injectIntl, WrappedComponentProps as IntlProps } from 'react-intl'; import Icon from 'soapbox/components/icon'; import StatusMedia from 'soapbox/components/status-media'; import StatusReplyMentions from 'soapbox/components/status-reply-mentions'; import StatusContent from 'soapbox/components/status_content'; import { HStack, Text } from 'soapbox/components/ui'; import AccountContainer from 'soapbox/containers/account_container'; import QuotedStatus from 'soapbox/features/status/containers/quoted_status_container'; import scheduleIdleTask from 'soapbox/features/ui/util/schedule_idle_task'; import StatusInteractionBar from './status-interaction-bar'; import type { List as ImmutableList } from 'immutable'; import type { Attachment as AttachmentEntity, Status as StatusEntity } from 'soapbox/types/entities'; interface IDetailedStatus extends IntlProps { status: StatusEntity, onOpenMedia: (media: ImmutableList, index: number) => void, onOpenVideo: (media: ImmutableList, start: number) => void, onToggleHidden: (status: StatusEntity) => void, measureHeight: boolean, onHeightChange: () => void, domain: string, compact: boolean, showMedia: boolean, onOpenCompareHistoryModal: (status: StatusEntity) => void, onToggleMediaVisibility: () => void, } interface IDetailedStatusState { height: number | null, } class DetailedStatus extends ImmutablePureComponent { state = { height: null, }; node: HTMLDivElement | null = null; handleExpandedToggle = () => { this.props.onToggleHidden(this.props.status); } handleOpenCompareHistoryModal = () => { this.props.onOpenCompareHistoryModal(this.props.status); } _measureHeight(heightJustChanged = false) { if (this.props.measureHeight && this.node) { scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 })); if (this.props.onHeightChange && heightJustChanged) { this.props.onHeightChange(); } } } setRef: React.RefCallback = c => { this.node = c; this._measureHeight(); } componentDidUpdate(prevProps: IDetailedStatus, prevState: IDetailedStatusState) { this._measureHeight(prevState.height !== this.state.height); } // handleModalLink = e => { // e.preventDefault(); // // let href; // // if (e.target.nodeName !== 'A') { // href = e.target.parentNode.href; // } else { // href = e.target.href; // } // // window.open(href, 'soapbox-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); // } getActualStatus = () => { const { status } = this.props; if (!status) return undefined; return status.reblog && typeof status.reblog === 'object' ? status.reblog : status; } render() { const status = this.getActualStatus(); if (!status) return null; const { account } = status; if (!account || typeof account !== 'object') return null; const outerStyle: React.CSSProperties = { boxSizing: 'border-box' }; const { compact } = this.props; let statusTypeIcon = null; if (this.props.measureHeight) { outerStyle.height = `${this.state.height}px`; } let quote; if (status.quote) { if (status.pleroma.get('quote_visible', true) === false) { quote = (

); } else { quote = ; } } if (status.visibility === 'direct') { statusTypeIcon = ; } else if (status.visibility === 'private') { statusTypeIcon = ; } return (
{/* status.group && (
Posted in {status.getIn(['group', 'title'])}
)*/} {quote}
{statusTypeIcon} {status.edited_at && ( <> {' ยท '}
)}
); } } export default injectIntl(DetailedStatus);