Don't put statuses we received from retweets into timelines.

They should be in allStatuses to keep only one reference, but they
should not get into the timeline, or it will mess up old status
fetching, because they have a very low id.
This commit is contained in:
Roger Braun 2016-11-07 22:09:34 +01:00
parent 79b2243f6c
commit f8a3afc9d1
2 changed files with 17 additions and 16 deletions

View File

@ -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 moment from 'moment'
import apiService from '../services/api/api.service.js' import apiService from '../services/api/api.service.js'
@ -55,14 +55,6 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib
addedStatuses = statusesAndFaves['status'] || [] 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. // Add some html and nsfw to the statuses.
addedStatuses = map(addedStatuses, (status) => { addedStatuses = map(addedStatuses, (status) => {
const statusoid = status.retweeted_status || status const statusoid = status.retweeted_status || status
@ -79,11 +71,9 @@ const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visib
statusoid.nsfw = statusoid.text.match(nsfwRegex) statusoid.nsfw = statusoid.text.match(nsfwRegex)
} }
return splitRetweets(status) return status
}) })
addedStatuses = flatten(addedStatuses)
const newStatuses = sortBy( const newStatuses = sortBy(
unionBy(addedStatuses, statuses, 'id'), unionBy(addedStatuses, statuses, 'id'),
({id}) => -id ({id}) => -id
@ -125,9 +115,19 @@ const updateTimestampsInStatuses = (statuses) => {
export const mutations = { export const mutations = {
addNewStatuses (state, { statuses, showImmediately = false, timeline }) { addNewStatuses (state, { statuses, showImmediately = false, timeline }) {
state.timelines[timeline] = addStatusesToTimeline(statuses, showImmediately, state.timelines[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 // 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) => { each(state.allStatuses, (status) => {
if (status.retweeted_status) { if (status.retweeted_status) {

View File

@ -42,9 +42,10 @@ describe('The Statuses module', () => {
retweet.retweeted_status = status retweet.retweeted_status = status
// It adds both statuses // It adds both statuses, but only the retweet to visible.
mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [retweet], timeline: 'public', showImmediately: true })
expect(state.allStatuses).to.eql([retweet, status]) expect(state.timelines.public.visibleStatuses).to.have.length(1)
expect(state.allStatuses).to.eql([status, retweet])
// It refers to the modified status. // It refers to the modified status.
mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' })