aboutsummaryrefslogtreecommitdiff
path: root/src/modules/statuses.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/statuses.js')
-rw-r--r--src/modules/statuses.js100
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