Fix compose form behavior in mobile view (#15555)
* Fix ComposeForm being mounted twice in mobile view Fixes #13094 * Fix compose form focus and pre-selection behavior in mobile view * Split _updateFocusAndSelection out of componentDidUpdate
This commit is contained in:
		
							parent
							
								
									49814d5799
								
							
						
					
					
						commit
						034f37b85a
					
				
					 2 changed files with 27 additions and 2 deletions
				
			
		| 
						 | 
					@ -132,7 +132,15 @@ class ComposeForm extends ImmutablePureComponent {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  componentDidMount () {
 | 
				
			||||||
 | 
					    this._updateFocusAndSelection({ });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentDidUpdate (prevProps) {
 | 
					  componentDidUpdate (prevProps) {
 | 
				
			||||||
 | 
					    this._updateFocusAndSelection(prevProps);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _updateFocusAndSelection = (prevProps) => {
 | 
				
			||||||
    // This statement does several things:
 | 
					    // This statement does several things:
 | 
				
			||||||
    // - If we're beginning a reply, and,
 | 
					    // - If we're beginning a reply, and,
 | 
				
			||||||
    //     - Replying to zero or one users, places the cursor at the end of the textbox.
 | 
					    //     - Replying to zero or one users, places the cursor at the end of the textbox.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,8 +70,12 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
    children: PropTypes.node,
 | 
					    children: PropTypes.node,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   // Corresponds to (max-width: 600px + (285px * 1) + (10px * 1)) in SCSS
 | 
				
			||||||
 | 
					   mediaQuery = 'matchMedia' in window && window.matchMedia('(max-width: 895px)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  state = {
 | 
					  state = {
 | 
				
			||||||
    shouldAnimate: false,
 | 
					    shouldAnimate: false,
 | 
				
			||||||
 | 
					    renderComposePanel: !(this.mediaQuery && this.mediaQuery.matches),
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentWillReceiveProps() {
 | 
					  componentWillReceiveProps() {
 | 
				
			||||||
| 
						 | 
					@ -85,6 +89,11 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
 | 
					      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.mediaQuery) {
 | 
				
			||||||
 | 
					      this.mediaQuery.addEventListener('change', this.handleLayoutChange);
 | 
				
			||||||
 | 
					      this.setState({ renderComposePanel: !this.mediaQuery.matches });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.lastIndex   = getIndex(this.context.router.history.location.pathname);
 | 
					    this.lastIndex   = getIndex(this.context.router.history.location.pathname);
 | 
				
			||||||
    this.isRtlLayout = document.getElementsByTagName('body')[0].classList.contains('rtl');
 | 
					    this.isRtlLayout = document.getElementsByTagName('body')[0].classList.contains('rtl');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,6 +123,10 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
    if (!this.props.singleColumn) {
 | 
					    if (!this.props.singleColumn) {
 | 
				
			||||||
      this.node.removeEventListener('wheel', this.handleWheel);
 | 
					      this.node.removeEventListener('wheel', this.handleWheel);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.mediaQuery) {
 | 
				
			||||||
 | 
					      this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleChildrenContentChange() {
 | 
					  handleChildrenContentChange() {
 | 
				
			||||||
| 
						 | 
					@ -123,6 +136,10 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleLayoutChange = (e) => {
 | 
				
			||||||
 | 
					    this.setState({ renderComposePanel: !e.matches });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleSwipe = (index) => {
 | 
					  handleSwipe = (index) => {
 | 
				
			||||||
    this.pendingIndex = index;
 | 
					    this.pendingIndex = index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,7 +203,7 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { columns, children, singleColumn, isModalOpen, intl } = this.props;
 | 
					    const { columns, children, singleColumn, isModalOpen, intl } = this.props;
 | 
				
			||||||
    const { shouldAnimate } = this.state;
 | 
					    const { shouldAnimate, renderComposePanel } = this.state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const columnIndex = getIndex(this.context.router.history.location.pathname);
 | 
					    const columnIndex = getIndex(this.context.router.history.location.pathname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -205,7 +222,7 @@ class ColumnsArea extends ImmutablePureComponent {
 | 
				
			||||||
        <div className='columns-area__panels'>
 | 
					        <div className='columns-area__panels'>
 | 
				
			||||||
          <div className='columns-area__panels__pane columns-area__panels__pane--compositional'>
 | 
					          <div className='columns-area__panels__pane columns-area__panels__pane--compositional'>
 | 
				
			||||||
            <div className='columns-area__panels__pane__inner'>
 | 
					            <div className='columns-area__panels__pane__inner'>
 | 
				
			||||||
              <ComposePanel />
 | 
					              {renderComposePanel && <ComposePanel />}
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue