Fix unnecessary re-rendering of various components when typing in web UI (#15286)
This commit is contained in:
		
							parent
							
								
									48bef17cc9
								
							
						
					
					
						commit
						9620ee90be
					
				
					 6 changed files with 43 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -41,7 +41,10 @@ class DetailedStatus extends ImmutablePureComponent {
 | 
			
		|||
    domain: PropTypes.string.isRequired,
 | 
			
		||||
    compact: PropTypes.bool,
 | 
			
		||||
    showMedia: PropTypes.bool,
 | 
			
		||||
    usingPiP: PropTypes.bool,
 | 
			
		||||
    pictureInPicture: ImmutablePropTypes.contains({
 | 
			
		||||
      inUse: PropTypes.bool,
 | 
			
		||||
      available: PropTypes.bool,
 | 
			
		||||
    }),
 | 
			
		||||
    onToggleMediaVisibility: PropTypes.func,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +105,7 @@ class DetailedStatus extends ImmutablePureComponent {
 | 
			
		|||
  render () {
 | 
			
		||||
    const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
 | 
			
		||||
    const outerStyle = { boxSizing: 'border-box' };
 | 
			
		||||
    const { intl, compact, usingPiP } = this.props;
 | 
			
		||||
    const { intl, compact, pictureInPicture } = this.props;
 | 
			
		||||
 | 
			
		||||
    if (!status) {
 | 
			
		||||
      return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +121,7 @@ class DetailedStatus extends ImmutablePureComponent {
 | 
			
		|||
      outerStyle.height = `${this.state.height}px`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (usingPiP) {
 | 
			
		||||
    if (pictureInPicture.get('inUse')) {
 | 
			
		||||
      media = <PictureInPicturePlaceholder />;
 | 
			
		||||
    } else if (status.get('media_attachments').size > 0) {
 | 
			
		||||
      if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ import {
 | 
			
		|||
import { initMuteModal } from '../../actions/mutes';
 | 
			
		||||
import { initBlockModal } from '../../actions/blocks';
 | 
			
		||||
import { initReport } from '../../actions/reports';
 | 
			
		||||
import { makeGetStatus } from '../../selectors';
 | 
			
		||||
import { makeGetStatus, makeGetPictureInPicture } from '../../selectors';
 | 
			
		||||
import { ScrollContainer } from 'react-router-scroll-4';
 | 
			
		||||
import ColumnBackButton from '../../components/column_back_button';
 | 
			
		||||
import ColumnHeader from '../../components/column_header';
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +72,7 @@ const messages = defineMessages({
 | 
			
		|||
 | 
			
		||||
const makeMapStateToProps = () => {
 | 
			
		||||
  const getStatus = makeGetStatus();
 | 
			
		||||
  const getPictureInPicture = makeGetPictureInPicture();
 | 
			
		||||
 | 
			
		||||
  const getAncestorsIds = createSelector([
 | 
			
		||||
    (_, { id }) => id,
 | 
			
		||||
| 
						 | 
				
			
			@ -129,11 +130,12 @@ const makeMapStateToProps = () => {
 | 
			
		|||
 | 
			
		||||
  const mapStateToProps = (state, props) => {
 | 
			
		||||
    const status = getStatus(state, { id: props.params.statusId });
 | 
			
		||||
    let ancestorsIds = Immutable.List();
 | 
			
		||||
 | 
			
		||||
    let ancestorsIds   = Immutable.List();
 | 
			
		||||
    let descendantsIds = Immutable.List();
 | 
			
		||||
 | 
			
		||||
    if (status) {
 | 
			
		||||
      ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
 | 
			
		||||
      ancestorsIds   = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
 | 
			
		||||
      descendantsIds = getDescendantsIds(state, { id: status.get('id') });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -143,7 +145,7 @@ const makeMapStateToProps = () => {
 | 
			
		|||
      descendantsIds,
 | 
			
		||||
      askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,
 | 
			
		||||
      domain: state.getIn(['meta', 'domain']),
 | 
			
		||||
      usingPiP: state.get('picture_in_picture').statusId === props.params.statusId,
 | 
			
		||||
      pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }),
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +170,10 @@ class Status extends ImmutablePureComponent {
 | 
			
		|||
    askReplyConfirmation: PropTypes.bool,
 | 
			
		||||
    multiColumn: PropTypes.bool,
 | 
			
		||||
    domain: PropTypes.string.isRequired,
 | 
			
		||||
    usingPiP: PropTypes.bool,
 | 
			
		||||
    pictureInPicture: ImmutablePropTypes.contains({
 | 
			
		||||
      inUse: PropTypes.bool,
 | 
			
		||||
      available: PropTypes.bool,
 | 
			
		||||
    }),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  state = {
 | 
			
		||||
| 
						 | 
				
			
			@ -492,7 +497,7 @@ class Status extends ImmutablePureComponent {
 | 
			
		|||
 | 
			
		||||
  render () {
 | 
			
		||||
    let ancestors, descendants;
 | 
			
		||||
    const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, usingPiP } = this.props;
 | 
			
		||||
    const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props;
 | 
			
		||||
    const { fullscreen } = this.state;
 | 
			
		||||
 | 
			
		||||
    if (status === null) {
 | 
			
		||||
| 
						 | 
				
			
			@ -550,7 +555,7 @@ class Status extends ImmutablePureComponent {
 | 
			
		|||
                  domain={domain}
 | 
			
		||||
                  showMedia={this.state.showMedia}
 | 
			
		||||
                  onToggleMediaVisibility={this.handleToggleMediaVisibility}
 | 
			
		||||
                  usingPiP={usingPiP}
 | 
			
		||||
                  pictureInPicture={pictureInPicture}
 | 
			
		||||
                />
 | 
			
		||||
 | 
			
		||||
                <ActionBar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue