diff options
Diffstat (limited to 'src/modules/statuses.js')
| -rw-r--r-- | src/modules/statuses.js | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/modules/statuses.js b/src/modules/statuses.js new file mode 100644 index 00000000..b1a77061 --- /dev/null +++ b/src/modules/statuses.js @@ -0,0 +1,100 @@ +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 |
