Add show more/less toggle for entire threads in web UI (#6733)
Fix #1258
This commit is contained in:
		
							parent
							
								
									f5ee2d469b
								
							
						
					
					
						commit
						b6003afcdb
					
				
					 8 changed files with 120 additions and 25 deletions
				
			
		| 
						 | 
					@ -23,6 +23,9 @@ export const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST';
 | 
				
			||||||
export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
 | 
					export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
 | 
				
			||||||
export const STATUS_UNMUTE_FAIL    = 'STATUS_UNMUTE_FAIL';
 | 
					export const STATUS_UNMUTE_FAIL    = 'STATUS_UNMUTE_FAIL';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const STATUS_REVEAL = 'STATUS_REVEAL';
 | 
				
			||||||
 | 
					export const STATUS_HIDE   = 'STATUS_HIDE';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function fetchStatusRequest(id, skipLoading) {
 | 
					export function fetchStatusRequest(id, skipLoading) {
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
    type: STATUS_FETCH_REQUEST,
 | 
					    type: STATUS_FETCH_REQUEST,
 | 
				
			||||||
| 
						 | 
					@ -215,3 +218,25 @@ export function unmuteStatusFail(id, error) {
 | 
				
			||||||
    error,
 | 
					    error,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function hideStatus(ids) {
 | 
				
			||||||
 | 
					  if (!Array.isArray(ids)) {
 | 
				
			||||||
 | 
					    ids = [ids];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    type: STATUS_HIDE,
 | 
				
			||||||
 | 
					    ids,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function revealStatus(ids) {
 | 
				
			||||||
 | 
					  if (!Array.isArray(ids)) {
 | 
				
			||||||
 | 
					    ids = [ids];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    type: STATUS_REVEAL,
 | 
				
			||||||
 | 
					    ids,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,10 +19,11 @@ export default class ColumnHeader extends React.PureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
    intl: PropTypes.object.isRequired,
 | 
					    intl: PropTypes.object.isRequired,
 | 
				
			||||||
    title: PropTypes.node.isRequired,
 | 
					    title: PropTypes.node,
 | 
				
			||||||
    icon: PropTypes.string.isRequired,
 | 
					    icon: PropTypes.string,
 | 
				
			||||||
    active: PropTypes.bool,
 | 
					    active: PropTypes.bool,
 | 
				
			||||||
    multiColumn: PropTypes.bool,
 | 
					    multiColumn: PropTypes.bool,
 | 
				
			||||||
 | 
					    extraButton: PropTypes.node,
 | 
				
			||||||
    showBackButton: PropTypes.bool,
 | 
					    showBackButton: PropTypes.bool,
 | 
				
			||||||
    children: PropTypes.node,
 | 
					    children: PropTypes.node,
 | 
				
			||||||
    pinned: PropTypes.bool,
 | 
					    pinned: PropTypes.bool,
 | 
				
			||||||
| 
						 | 
					@ -63,7 +64,7 @@ export default class ColumnHeader extends React.PureComponent {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { title, icon, active, children, pinned, onPin, multiColumn, showBackButton, intl: { formatMessage } } = this.props;
 | 
					    const { title, icon, active, children, pinned, onPin, multiColumn, extraButton, showBackButton, intl: { formatMessage } } = this.props;
 | 
				
			||||||
    const { collapsed, animating } = this.state;
 | 
					    const { collapsed, animating } = this.state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const wrapperClassName = classNames('column-header__wrapper', {
 | 
					    const wrapperClassName = classNames('column-header__wrapper', {
 | 
				
			||||||
| 
						 | 
					@ -125,19 +126,26 @@ export default class ColumnHeader extends React.PureComponent {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (children || multiColumn) {
 | 
					    if (children || multiColumn) {
 | 
				
			||||||
      collapseButton = <button className={collapsibleButtonClassName} aria-label={formatMessage(collapsed ? messages.show : messages.hide)} aria-pressed={collapsed ? 'false' : 'true'} onClick={this.handleToggleClick}><i className='fa fa-sliders' /></button>;
 | 
					      collapseButton = <button className={collapsibleButtonClassName} title={formatMessage(collapsed ? messages.show : messages.hide)} aria-label={formatMessage(collapsed ? messages.show : messages.hide)} aria-pressed={collapsed ? 'false' : 'true'} onClick={this.handleToggleClick}><i className='fa fa-sliders' /></button>;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const hasTitle = icon && title;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div className={wrapperClassName}>
 | 
					      <div className={wrapperClassName}>
 | 
				
			||||||
        <h1 className={buttonClassName}>
 | 
					        <h1 className={buttonClassName}>
 | 
				
			||||||
 | 
					          {hasTitle && (
 | 
				
			||||||
            <button onClick={this.handleTitleClick}>
 | 
					            <button onClick={this.handleTitleClick}>
 | 
				
			||||||
              <i className={`fa fa-fw fa-${icon} column-header__icon`} />
 | 
					              <i className={`fa fa-fw fa-${icon} column-header__icon`} />
 | 
				
			||||||
              {title}
 | 
					              {title}
 | 
				
			||||||
            </button>
 | 
					            </button>
 | 
				
			||||||
 | 
					          )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          {!hasTitle && backButton}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <div className='column-header__buttons'>
 | 
					          <div className='column-header__buttons'>
 | 
				
			||||||
            {backButton}
 | 
					            {hasTitle && backButton}
 | 
				
			||||||
 | 
					            {extraButton}
 | 
				
			||||||
            {collapseButton}
 | 
					            {collapseButton}
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </h1>
 | 
					        </h1>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,16 +37,13 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
    onBlock: PropTypes.func,
 | 
					    onBlock: PropTypes.func,
 | 
				
			||||||
    onEmbed: PropTypes.func,
 | 
					    onEmbed: PropTypes.func,
 | 
				
			||||||
    onHeightChange: PropTypes.func,
 | 
					    onHeightChange: PropTypes.func,
 | 
				
			||||||
 | 
					    onToggleHidden: PropTypes.func,
 | 
				
			||||||
    muted: PropTypes.bool,
 | 
					    muted: PropTypes.bool,
 | 
				
			||||||
    hidden: PropTypes.bool,
 | 
					    hidden: PropTypes.bool,
 | 
				
			||||||
    onMoveUp: PropTypes.func,
 | 
					    onMoveUp: PropTypes.func,
 | 
				
			||||||
    onMoveDown: PropTypes.func,
 | 
					    onMoveDown: PropTypes.func,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  state = {
 | 
					 | 
				
			||||||
    isExpanded: false,
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Avoid checking props that are functions (and whose equality will always
 | 
					  // Avoid checking props that are functions (and whose equality will always
 | 
				
			||||||
  // evaluate to false. See react-immutable-pure-component for usage.
 | 
					  // evaluate to false. See react-immutable-pure-component for usage.
 | 
				
			||||||
  updateOnProps = [
 | 
					  updateOnProps = [
 | 
				
			||||||
| 
						 | 
					@ -56,8 +53,6 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
    'hidden',
 | 
					    'hidden',
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  updateOnStates = ['isExpanded']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  handleClick = () => {
 | 
					  handleClick = () => {
 | 
				
			||||||
    if (!this.context.router) {
 | 
					    if (!this.context.router) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
| 
						 | 
					@ -76,7 +71,7 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleExpandedToggle = () => {
 | 
					  handleExpandedToggle = () => {
 | 
				
			||||||
    this.setState({ isExpanded: !this.state.isExpanded });
 | 
					    this.props.onToggleHidden(this._properStatus());
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderLoadingMediaGallery () {
 | 
					  renderLoadingMediaGallery () {
 | 
				
			||||||
| 
						 | 
					@ -140,7 +135,6 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
    let statusAvatar, prepend;
 | 
					    let statusAvatar, prepend;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const { hidden, featured } = this.props;
 | 
					    const { hidden, featured } = this.props;
 | 
				
			||||||
    const { isExpanded } = this.state;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let { status, account, ...other } = this.props;
 | 
					    let { status, account, ...other } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +242,7 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
              </a>
 | 
					              </a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <StatusContent status={status} onClick={this.handleClick} expanded={isExpanded} onExpandedToggle={this.handleExpandedToggle} />
 | 
					            <StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            {media}
 | 
					            {media}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,13 @@ import {
 | 
				
			||||||
  unpin,
 | 
					  unpin,
 | 
				
			||||||
} from '../actions/interactions';
 | 
					} from '../actions/interactions';
 | 
				
			||||||
import { blockAccount } from '../actions/accounts';
 | 
					import { blockAccount } from '../actions/accounts';
 | 
				
			||||||
import { muteStatus, unmuteStatus, deleteStatus } from '../actions/statuses';
 | 
					import {
 | 
				
			||||||
 | 
					  muteStatus,
 | 
				
			||||||
 | 
					  unmuteStatus,
 | 
				
			||||||
 | 
					  deleteStatus,
 | 
				
			||||||
 | 
					  hideStatus,
 | 
				
			||||||
 | 
					  revealStatus,
 | 
				
			||||||
 | 
					} from '../actions/statuses';
 | 
				
			||||||
import { initMuteModal } from '../actions/mutes';
 | 
					import { initMuteModal } from '../actions/mutes';
 | 
				
			||||||
import { initReport } from '../actions/reports';
 | 
					import { initReport } from '../actions/reports';
 | 
				
			||||||
import { openModal } from '../actions/modal';
 | 
					import { openModal } from '../actions/modal';
 | 
				
			||||||
| 
						 | 
					@ -128,6 +134,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onToggleHidden (status) {
 | 
				
			||||||
 | 
					    if (status.get('hidden')) {
 | 
				
			||||||
 | 
					      dispatch(revealStatus(status.get('id')));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      dispatch(hideStatus(status.get('id')));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
 | 
					export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
 | 
				
			||||||
    status: ImmutablePropTypes.map.isRequired,
 | 
					    status: ImmutablePropTypes.map.isRequired,
 | 
				
			||||||
    onOpenMedia: PropTypes.func.isRequired,
 | 
					    onOpenMedia: PropTypes.func.isRequired,
 | 
				
			||||||
    onOpenVideo: PropTypes.func.isRequired,
 | 
					    onOpenVideo: PropTypes.func.isRequired,
 | 
				
			||||||
 | 
					    onToggleHidden: PropTypes.func.isRequired,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleAccountClick = (e) => {
 | 
					  handleAccountClick = (e) => {
 | 
				
			||||||
| 
						 | 
					@ -37,6 +38,10 @@ export default class DetailedStatus extends ImmutablePureComponent {
 | 
				
			||||||
    this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
 | 
					    this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleExpandedToggle = () => {
 | 
				
			||||||
 | 
					    this.props.onToggleHidden(this.props.status);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status;
 | 
					    const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,7 +110,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
 | 
				
			||||||
          <DisplayName account={status.get('account')} />
 | 
					          <DisplayName account={status.get('account')} />
 | 
				
			||||||
        </a>
 | 
					        </a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <StatusContent status={status} />
 | 
					        <StatusContent status={status} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {media}
 | 
					        {media}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,12 +21,19 @@ import {
 | 
				
			||||||
  mentionCompose,
 | 
					  mentionCompose,
 | 
				
			||||||
} from '../../actions/compose';
 | 
					} from '../../actions/compose';
 | 
				
			||||||
import { blockAccount } from '../../actions/accounts';
 | 
					import { blockAccount } from '../../actions/accounts';
 | 
				
			||||||
import { muteStatus, unmuteStatus, deleteStatus } from '../../actions/statuses';
 | 
					import {
 | 
				
			||||||
 | 
					  muteStatus,
 | 
				
			||||||
 | 
					  unmuteStatus,
 | 
				
			||||||
 | 
					  deleteStatus,
 | 
				
			||||||
 | 
					  hideStatus,
 | 
				
			||||||
 | 
					  revealStatus,
 | 
				
			||||||
 | 
					} from '../../actions/statuses';
 | 
				
			||||||
import { initMuteModal } from '../../actions/mutes';
 | 
					import { initMuteModal } from '../../actions/mutes';
 | 
				
			||||||
import { initReport } from '../../actions/reports';
 | 
					import { initReport } from '../../actions/reports';
 | 
				
			||||||
import { makeGetStatus } from '../../selectors';
 | 
					import { makeGetStatus } from '../../selectors';
 | 
				
			||||||
import { ScrollContainer } from 'react-router-scroll-4';
 | 
					import { ScrollContainer } from 'react-router-scroll-4';
 | 
				
			||||||
import ColumnBackButton from '../../components/column_back_button';
 | 
					import ColumnBackButton from '../../components/column_back_button';
 | 
				
			||||||
 | 
					import ColumnHeader from '../../components/column_header';
 | 
				
			||||||
import StatusContainer from '../../containers/status_container';
 | 
					import StatusContainer from '../../containers/status_container';
 | 
				
			||||||
import { openModal } from '../../actions/modal';
 | 
					import { openModal } from '../../actions/modal';
 | 
				
			||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 | 
					import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 | 
				
			||||||
| 
						 | 
					@ -39,6 +46,8 @@ const messages = defineMessages({
 | 
				
			||||||
  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
 | 
					  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
 | 
				
			||||||
  deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
 | 
					  deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
 | 
				
			||||||
  blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
 | 
					  blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
 | 
				
			||||||
 | 
					  revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
 | 
				
			||||||
 | 
					  hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const makeMapStateToProps = () => {
 | 
					const makeMapStateToProps = () => {
 | 
				
			||||||
| 
						 | 
					@ -163,6 +172,25 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleToggleHidden = (status) => {
 | 
				
			||||||
 | 
					    if (status.get('hidden')) {
 | 
				
			||||||
 | 
					      this.props.dispatch(revealStatus(status.get('id')));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this.props.dispatch(hideStatus(status.get('id')));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleToggleAll = () => {
 | 
				
			||||||
 | 
					    const { status, ancestorsIds, descendantsIds } = this.props;
 | 
				
			||||||
 | 
					    const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (status.get('hidden')) {
 | 
				
			||||||
 | 
					      this.props.dispatch(revealStatus(statusIds));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this.props.dispatch(hideStatus(statusIds));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleBlockClick = (account) => {
 | 
					  handleBlockClick = (account) => {
 | 
				
			||||||
    const { dispatch, intl } = this.props;
 | 
					    const { dispatch, intl } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -293,7 +321,7 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    let ancestors, descendants;
 | 
					    let ancestors, descendants;
 | 
				
			||||||
    const { status, ancestorsIds, descendantsIds } = this.props;
 | 
					    const { status, ancestorsIds, descendantsIds, intl } = this.props;
 | 
				
			||||||
    const { fullscreen } = this.state;
 | 
					    const { fullscreen } = this.state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (status === null) {
 | 
					    if (status === null) {
 | 
				
			||||||
| 
						 | 
					@ -325,7 +353,12 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Column>
 | 
					      <Column>
 | 
				
			||||||
        <ColumnBackButton />
 | 
					        <ColumnHeader
 | 
				
			||||||
 | 
					          showBackButton
 | 
				
			||||||
 | 
					          extraButton={(
 | 
				
			||||||
 | 
					            <button className='column-header__button' title={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll} aria-pressed={status.get('hidden') ? 'false' : 'true'}><i className={`fa fa-${status.get('hidden') ? 'eye-slash' : 'eye'}`} /></button>
 | 
				
			||||||
 | 
					          )}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <ScrollContainer scrollKey='thread'>
 | 
					        <ScrollContainer scrollKey='thread'>
 | 
				
			||||||
          <div className={classNames('scrollable', 'detailed-status__wrapper', { fullscreen })} ref={this.setRef}>
 | 
					          <div className={classNames('scrollable', 'detailed-status__wrapper', { fullscreen })} ref={this.setRef}>
 | 
				
			||||||
| 
						 | 
					@ -337,6 +370,7 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
                  status={status}
 | 
					                  status={status}
 | 
				
			||||||
                  onOpenVideo={this.handleOpenVideo}
 | 
					                  onOpenVideo={this.handleOpenVideo}
 | 
				
			||||||
                  onOpenMedia={this.handleOpenMedia}
 | 
					                  onOpenMedia={this.handleOpenMedia}
 | 
				
			||||||
 | 
					                  onToggleHidden={this.handleToggleHidden}
 | 
				
			||||||
                />
 | 
					                />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <ActionBar
 | 
					                <ActionBar
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,8 @@ import {
 | 
				
			||||||
  CONTEXT_FETCH_SUCCESS,
 | 
					  CONTEXT_FETCH_SUCCESS,
 | 
				
			||||||
  STATUS_MUTE_SUCCESS,
 | 
					  STATUS_MUTE_SUCCESS,
 | 
				
			||||||
  STATUS_UNMUTE_SUCCESS,
 | 
					  STATUS_UNMUTE_SUCCESS,
 | 
				
			||||||
 | 
					  STATUS_REVEAL,
 | 
				
			||||||
 | 
					  STATUS_HIDE,
 | 
				
			||||||
} from '../actions/statuses';
 | 
					} from '../actions/statuses';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  TIMELINE_REFRESH_SUCCESS,
 | 
					  TIMELINE_REFRESH_SUCCESS,
 | 
				
			||||||
| 
						 | 
					@ -64,6 +66,7 @@ const normalizeStatus = (state, status) => {
 | 
				
			||||||
  normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 | 
					  normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 | 
				
			||||||
  normalStatus.contentHtml  = emojify(normalStatus.content, emojiMap);
 | 
					  normalStatus.contentHtml  = emojify(normalStatus.content, emojiMap);
 | 
				
			||||||
  normalStatus.spoilerHtml  = emojify(escapeTextContentForBrowser(normalStatus.spoiler_text || ''), emojiMap);
 | 
					  normalStatus.spoilerHtml  = emojify(escapeTextContentForBrowser(normalStatus.spoiler_text || ''), emojiMap);
 | 
				
			||||||
 | 
					  normalStatus.hidden       = normalStatus.sensitive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return state.update(status.id, ImmutableMap(), map => map.mergeDeep(fromJS(normalStatus)));
 | 
					  return state.update(status.id, ImmutableMap(), map => map.mergeDeep(fromJS(normalStatus)));
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -111,6 +114,14 @@ export default function statuses(state = initialState, action) {
 | 
				
			||||||
    return state.setIn([action.id, 'muted'], true);
 | 
					    return state.setIn([action.id, 'muted'], true);
 | 
				
			||||||
  case STATUS_UNMUTE_SUCCESS:
 | 
					  case STATUS_UNMUTE_SUCCESS:
 | 
				
			||||||
    return state.setIn([action.id, 'muted'], false);
 | 
					    return state.setIn([action.id, 'muted'], false);
 | 
				
			||||||
 | 
					  case STATUS_REVEAL:
 | 
				
			||||||
 | 
					    return state.withMutations(map => {
 | 
				
			||||||
 | 
					      action.ids.forEach(id => map.setIn([id, 'hidden'], false));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  case STATUS_HIDE:
 | 
				
			||||||
 | 
					    return state.withMutations(map => {
 | 
				
			||||||
 | 
					      action.ids.forEach(id => map.setIn([id, 'hidden'], true));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  case TIMELINE_REFRESH_SUCCESS:
 | 
					  case TIMELINE_REFRESH_SUCCESS:
 | 
				
			||||||
  case TIMELINE_EXPAND_SUCCESS:
 | 
					  case TIMELINE_EXPAND_SUCCESS:
 | 
				
			||||||
  case CONTEXT_FETCH_SUCCESS:
 | 
					  case CONTEXT_FETCH_SUCCESS:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2515,6 +2515,10 @@ a.status-card {
 | 
				
			||||||
    flex: 1;
 | 
					    flex: 1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  & > .column-header__back-button {
 | 
				
			||||||
 | 
					    color: $ui-highlight-color;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  &.active {
 | 
					  &.active {
 | 
				
			||||||
    box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);
 | 
					    box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue