101 lines
2.7 KiB
JavaScript
101 lines
2.7 KiB
JavaScript
|
import { last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash'
|
||
|
// import moment from 'moment'
|
||
|
|
||
|
const defaultState = {
|
||
|
allStatuses: [],
|
||
|
maxId: 0,
|
||
|
timelines: {
|
||
|
public: {
|
||
|
statuses: [],
|
||
|
faves: [],
|
||
|
visibleStatuses: [],
|
||
|
newStatusCount: 0,
|
||
|
maxId: 0,
|
||
|
minVisibleId: 0
|
||
|
},
|
||
|
publicAndExternal: {
|
||
|
statuses: [],
|
||
|
faves: [],
|
||
|
visibleStatuses: [],
|
||
|
newStatusCount: 0,
|
||
|
maxId: 0,
|
||
|
minVisibleId: 0
|
||
|
},
|
||
|
friends: {
|
||
|
statuses: [],
|
||
|
faves: [],
|
||
|
visibleStatuses: [],
|
||
|
newStatusCount: 0,
|
||
|
maxId: 0,
|
||
|
minVisibleId: 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const statusType = (status) => {
|
||
|
return !status.is_post_verb && status.uri.match(/fave/) ? 'fave' : 'status'
|
||
|
}
|
||
|
|
||
|
const addStatusesToTimeline = (addedStatuses, showImmediately, { statuses, visibleStatuses, newStatusCount, faves }) => {
|
||
|
const statusesAndFaves = groupBy(addedStatuses, statusType)
|
||
|
const addedFaves = statusesAndFaves['fave'] || []
|
||
|
const unseenFaves = differenceBy(addedFaves, faves, 'id')
|
||
|
|
||
|
// Update fave count
|
||
|
each(unseenFaves, ({in_reply_to_status_id}) => {
|
||
|
const status = find(statuses, { id: toInteger(in_reply_to_status_id) })
|
||
|
if (status) {
|
||
|
status.fave_num += 1
|
||
|
}
|
||
|
})
|
||
|
|
||
|
addedStatuses = statusesAndFaves['status'] || []
|
||
|
|
||
|
// Add some html to the statuses.
|
||
|
each(addedStatuses, (status) => {
|
||
|
const statusoid = status.retweeted_status || status
|
||
|
if (statusoid.parsedText === undefined) {
|
||
|
// statusoid.parsedText = statusParserService.parse(statusoid)
|
||
|
statusoid.parsedText = statusoid.text
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const newStatuses = sortBy(
|
||
|
unionBy(addedStatuses, statuses, 'id'),
|
||
|
({id}) => -id
|
||
|
)
|
||
|
|
||
|
let newNewStatusCount = newStatusCount + (newStatuses.length - statuses.length)
|
||
|
|
||
|
let newVisibleStatuses = visibleStatuses
|
||
|
|
||
|
if (showImmediately) {
|
||
|
newVisibleStatuses = unionBy(addedStatuses, newVisibleStatuses, 'id')
|
||
|
newVisibleStatuses = sortBy(newVisibleStatuses, ({id}) => -id)
|
||
|
newNewStatusCount = newStatusCount
|
||
|
};
|
||
|
|
||
|
newVisibleStatuses = intersectionBy(newStatuses, newVisibleStatuses, 'id')
|
||
|
|
||
|
return {
|
||
|
statuses: newStatuses,
|
||
|
visibleStatuses: newVisibleStatuses,
|
||
|
newStatusCount: newNewStatusCount,
|
||
|
maxId: newStatuses[0].id,
|
||
|
minVisibleId: last(newVisibleStatuses).id,
|
||
|
faves: unionBy(faves, addedFaves, 'id')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const statuses = {
|
||
|
state: defaultState,
|
||
|
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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default statuses
|