Improve status reselect, do not display "load more" when no next link available
This commit is contained in:
		
							parent
							
								
									c77a54fe0a
								
							
						
					
					
						commit
						c96fd24f48
					
				
					 5 changed files with 39 additions and 76 deletions
				
			
		|  | @ -15,6 +15,7 @@ const StatusList = React.createClass({ | |||
|     trackScroll: React.PropTypes.bool, | ||||
|     isLoading: React.PropTypes.bool, | ||||
|     isUnread: React.PropTypes.bool, | ||||
|     hasMore: React.PropTypes.bool, | ||||
|     prepend: React.PropTypes.node, | ||||
|     emptyMessage: React.PropTypes.node | ||||
|   }, | ||||
|  | @ -73,13 +74,13 @@ const StatusList = React.createClass({ | |||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     const { statusIds, onScrollToBottom, trackScroll, isLoading, isUnread, prepend, emptyMessage } = this.props; | ||||
|     const { statusIds, onScrollToBottom, trackScroll, isLoading, isUnread, hasMore, prepend, emptyMessage } = this.props; | ||||
| 
 | ||||
|     let loadMore       = ''; | ||||
|     let scrollableArea = ''; | ||||
|     let unread         = ''; | ||||
| 
 | ||||
|     if (!isLoading && statusIds.size > 0) { | ||||
|     if (!isLoading && statusIds.size > 0 && hasMore) { | ||||
|       loadMore = <LoadMore onClick={this.handleLoadMore} />; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,45 +18,12 @@ import { openMedia } from '../actions/modal'; | |||
| import { createSelector } from 'reselect' | ||||
| import { isMobile } from '../is_mobile' | ||||
| 
 | ||||
| const mapStateToProps = (state, props) => ({ | ||||
|   statusBase: state.getIn(['statuses', props.id]), | ||||
|   me: state.getIn(['meta', 'me']) | ||||
| }); | ||||
| const makeMapStateToProps = () => { | ||||
|   const getStatus = makeGetStatus(); | ||||
| 
 | ||||
| const makeMapStateToPropsInner = () => { | ||||
|   const getStatus = (() => { | ||||
|     return createSelector( | ||||
|       [ | ||||
|         (_, base)     => base, | ||||
|         (state, base) => (base ? state.getIn(['accounts', base.get('account')]) : null), | ||||
|         (state, base) => (base ? state.getIn(['statuses', base.get('reblog')], null) : null) | ||||
|       ], | ||||
| 
 | ||||
|       (base, account, reblog) => (base ? base.set('account', account).set('reblog', reblog) : null) | ||||
|     ); | ||||
|   })(); | ||||
| 
 | ||||
|   const mapStateToProps = (state, { statusBase }) => ({ | ||||
|     status: getStatus(state, statusBase) | ||||
|   }); | ||||
| 
 | ||||
|   return mapStateToProps; | ||||
| }; | ||||
| 
 | ||||
| const makeMapStateToPropsLast = () => { | ||||
|   const getStatus = (() => { | ||||
|     return createSelector( | ||||
|       [ | ||||
|         (_, status)     => status, | ||||
|         (state, status) => (status ? state.getIn(['accounts', status.getIn(['reblog', 'account'])], null) : null) | ||||
|       ], | ||||
| 
 | ||||
|       (status, reblogAccount) => (status && status.get('reblog') ? status.setIn(['reblog', 'account'], reblogAccount) : status) | ||||
|     ); | ||||
|   })(); | ||||
| 
 | ||||
|   const mapStateToProps = (state, { status }) => ({ | ||||
|     status: getStatus(state, status) | ||||
|   const mapStateToProps = (state, props) => ({ | ||||
|     status: getStatus(state, props.id), | ||||
|     me: state.getIn(['meta', 'me']) | ||||
|   }); | ||||
| 
 | ||||
|   return mapStateToProps; | ||||
|  | @ -106,8 +73,4 @@ const mapDispatchToProps = (dispatch) => ({ | |||
| 
 | ||||
| }); | ||||
| 
 | ||||
| export default connect(mapStateToProps, mapDispatchToProps)( | ||||
|   connect(makeMapStateToPropsInner)( | ||||
|     connect(makeMapStateToPropsLast)(Status) | ||||
|   ) | ||||
| ); | ||||
| export default connect(makeMapStateToProps, mapDispatchToProps)(Status); | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import Immutable from 'immutable'; | |||
| const mapStateToProps = (state, props) => ({ | ||||
|   statusIds: state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'items'], Immutable.List()), | ||||
|   isLoading: state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'isLoading']), | ||||
|   hasMore: !!state.getIn(['timelines', 'accounts_timelines', Number(props.params.accountId), 'next']), | ||||
|   me: state.getIn(['meta', 'me']) | ||||
| }); | ||||
| 
 | ||||
|  | @ -26,6 +27,7 @@ const AccountTimeline = React.createClass({ | |||
|     dispatch: React.PropTypes.func.isRequired, | ||||
|     statusIds: ImmutablePropTypes.list, | ||||
|     isLoading: React.PropTypes.bool, | ||||
|     hasMore: React.PropTypes.bool, | ||||
|     me: React.PropTypes.number.isRequired | ||||
|   }, | ||||
| 
 | ||||
|  | @ -48,7 +50,7 @@ const AccountTimeline = React.createClass({ | |||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     const { statusIds, isLoading, me } = this.props; | ||||
|     const { statusIds, isLoading, hasMore, me } = this.props; | ||||
| 
 | ||||
|     if (!statusIds && isLoading) { | ||||
|       return ( | ||||
|  | @ -66,6 +68,7 @@ const AccountTimeline = React.createClass({ | |||
|           prepend={<HeaderContainer accountId={this.props.params.accountId} />} | ||||
|           statusIds={statusIds} | ||||
|           isLoading={isLoading} | ||||
|           hasMore={hasMore} | ||||
|           me={me} | ||||
|           onScrollToBottom={this.handleScrollToBottom} | ||||
|         /> | ||||
|  |  | |||
|  | @ -40,7 +40,8 @@ const makeMapStateToProps = () => { | |||
|   const mapStateToProps = (state, props) => ({ | ||||
|     statusIds: getStatusIds(state, props), | ||||
|     isLoading: state.getIn(['timelines', props.type, 'isLoading'], true), | ||||
|     isUnread: state.getIn(['timelines', props.type, 'unread']) > 0 | ||||
|     isUnread: state.getIn(['timelines', props.type, 'unread']) > 0, | ||||
|     hasMore: !!state.getIn(['timelines', props.type, 'next']) | ||||
|   }); | ||||
| 
 | ||||
|   return mapStateToProps; | ||||
|  |  | |||
|  | @ -17,37 +17,32 @@ export const makeGetAccount = () => { | |||
|   }); | ||||
| }; | ||||
| 
 | ||||
| const getStatusBase = (state, id) => state.getIn(['statuses', id], null); | ||||
| 
 | ||||
| export const makeGetStatus = () => { | ||||
|   return createSelector([getStatusBase, getStatuses, getAccounts], (base, statuses, accounts) => { | ||||
|     if (base === null) { | ||||
|       return null; | ||||
|   return createSelector( | ||||
|     [ | ||||
|       (state, id) => state.getIn(['statuses', id]), | ||||
|       (state, id) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]), | ||||
|       (state, id) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]), | ||||
|       (state, id) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]), | ||||
|     ], | ||||
| 
 | ||||
|     (statusBase, statusReblog, accountBase, accountReblog) => { | ||||
|       if (!statusBase) { | ||||
|         return null; | ||||
|       } | ||||
| 
 | ||||
|       if (statusReblog) { | ||||
|         statusReblog = statusReblog.set('account', accountReblog); | ||||
|       } else { | ||||
|         statusReblog = null; | ||||
|       } | ||||
| 
 | ||||
|       return statusBase.withMutations(map => { | ||||
|         map.set('reblog', statusReblog); | ||||
|         map.set('account', accountBase); | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     return assembleStatus(base.get('id'), statuses, accounts); | ||||
|   }); | ||||
| }; | ||||
| 
 | ||||
| const assembleStatus = (id, statuses, accounts) => { | ||||
|   let status = statuses.get(id, null); | ||||
|   let reblog = null; | ||||
| 
 | ||||
|   if (status === null) { | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   if (status.get('reblog', null) !== null) { | ||||
|     reblog = statuses.get(status.get('reblog'), null); | ||||
| 
 | ||||
|     if (reblog !== null) { | ||||
|       reblog = reblog.set('account', accounts.get(reblog.get('account'))); | ||||
|     } else { | ||||
|       return null; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return status.set('reblog', reblog).set('account', accounts.get(status.get('account'))); | ||||
|   ); | ||||
| }; | ||||
| 
 | ||||
| const getAlertsBase = state => state.get('alerts'); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue