Fix local streaming of hashtag timelines (#13827)
This commit is contained in:
		
							parent
							
								
									f867444d80
								
							
						
					
					
						commit
						8dd03cf8f2
					
				
					 3 changed files with 10 additions and 10 deletions
				
			
		|  | @ -74,6 +74,6 @@ const refreshHomeTimelineAndNotification = (dispatch, done) => { | ||||||
| export const connectUserStream      = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification); | export const connectUserStream      = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification); | ||||||
| export const connectCommunityStream = ({ onlyMedia } = {}) => connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`); | export const connectCommunityStream = ({ onlyMedia } = {}) => connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`); | ||||||
| export const connectPublicStream    = ({ onlyMedia, onlyRemote } = {}) => connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`); | export const connectPublicStream    = ({ onlyMedia, onlyRemote } = {}) => connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`); | ||||||
| export const connectHashtagStream   = (id, tag, accept) => connectTimelineStream(`hashtag:${id}`, `hashtag&tag=${tag}`, null, accept); | export const connectHashtagStream   = (id, tag, local, accept) => connectTimelineStream(`hashtag:${id}${local ? ':local' : ''}`, `hashtag${local ? ':local' : ''}&tag=${tag}`, null, accept); | ||||||
| export const connectDirectStream    = () => connectTimelineStream('direct', 'direct'); | export const connectDirectStream    = () => connectTimelineStream('direct', 'direct'); | ||||||
| export const connectListStream      = id => connectTimelineStream(`list:${id}`, `list&list=${id}`); | export const connectListStream      = id => connectTimelineStream(`list:${id}`, `list&list=${id}`); | ||||||
|  |  | ||||||
|  | @ -114,7 +114,7 @@ export const expandAccountFeaturedTimeline = accountId => expandTimeline(`accoun | ||||||
| export const expandAccountMediaTimeline    = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); | export const expandAccountMediaTimeline    = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); | ||||||
| export const expandListTimeline            = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); | export const expandListTimeline            = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); | ||||||
| export const expandHashtagTimeline         = (hashtag, { maxId, tags, local } = {}, done = noOp) => { | export const expandHashtagTimeline         = (hashtag, { maxId, tags, local } = {}, done = noOp) => { | ||||||
|   return expandTimeline(`hashtag:${hashtag}`, `/api/v1/timelines/tag/${hashtag}`, { |   return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { | ||||||
|     max_id: maxId, |     max_id: maxId, | ||||||
|     any:    parseTags(tags, 'any'), |     any:    parseTags(tags, 'any'), | ||||||
|     all:    parseTags(tags, 'all'), |     all:    parseTags(tags, 'all'), | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ import { connectHashtagStream } from '../../actions/streaming'; | ||||||
| import { isEqual } from 'lodash'; | import { isEqual } from 'lodash'; | ||||||
| 
 | 
 | ||||||
| const mapStateToProps = (state, props) => ({ | const mapStateToProps = (state, props) => ({ | ||||||
|   hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0, |   hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}${props.params.local ? ':local' : ''}`, 'unread']) > 0, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| export default @connect(mapStateToProps) | export default @connect(mapStateToProps) | ||||||
|  | @ -76,13 +76,13 @@ class HashtagTimeline extends React.PureComponent { | ||||||
|     this.column.scrollTop(); |     this.column.scrollTop(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   _subscribe (dispatch, id, tags = {}) { |   _subscribe (dispatch, id, tags = {}, local) { | ||||||
|     let any  = (tags.any || []).map(tag => tag.value); |     let any  = (tags.any || []).map(tag => tag.value); | ||||||
|     let all  = (tags.all || []).map(tag => tag.value); |     let all  = (tags.all || []).map(tag => tag.value); | ||||||
|     let none = (tags.none || []).map(tag => tag.value); |     let none = (tags.none || []).map(tag => tag.value); | ||||||
| 
 | 
 | ||||||
|     [id, ...any].map(tag => { |     [id, ...any].map(tag => { | ||||||
|       this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => { |       this.disconnects.push(dispatch(connectHashtagStream(id, tag, local, status => { | ||||||
|         let tags = status.tags.map(tag => tag.name); |         let tags = status.tags.map(tag => tag.name); | ||||||
| 
 | 
 | ||||||
|         return all.filter(tag => tags.includes(tag)).length === all.length && |         return all.filter(tag => tags.includes(tag)).length === all.length && | ||||||
|  | @ -100,7 +100,7 @@ class HashtagTimeline extends React.PureComponent { | ||||||
|     const { dispatch } = this.props; |     const { dispatch } = this.props; | ||||||
|     const { id, tags, local } = this.props.params; |     const { id, tags, local } = this.props.params; | ||||||
| 
 | 
 | ||||||
|     this._subscribe(dispatch, id, tags); |     this._subscribe(dispatch, id, tags, local); | ||||||
|     dispatch(expandHashtagTimeline(id, { tags, local })); |     dispatch(expandHashtagTimeline(id, { tags, local })); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -110,8 +110,8 @@ class HashtagTimeline extends React.PureComponent { | ||||||
| 
 | 
 | ||||||
|     if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) { |     if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) { | ||||||
|       this._unsubscribe(); |       this._unsubscribe(); | ||||||
|       this._subscribe(dispatch, id, tags); |       this._subscribe(dispatch, id, tags, local); | ||||||
|       dispatch(clearTimeline(`hashtag:${id}`)); |       dispatch(clearTimeline(`hashtag:${id}${local ? ':local' : ''}`)); | ||||||
|       dispatch(expandHashtagTimeline(id, { tags, local })); |       dispatch(expandHashtagTimeline(id, { tags, local })); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | @ -131,7 +131,7 @@ class HashtagTimeline extends React.PureComponent { | ||||||
| 
 | 
 | ||||||
|   render () { |   render () { | ||||||
|     const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props; |     const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props; | ||||||
|     const { id } = this.props.params; |     const { id, local } = this.props.params; | ||||||
|     const pinned = !!columnId; |     const pinned = !!columnId; | ||||||
| 
 | 
 | ||||||
|     return ( |     return ( | ||||||
|  | @ -153,7 +153,7 @@ class HashtagTimeline extends React.PureComponent { | ||||||
|         <StatusListContainer |         <StatusListContainer | ||||||
|           trackScroll={!pinned} |           trackScroll={!pinned} | ||||||
|           scrollKey={`hashtag_timeline-${columnId}`} |           scrollKey={`hashtag_timeline-${columnId}`} | ||||||
|           timelineId={`hashtag:${id}`} |           timelineId={`hashtag:${id}${local ? ':local' : ''}`} | ||||||
|           onLoadMore={this.handleLoadMore} |           onLoadMore={this.handleLoadMore} | ||||||
|           emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />} |           emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />} | ||||||
|           shouldUpdateScroll={shouldUpdateScroll} |           shouldUpdateScroll={shouldUpdateScroll} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue