Inline spoiler input
This commit is contained in:
		
							parent
							
								
									3529f6f4ae
								
							
						
					
					
						commit
						2021f14e8f
					
				
					 2 changed files with 38 additions and 120 deletions
				
			
		|  | @ -7,7 +7,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; | |||
| //  Components.
 | ||||
| import ComposerOptions from '../../composer/options'; | ||||
| import ComposerPublisher from '../../composer/publisher'; | ||||
| import ComposerSpoiler from '../../composer/spoiler'; | ||||
| import ComposerTextarea from '../../composer/textarea'; | ||||
| import ComposerUploadForm from '../../composer/upload_form'; | ||||
| import ComposerPollForm from '../../composer/poll_form'; | ||||
|  | @ -23,6 +22,7 @@ const messages = defineMessages({ | |||
|                                 defaultMessage: 'At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.' }, | ||||
|   missingDescriptionConfirm: {  id: 'confirmations.missing_media_description.confirm', | ||||
|                                 defaultMessage: 'Send anyway' }, | ||||
|   spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' }, | ||||
| }); | ||||
| 
 | ||||
| export default @injectIntl | ||||
|  | @ -124,6 +124,25 @@ class ComposeForm extends ImmutablePureComponent { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   handleKeyDown = ({ ctrlKey, keyCode, metaKey, altKey }) => { | ||||
|     //  We submit the status on control/meta + enter.
 | ||||
|     if (keyCode === 13 && (ctrlKey || metaKey)) { | ||||
|       handleSubmit(); | ||||
|     } | ||||
| 
 | ||||
|     // Submit the status with secondary visibility on alt + enter.
 | ||||
|     if (keyCode === 13 && altKey) { | ||||
|       handleSecondarySubmit(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //  When the escape key is released, we focus the UI.
 | ||||
|   handleKeyUp = ({ key }) => { | ||||
|     if (key === 'Escape') { | ||||
|       document.querySelector('.ui').parentElement.focus(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //  Submits the status.
 | ||||
|   handleSubmit = () => { | ||||
|     const { textarea: { value }, uploadForm } = this; | ||||
|  | @ -181,7 +200,7 @@ class ComposeForm extends ImmutablePureComponent { | |||
|   //  Sets a reference to the CW field.
 | ||||
|   handleRefSpoilerText = (spoilerComponent) => { | ||||
|     if (spoilerComponent) { | ||||
|       this.spoilerText = spoilerComponent.spoilerText; | ||||
|       this.spoilerText = spoilerComponent; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | @ -260,14 +279,12 @@ class ComposeForm extends ImmutablePureComponent { | |||
| 
 | ||||
|   render () { | ||||
|     const { | ||||
|       handleChangeSpoiler, | ||||
|       handleEmoji, | ||||
|       handleSecondarySubmit, | ||||
|       handleSelect, | ||||
|       handleSubmit, | ||||
|       handleRefUploadForm, | ||||
|       handleRefTextarea, | ||||
|       handleRefSpoilerText, | ||||
|     } = this; | ||||
|     const { | ||||
|       acceptContentTypes, | ||||
|  | @ -317,15 +334,23 @@ class ComposeForm extends ImmutablePureComponent { | |||
| 
 | ||||
|         <ReplyIndicatorContainer /> | ||||
| 
 | ||||
|         <ComposerSpoiler | ||||
|           hidden={!spoiler} | ||||
|           intl={intl} | ||||
|           onChange={handleChangeSpoiler} | ||||
|           onSubmit={handleSubmit} | ||||
|           onSecondarySubmit={handleSecondarySubmit} | ||||
|           text={spoilerText} | ||||
|           ref={handleRefSpoilerText} | ||||
|         /> | ||||
|         <div className={`composer--spoiler ${spoiler ? 'composer--spoiler--visible' : ''}`}> | ||||
|           <label> | ||||
|             <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span> | ||||
|             <input | ||||
|               id='glitch.composer.spoiler.input' | ||||
|               placeholder={intl.formatMessage(messages.spoiler_placeholder)} | ||||
|               value={spoilerText} | ||||
|               onChange={this.handleChangeSpoiler} | ||||
|               onKeyDown={this.handleKeyDown} | ||||
|               onKeyUp={this.handleKeyUp} | ||||
|               disabled={!spoiler} | ||||
|               type='text' | ||||
|               className='spoiler-input__input' | ||||
|               ref={this.handleRefSpoilerText} | ||||
|             /> | ||||
|           </label> | ||||
|         </div> | ||||
| 
 | ||||
|         <ComposerTextarea | ||||
|           advancedOptions={advancedOptions} | ||||
|  |  | |||
|  | @ -1,107 +0,0 @@ | |||
| //  Package imports.
 | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { defineMessages, FormattedMessage } from 'react-intl'; | ||||
| 
 | ||||
| //  Utils.
 | ||||
| import { | ||||
|   assignHandlers, | ||||
|   hiddenComponent, | ||||
| } from 'flavours/glitch/util/react_helpers'; | ||||
| 
 | ||||
| //  Messages.
 | ||||
| const messages = defineMessages({ | ||||
|   placeholder: { | ||||
|     defaultMessage: 'Write your warning here', | ||||
|     id: 'compose_form.spoiler_placeholder', | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| //  Handlers.
 | ||||
| const handlers = { | ||||
| 
 | ||||
|   //  Handles a keypress.
 | ||||
|   handleKeyDown ({ | ||||
|     ctrlKey, | ||||
|     keyCode, | ||||
|     metaKey, | ||||
|     altKey, | ||||
|   }) { | ||||
|     const { onSubmit, onSecondarySubmit } = this.props; | ||||
| 
 | ||||
|     //  We submit the status on control/meta + enter.
 | ||||
|     if (onSubmit && keyCode === 13 && (ctrlKey || metaKey)) { | ||||
|       onSubmit(); | ||||
|     } | ||||
| 
 | ||||
|     // Submit the status with secondary visibility on alt + enter.
 | ||||
|     if (onSecondarySubmit && keyCode === 13 && altKey) { | ||||
|       onSecondarySubmit(); | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   handleRefSpoilerText (spoilerText) { | ||||
|     this.spoilerText = spoilerText; | ||||
|   }, | ||||
| 
 | ||||
|   //  When the escape key is released, we focus the UI.
 | ||||
|   handleKeyUp ({ key }) { | ||||
|     if (key === 'Escape') { | ||||
|       document.querySelector('.ui').parentElement.focus(); | ||||
|     } | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
| //  The component.
 | ||||
| export default class ComposerSpoiler extends React.PureComponent { | ||||
| 
 | ||||
|   //  Constructor.
 | ||||
|   constructor (props) { | ||||
|     super(props); | ||||
|     assignHandlers(this, handlers); | ||||
|   } | ||||
| 
 | ||||
|   //  Rendering.
 | ||||
|   render () { | ||||
|     const { handleKeyDown, handleKeyUp, handleRefSpoilerText } = this.handlers; | ||||
|     const { | ||||
|       hidden, | ||||
|       intl, | ||||
|       onChange, | ||||
|       text, | ||||
|     } = this.props; | ||||
| 
 | ||||
|     //  The result.
 | ||||
|     return ( | ||||
|       <div className={`composer--spoiler ${hidden ? '' : 'composer--spoiler--visible'}`}> | ||||
|         <label> | ||||
|           <span {...hiddenComponent}> | ||||
|             <FormattedMessage {...messages.placeholder} /> | ||||
|           </span> | ||||
|           <input | ||||
|             id='glitch.composer.spoiler.input' | ||||
|             onChange={onChange} | ||||
|             onKeyDown={handleKeyDown} | ||||
|             onKeyUp={handleKeyUp} | ||||
|             placeholder={intl.formatMessage(messages.placeholder)} | ||||
|             type='text' | ||||
|             value={text} | ||||
|             ref={handleRefSpoilerText} | ||||
|             disabled={hidden} | ||||
|           /> | ||||
|         </label> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| //  Props.
 | ||||
| ComposerSpoiler.propTypes = { | ||||
|   hidden: PropTypes.bool, | ||||
|   intl: PropTypes.object.isRequired, | ||||
|   onChange: PropTypes.func, | ||||
|   onSubmit: PropTypes.func, | ||||
|   onSecondarySubmit: PropTypes.func, | ||||
|   text: PropTypes.string, | ||||
| }; | ||||
		Loading…
	
		Reference in a new issue