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
					
				|  | @ -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…
	
		Reference in New Issue