about summary refs log tree commit diff
path: root/app/assets
diff options
context:
space:
mode:
authorgeta6 <getakura@gmail.com>2017-04-18 20:10:49 +0900
committerEugen <eugen@zeonfederated.com>2017-04-18 13:10:49 +0200
commit75910abd8f9b40a08e8b4a79979b99ec841c6cd9 (patch)
tree97b8a26716924fd4d2af4b4282a1f253a4401908 /app/assets
parent93c13fe691750e8c7f0c90091bca2564b97ccba7 (diff)
Add hasMore field to account timeline (#2066)
Diffstat (limited to 'app/assets')
-rw-r--r--app/assets/javascripts/components/actions/accounts.jsx8
-rw-r--r--app/assets/javascripts/components/features/account_timeline/index.jsx4
-rw-r--r--app/assets/javascripts/components/reducers/timelines.jsx6
3 files changed, 12 insertions, 6 deletions
diff --git a/app/assets/javascripts/components/actions/accounts.jsx b/app/assets/javascripts/components/actions/accounts.jsx
index 37ebb9969..eac5c78bb 100644
--- a/app/assets/javascripts/components/actions/accounts.jsx
+++ b/app/assets/javascripts/components/actions/accounts.jsx
@@ -126,7 +126,8 @@ export function expandAccountTimeline(id) {
         max_id: lastId
       }
     }).then(response => {
-      dispatch(expandAccountTimelineSuccess(id, response.data));
+      const next = getLinks(response).refs.find(link => link.rel === 'next');
+      dispatch(expandAccountTimelineSuccess(id, response.data, next));
     }).catch(error => {
       dispatch(expandAccountTimelineFail(id, error));
     });
@@ -257,11 +258,12 @@ export function expandAccountTimelineRequest(id) {
   };
 };
 
-export function expandAccountTimelineSuccess(id, statuses) {
+export function expandAccountTimelineSuccess(id, statuses, next) {
   return {
     type: ACCOUNT_TIMELINE_EXPAND_SUCCESS,
     id,
-    statuses
+    statuses,
+    next
   };
 };
 
diff --git a/app/assets/javascripts/components/features/account_timeline/index.jsx b/app/assets/javascripts/components/features/account_timeline/index.jsx
index f92e1b49c..edae976b9 100644
--- a/app/assets/javascripts/components/features/account_timeline/index.jsx
+++ b/app/assets/javascripts/components/features/account_timeline/index.jsx
@@ -46,7 +46,9 @@ const AccountTimeline = React.createClass({
   },
 
   handleScrollToBottom () {
-    this.props.dispatch(expandAccountTimeline(Number(this.props.params.accountId)));
+    if (!this.props.isLoading && this.props.hasMore) {
+      this.props.dispatch(expandAccountTimeline(Number(this.props.params.accountId)));
+    }
   },
 
   render () {
diff --git a/app/assets/javascripts/components/reducers/timelines.jsx b/app/assets/javascripts/components/reducers/timelines.jsx
index 675a52759..fa9863250 100644
--- a/app/assets/javascripts/components/reducers/timelines.jsx
+++ b/app/assets/javascripts/components/reducers/timelines.jsx
@@ -144,10 +144,11 @@ const normalizeAccountTimeline = (state, accountId, statuses, replace = false) =
   return state.updateIn(['accounts_timelines', accountId], Immutable.Map(), map => map
     .set('isLoading', false)
     .set('loaded', true)
+    .set('next', true)
     .update('items', Immutable.List(), list => (replace ? ids : list.unshift(...ids))));
 };
 
-const appendNormalizedAccountTimeline = (state, accountId, statuses) => {
+const appendNormalizedAccountTimeline = (state, accountId, statuses, next) => {
   let moreIds = Immutable.List([]);
 
   statuses.forEach((status, i) => {
@@ -157,6 +158,7 @@ const appendNormalizedAccountTimeline = (state, accountId, statuses) => {
 
   return state.updateIn(['accounts_timelines', accountId], Immutable.Map(), map => map
     .set('isLoading', false)
+    .set('next', next)
     .update('items', list => list.push(...moreIds)));
 };
 
@@ -299,7 +301,7 @@ export default function timelines(state = initialState, action) {
   case ACCOUNT_TIMELINE_FETCH_SUCCESS:
     return normalizeAccountTimeline(state, action.id, Immutable.fromJS(action.statuses), action.replace);
   case ACCOUNT_TIMELINE_EXPAND_SUCCESS:
-    return appendNormalizedAccountTimeline(state, action.id, Immutable.fromJS(action.statuses));
+    return appendNormalizedAccountTimeline(state, action.id, Immutable.fromJS(action.statuses), action.next);
   case ACCOUNT_BLOCK_SUCCESS:
   case ACCOUNT_MUTE_SUCCESS:
     return filterTimelines(state, action.relationship, action.statuses);