From 388d093beb2950553f3806a72e72afe77ecc23ac Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 13 Oct 2017 16:44:02 +0200 Subject: [PATCH] When unfollowing, remove from home in web UI immediately (#5369) Do NOT send "delete" through streaming API when unmerging from home timeline. "delete" implies that the original status was deleted, which is not true! --- app/javascript/mastodon/actions/accounts.js | 5 +++-- app/javascript/mastodon/reducers/timelines.js | 9 +++++++++ app/lib/feed_manager.rb | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index 03e3d3d9f9..73d6baacea 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -122,7 +122,7 @@ export function unfollowAccount(id) { dispatch(unfollowAccountRequest(id)); api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => { - dispatch(unfollowAccountSuccess(response.data)); + dispatch(unfollowAccountSuccess(response.data, getState().get('statuses'))); }).catch(error => { dispatch(unfollowAccountFail(error)); }); @@ -157,10 +157,11 @@ export function unfollowAccountRequest(id) { }; }; -export function unfollowAccountSuccess(relationship) { +export function unfollowAccountSuccess(relationship, statuses) { return { type: ACCOUNT_UNFOLLOW_SUCCESS, relationship, + statuses, }; }; diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 065e89f961..b17d74ef33 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -14,6 +14,7 @@ import { import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, + ACCOUNT_UNFOLLOW_SUCCESS, } from '../actions/accounts'; import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; @@ -108,6 +109,12 @@ const filterTimelines = (state, relationship, statuses) => { return state; }; +const filterTimeline = (timeline, state, relationship, statuses) => + state.updateIn([timeline, 'items'], ImmutableList(), list => + list.filterNot(statusId => + statuses.getIn([statusId, 'account']) === relationship.id + )); + const updateTop = (state, timeline, top) => { return state.update(timeline, initialTimeline, map => map.withMutations(mMap => { if (top) mMap.set('unread', 0); @@ -134,6 +141,8 @@ export default function timelines(state = initialState, action) { case ACCOUNT_BLOCK_SUCCESS: case ACCOUNT_MUTE_SUCCESS: return filterTimelines(state, action.relationship, action.statuses); + case ACCOUNT_UNFOLLOW_SUCCESS: + return filterTimeline('home', state, action.relationship, action.statuses); case TIMELINE_SCROLL_TOP: return updateTop(state, action.timeline, action.top); case TIMELINE_CONNECT: diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 6398aa6d66..100f6c8f8f 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -85,7 +85,7 @@ class FeedManager oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0 from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_home_score).reorder(nil).find_each do |status| - unpush(:home, into_account, status) + remove_from_feed(:home, into_account, status) end end