diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js index 41e4e8176b..8bc01941e0 100644 --- a/src/components/user_card_content/user_card_content.js +++ b/src/components/user_card_content/user_card_content.js @@ -1,4 +1,5 @@ import UserAvatar from '../user_avatar/user_avatar.vue' +import apiService from '../../services/api/api.service.js' import { hex2rgb } from '../../services/color_convert/color_convert.js' import { requestFollow, requestUnfollow } from '../../services/follow_manipulate/follow_manipulate' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' @@ -99,9 +100,24 @@ export default { this.followRequestInProgress = false this.followRequestSent = sent - store.dispatch('stopFetching', 'friends') - store.commit('clearTimeline', { timeline: 'friends' }) - store.dispatch('startFetching', { timeline: 'friends' }) + const rootState = store.rootState || store.state + const credentials = store.state.users.currentUser.credentials + const timelineData = rootState.statuses.timelines['friends'] + apiService.fetchTimeline({ + store, + credentials, + userId: this.user.id, + timeline: 'user', + between: true, + until: timelineData.maxId, + since: timelineData.minVisibleId + }).then((statuses) => { + store.dispatch('addNewStatuses', { + timeline: 'friends', + statuses, + showImmediately: true + }) + }, () => store.dispatch('setError', { value: true })) }) }, unfollowUser () { @@ -110,9 +126,7 @@ export default { requestUnfollow(this.user, store).then(() => { this.followRequestInProgress = false - store.dispatch('stopFetching', 'friends') - store.commit('clearTimeline', { timeline: 'friends' }) - store.dispatch('startFetching', { timeline: 'friends' }) + store.commit('removeStatus', { timeline: 'friends', userId: this.user.id }) }) }, blockUser () { @@ -121,12 +135,9 @@ export default { .then((blockedUser) => { store.commit('addNewUsers', [blockedUser]) - store.dispatch('stopFetching', 'friends') - store.commit('clearTimeline', { timeline: 'friends' }) - store.dispatch('startFetching', { timeline: 'friends' }) - - store.commit('clearTimeline', { timeline: 'public' }) - store.commit('clearTimeline', { timeline: 'publicAndExternal' }) + store.commit('removeStatus', { timeline: 'friends', userId: this.user.id }) + store.commit('removeStatus', { timeline: 'public', userId: this.user.id }) + store.commit('removeStatus', { timeline: 'publicAndExternal', userId: this.user.id }) }) }, unblockUser () { @@ -135,12 +146,36 @@ export default { .then((unblockedUser) => { store.commit('addNewUsers', [unblockedUser]) - store.dispatch('stopFetching', 'friends') - store.commit('clearTimeline', { timeline: 'friends' }) - store.dispatch('startFetching', { timeline: 'friends' }) - - store.commit('clearTimeline', { timeline: 'public' }) - store.commit('clearTimeline', { timeline: 'publicAndExternal' }) + const rootState = store.rootState || store.state + const credentials = store.state.users.currentUser.credentials + const timelineData = rootState.statuses.timelines['friends'] + apiService.fetchTimeline({ + store, + credentials, + userId: this.user.id, + timeline: 'user', + between: true, + until: timelineData.maxId, + since: timelineData.minVisibleId + }).then((statuses) => { + store.dispatch('addNewStatuses', { + timeline: 'public', + statuses, + showImmediately: true + }) + store.dispatch('addNewStatuses', { + timeline: 'publicAndExternal', + statuses, + showImmediately: true + }) + if (this.user.follows_you) { + store.dispatch('addNewStatuses', { + timeline: 'friends', + statuses, + showImmediately: true + }) + } + }, () => store.dispatch('setError', { value: true })) }) }, toggleMute () { diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 46117fd770..57095f378b 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -307,9 +307,32 @@ const addNewNotifications = (state, { dispatch, notifications, older, visibleNot }) } +const removeStatus = (state, { timeline, userId }) => { + const timelineObject = state.timelines[timeline] + if (userId) { + remove(timelineObject.statuses, { user: { id: userId } }) + remove(timelineObject.visibleStatuses, { user: { id: userId } }) + const statusesObject = timelineObject.statusesObject + const visibleStatusesObject = timelineObject.visibleStatusesObject + each(statusesObject, (status, key) => { + if (status.user.id === userId) { + delete statusesObject[key] + } + }) + each(visibleStatusesObject, (status, key) => { + if (status.user.id === userId) { + delete visibleStatusesObject[key] + } + }) + timelineObject.minVisibleId = (last(timeline.visibleStatuses) || {}).id + timelineObject.maxId = statuses.length > 0 ? maxBy(statuses, 'id').id : 0 + } +} + export const mutations = { addNewStatuses, addNewNotifications, + removeStatus, showNewStatuses (state, { timeline }) { const oldTimeline = (state.timelines[timeline]) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 92daa04e57..d35c72b113 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -329,7 +329,7 @@ const setUserMute = ({id, credentials, muted = true}) => { }) } -const fetchTimeline = ({timeline, credentials, since = false, until = false, userId = false, tag = false}) => { +const fetchTimeline = ({timeline, credentials, since = false, until = false, between = false, count = 20, userId = false, tag = false}) => { const timelineUrls = { public: PUBLIC_TIMELINE_URL, friends: FRIENDS_TIMELINE_URL, @@ -362,8 +362,9 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use if (timeline === 'media') { params.push(['only_media', 1]) } - - params.push(['count', 20]) + if (!between) { + params.push(['count', count]) + } const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&') url += `?${queryString}`