API returns mentions for statuses, compose form pre-fills all relevant usernames into the form when replying
This commit is contained in:
		
							parent
							
								
									94525b596a
								
							
						
					
					
						commit
						bc98865c1a
					
				| @ -32,6 +32,12 @@ const ComposeForm = React.createClass({ | ||||
|     this.props.onSubmit(); | ||||
|   }, | ||||
| 
 | ||||
|   componentDidUpdate (prevProps) { | ||||
|     if (prevProps.text !== this.props.text || prevProps.in_reply_to !== this.props.in_reply_to) { | ||||
|       this.refs.textarea.focus(); | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     let replyArea = ''; | ||||
| 
 | ||||
| @ -43,7 +49,7 @@ const ComposeForm = React.createClass({ | ||||
|       <div style={{ padding: '10px' }}> | ||||
|         {replyArea} | ||||
| 
 | ||||
|         <textarea disabled={this.props.is_submitting} placeholder='What is on your mind?' value={this.props.text} onKeyUp={this.handleKeyUp} onChange={this.handleChange} className='compose-form__textarea' style={{ display: 'block', boxSizing: 'border-box', width: '100%', height: '100px', resize: 'none', border: 'none', color: '#282c37', padding: '10px', fontFamily: 'Roboto', fontSize: '14px', margin: '0' }} /> | ||||
|         <textarea ref='textarea' disabled={this.props.is_submitting} placeholder='What is on your mind?' value={this.props.text} onKeyUp={this.handleKeyUp} onChange={this.handleChange} className='compose-form__textarea' style={{ display: 'block', boxSizing: 'border-box', width: '100%', height: '100px', resize: 'none', border: 'none', color: '#282c37', padding: '10px', fontFamily: 'Roboto', fontSize: '14px', margin: '0' }} /> | ||||
| 
 | ||||
|         <div style={{ marginTop: '10px', overflow: 'hidden' }}> | ||||
|           <div style={{ float: 'right' }}><Button text='Publish' onClick={this.handleSubmit} disabled={this.props.is_submitting} /></div> | ||||
|  | ||||
| @ -1,25 +1,13 @@ | ||||
| import { connect }                                          from 'react-redux'; | ||||
| import ComposeForm                                          from '../components/compose_form'; | ||||
| import { changeCompose, submitCompose, cancelReplyCompose } from '../../../actions/compose'; | ||||
| 
 | ||||
| function selectStatus(state) { | ||||
|   let statusId = state.getIn(['compose', 'in_reply_to'], null); | ||||
| 
 | ||||
|   if (statusId === null) { | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   let status = state.getIn(['timelines', 'statuses', statusId]); | ||||
|   status = status.set('account', state.getIn(['timelines', 'accounts', status.get('account')])); | ||||
| 
 | ||||
|   return status; | ||||
| }; | ||||
| import { selectStatus }                                     from '../../../reducers/timelines'; | ||||
| 
 | ||||
| const mapStateToProps = function (state, props) { | ||||
|   return { | ||||
|     text: state.getIn(['compose', 'text']), | ||||
|     is_submitting: state.getIn(['compose', 'is_submitting']), | ||||
|     in_reply_to: selectStatus(state) | ||||
|     in_reply_to: selectStatus(state, state.getIn(['compose', 'in_reply_to'])) | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -23,6 +23,10 @@ const initialState = Immutable.Map({ | ||||
|   media_attachments: Immutable.List([]) | ||||
| }); | ||||
| 
 | ||||
| function statusToTextMentions(status) { | ||||
|   return Immutable.OrderedSet([`@${status.getIn(['account', 'acct'])} `]).union(status.get('mentions').map(mention => `@${mention.get('acct')} `)).join(''); | ||||
| }; | ||||
| 
 | ||||
| export default function compose(state = initialState, action) { | ||||
|   switch(action.type) { | ||||
|     case COMPOSE_CHANGE: | ||||
| @ -30,7 +34,7 @@ export default function compose(state = initialState, action) { | ||||
|     case COMPOSE_REPLY: | ||||
|       return state.withMutations(map => { | ||||
|         map.set('in_reply_to', action.status.get('id')); | ||||
|         map.set('text', `@${action.status.getIn(['account', 'acct'])} `); | ||||
|         map.set('text', statusToTextMentions(action.status)); | ||||
|       }); | ||||
|     case COMPOSE_REPLY_CANCEL: | ||||
|       return state.withMutations(map => { | ||||
|  | ||||
| @ -23,3 +23,9 @@ child :media_attachments, object_root: false do | ||||
|   node(:url)         { |media| full_asset_url(media.file.url) } | ||||
|   node(:preview_url) { |media| full_asset_url(media.file.url(:small)) } | ||||
| end | ||||
| 
 | ||||
| child :mentions, object_root: false do | ||||
|   node(:url)  { |mention| TagManager.instance.url_for(mention.account) } | ||||
|   node(:acct) { |mention| mention.account.acct } | ||||
|   node(:id)   { |mention| mention.account_id } | ||||
| end | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user