Fix direct timeline pagination in the WebUI ()

The `hasMore` property of timelines in redux store was set whenever an API
request returned only one page of results, *even* if the query only requested
newer conversations (using `since_id`), causing `hasMore` to be incorrectly set to
false whenever fetching new toots in the direct timeline, which happens each time
the direct message column is opened.

(Basically  for direct messages)
This commit is contained in:
ThibG 2019-02-27 19:13:16 +01:00 committed by Eugen Rochko
parent df01206703
commit 6e8743d17a
2 changed files with 8 additions and 5 deletions
app/javascript/mastodon

View file

@ -41,13 +41,15 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']); params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']);
} }
const isLoadingRecent = !!params.since_id;
api(getState).get('/api/v1/conversations', { params }) api(getState).get('/api/v1/conversations', { params })
.then(response => { .then(response => {
const next = getLinks(response).refs.find(link => link.rel === 'next'); const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), []))); dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), [])));
dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x))); dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x)));
dispatch(expandConversationsSuccess(response.data, next ? next.uri : null)); dispatch(expandConversationsSuccess(response.data, next ? next.uri : null, isLoadingRecent));
}) })
.catch(err => dispatch(expandConversationsFail(err))); .catch(err => dispatch(expandConversationsFail(err)));
}; };
@ -56,10 +58,11 @@ export const expandConversationsRequest = () => ({
type: CONVERSATIONS_FETCH_REQUEST, type: CONVERSATIONS_FETCH_REQUEST,
}); });
export const expandConversationsSuccess = (conversations, next) => ({ export const expandConversationsSuccess = (conversations, next, isLoadingRecent) => ({
type: CONVERSATIONS_FETCH_SUCCESS, type: CONVERSATIONS_FETCH_SUCCESS,
conversations, conversations,
next, next,
isLoadingRecent,
}); });
export const expandConversationsFail = error => ({ export const expandConversationsFail = error => ({

View file

@ -35,7 +35,7 @@ const updateConversation = (state, item) => state.update('items', list => {
} }
}); });
const expandNormalizedConversations = (state, conversations, next) => { const expandNormalizedConversations = (state, conversations, next, isLoadingRecent) => {
let items = ImmutableList(conversations.map(conversationToMap)); let items = ImmutableList(conversations.map(conversationToMap));
return state.withMutations(mutable => { return state.withMutations(mutable => {
@ -66,7 +66,7 @@ const expandNormalizedConversations = (state, conversations, next) => {
}); });
} }
if (!next) { if (!next && !isLoadingRecent) {
mutable.set('hasMore', false); mutable.set('hasMore', false);
} }
@ -81,7 +81,7 @@ export default function conversations(state = initialState, action) {
case CONVERSATIONS_FETCH_FAIL: case CONVERSATIONS_FETCH_FAIL:
return state.set('isLoading', false); return state.set('isLoading', false);
case CONVERSATIONS_FETCH_SUCCESS: case CONVERSATIONS_FETCH_SUCCESS:
return expandNormalizedConversations(state, action.conversations, action.next); return expandNormalizedConversations(state, action.conversations, action.next, action.isLoadingRecent);
case CONVERSATIONS_UPDATE: case CONVERSATIONS_UPDATE:
return updateConversation(state, action.conversation); return updateConversation(state, action.conversation);
case CONVERSATIONS_MOUNT: case CONVERSATIONS_MOUNT: