diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 7913c289d9..8ed2890f74 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -1,4 +1,4 @@ -import { flatten, map, slice, last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash' +import { reduce, map, slice, last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash' import moment from 'moment' import apiService from '../services/api/api.service.js' @@ -55,14 +55,6 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib addedStatuses = statusesAndFaves['status'] || [] - const splitRetweets = (status) => { - if (status.retweeted_status) { - return [status, status.retweeted_status] - } else { - return status - } - } - // Add some html and nsfw to the statuses. addedStatuses = map(addedStatuses, (status) => { const statusoid = status.retweeted_status || status @@ -79,11 +71,9 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib statusoid.nsfw = statusoid.text.match(nsfwRegex) } - return splitRetweets(status) + return status }) - addedStatuses = flatten(addedStatuses) - const newStatuses = sortBy( unionBy(addedStatuses, statuses, 'id'), ({id}) => -id @@ -125,9 +115,19 @@ const updateTimestampsInStatuses = (statuses) => { export const mutations = { addNewStatuses (state, { statuses, showImmediately = false, timeline }) { state.timelines[timeline] = addStatusesToTimeline(statuses, showImmediately, state.timelines[timeline]) - state.allStatuses = unionBy(state.timelines[timeline].statuses, state.allStatuses.id) + state.allStatuses = unionBy(state.timelines[timeline].statuses, state.allStatuses, 'id') // Set up retweets with most current status + const getRetweets = (result, status) => { + if (status.retweeted_status) { + result.push(status.retweeted_status) + } + return result + } + + const retweets = reduce(statuses, getRetweets, []) + + state.allStatuses = unionBy(retweets, state.allStatuses, 'id') each(state.allStatuses, (status) => { if (status.retweeted_status) { diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js index 75736133bf..fe8ed0b8ce 100644 --- a/test/unit/specs/modules/statuses.spec.js +++ b/test/unit/specs/modules/statuses.spec.js @@ -42,9 +42,10 @@ describe('The Statuses module', () => { retweet.retweeted_status = status - // It adds both statuses - mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public' }) - expect(state.allStatuses).to.eql([retweet, status]) + // It adds both statuses, but only the retweet to visible. + mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public', showImmediately: true }) + expect(state.timelines.public.visibleStatuses).to.have.length(1) + expect(state.allStatuses).to.eql([status, retweet]) // It refers to the modified status. mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' })