direct_conversations.js (8346B)
1 import { find, omitBy, debounce } from 'lodash'
2 import directConversationService from '../services/direct_conversation_service/direct_conversation_service.js'
3
4 const emptyDirectConversations = () => ({
5 data: [],
6 pagination: { maxId: undefined, minId: undefined },
7 idStore: {},
8 currentDirectConversationId: null,
9 directConversationFocused: false,
10 currentDirectConversationStatuses: []
11 })
12
13 const defaultState = {
14 directConversations: emptyDirectConversations(),
15 currentDirectConversation: directConversationService.empty(),
16 fetcher: undefined
17 }
18
19 const directConversations = {
20 state: { ...defaultState },
21 actions: {
22 startFetchingDirectConversations ({ dispatch }) {
23 setInterval(() => {
24 dispatch('fetchDirectConversations', { reset: true })
25 dispatch('refreshCurrentUser')
26 }, 5000)
27 },
28 startFetchingCurrentDirectConversation ({ commit, dispatch }, { fetcher, conversationId }) {
29 commit('setCurrentDirectConversationId', conversationId)
30 dispatch('setCurrentDirectConversationFetcher', { fetcher })
31 },
32 setCurrentDirectConversationFetcher ({ rootState, commit }, { fetcher }) {
33 commit('setCurrentDirectConversationFetcher', { fetcher })
34 },
35 fetchDirectConversations ({ dispatch, rootState, commit }, params = {}) {
36 const pagination = rootState.directConversations.directConversations.pagination
37 const opts = { maxId: params.reset ? undefined : pagination.maxId }
38
39 return rootState.api.backendInteractor.directConversations(opts)
40 .then(({ directConversations, pagination }) => {
41 dispatch('addNewDirectConversations', { directConversations, pagination })
42 return directConversations
43 })
44 },
45 addNewDirectConversations ({ rootState, commit, dispatch, rootGetters }, { directConversations, pagination }) {
46 commit('addNewDirectConversations', { dispatch, directConversations, pagination, rootGetters })
47 },
48 refreshCurrentUser: debounce(({ rootState, commit, dispatch }) => {
49 const currentUser = rootState.users.currentUser
50 dispatch('fetchUser', currentUser.screen_name).then(updatedCurrentUser => {
51 commit('setCurrentUser', updatedCurrentUser)
52 })
53 }, 500, { leading: false }),
54 updateDirectConversation ({ rootState, commit, dispatch, rootGetters }, { directConversation }) {
55 commit('updateDirectConversation', { dispatch, rootGetters, directConversation })
56 if (rootState.directConversations.directConversations.currentDirectConversationId === directConversation.id) {
57 dispatch('addToCurrentDirectConversationStatuses', { statuses: [directConversation.last_status] })
58 }
59 dispatch('refreshCurrentUser')
60 },
61 deleteDirectConversation ({ rootState, commit, dispatch, rootGetters }, { id }) {
62 commit('deleteDirectConversation', { dispatch, rootGetters, id })
63 dispatch('refreshCurrentUser')
64 },
65 resetDirectConversations ({ rootState, commit, dispatch, rootGetters }) {
66 commit('resetDirectConversations', { dispatch })
67 },
68 setDirectConversationFocused ({ commit }, value) {
69 commit('setDirectConversationFocused', value)
70 },
71 addToCurrentDirectConversationStatuses ({ commit }, value) {
72 commit('addToCurrentDirectConversationStatuses', value)
73 },
74 resetDirectConversationNewMessageCount ({ commit }, value) {
75 commit('resetDirectConversationNewMessageCount', value)
76 },
77 markAllDirectConversationsAsRead ({ commit }, value) {
78 commit('markAllDirectConversationsAsRead', value)
79 },
80 removeFromCurrentDirectConversationStatuses ({ commit }, { id }) {
81 commit('removeFromCurrentDirectConversationStatuses', id)
82 },
83 clearCurrentDirectConversationStatuses ({ commit }, value) {
84 commit('clearCurrentDirectConversationStatuses', value)
85 },
86 clearCurrentDirectConversation ({ commit, dispatch }, value) {
87 commit('setCurrentDirectConversationId', undefined)
88 commit('setCurrentDirectConversationFetcher', { fetcher: undefined })
89 dispatch('clearCurrentDirectConversationStatuses')
90 },
91 readDirectConversation ({ rootState, dispatch }, { id }) {
92 dispatch('resetDirectConversationNewMessageCount')
93 rootState.api.backendInteractor.readDirectConversation({ id }).then(() => {
94 dispatch('refreshCurrentUser')
95 })
96 }
97 },
98 mutations: {
99 setCurrentDirectConversationFetcher (state, { fetcher }) {
100 let prevFetcher = state.fetcher
101 if (prevFetcher) {
102 clearInterval(prevFetcher)
103 }
104 state.fetcher = fetcher && fetcher()
105 },
106 addNewDirectConversations (state, { _dispatch, directConversations, pagination, _rootGetters }) {
107 state.directConversations.pagination = pagination
108 directConversations.forEach((conversation) => {
109 // This is to prevent duplicate conversations being added
110 // (right now, backend can return the same conversation on different pages)
111 if (!state.directConversations.idStore[conversation.id]) {
112 state.directConversations.data.push(conversation)
113 state.directConversations.idStore[conversation.id] = conversation
114 } else {
115 const directConversation = find(state.directConversations.data, { id: conversation.id })
116 directConversation.last_status = conversation.last_status
117 directConversation.unread = conversation.unread
118 state.directConversations.idStore[conversation.id] = conversation
119 }
120 })
121 },
122 updateDirectConversation (state, { _dispatch, directConversation: updatedDirectConversation, _rootGetters }) {
123 let directConversation = find(state.directConversations.data, { id: updatedDirectConversation.id })
124 if (directConversation) {
125 if (directConversation.last_status.id < updatedDirectConversation.last_status.id) {
126 state.directConversations.data = state.directConversations.data.filter(d => {
127 return d.id !== updatedDirectConversation.id
128 })
129 state.directConversations.data.unshift(updatedDirectConversation)
130 state.directConversations.idStore[updatedDirectConversation.id] = updatedDirectConversation
131 } else {
132 directConversation.last_status = updatedDirectConversation.last_status
133 directConversation.unread = updatedDirectConversation.unread
134 }
135 } else {
136 state.directConversations.data.unshift(updatedDirectConversation)
137 state.directConversations.idStore[updatedDirectConversation.id] = updatedDirectConversation
138 }
139 },
140 deleteDirectConversation (state, { _dispatch, id, _rootGetters }) {
141 state.directConversations.data = state.directConversations.data.filter(conversation =>
142 conversation.last_status.id !== id
143 )
144 state.directConversations.idStore = omitBy(state.directConversations.idStore, conversation => conversation.last_status.id === id)
145 },
146 resetDirectConversations (state, { _dispatch }) {
147 state.directConversations.data = []
148 state.directConversations.idStore = {}
149 },
150 setDirectConversationsLoading (state, { value }) {
151 state.directConversations.loading = value
152 },
153 setCurrentDirectConversationId (state, value) {
154 state.directConversations.currentDirectConversationId = value
155 directConversationService.setConversationId(state.currentDirectConversation, value)
156 },
157 setDirectConversationFocused (state, value) {
158 state.directConversations.directConversationFocused = value
159 },
160 markAllDirectConversationsAsRead (state, _value) {
161 state.directConversations.data.forEach(directConversation => {
162 directConversation.unread = false
163 })
164 },
165 addToCurrentDirectConversationStatuses (state, value) {
166 directConversationService.add(state.currentDirectConversation, value)
167 },
168 resetDirectConversationNewMessageCount (state, _value) {
169 directConversationService.resetNewMessageCount(state.currentDirectConversation)
170 },
171 removeFromCurrentDirectConversationStatuses (state, value) {
172 directConversationService.remove(state.currentDirectConversation, value)
173 },
174 clearCurrentDirectConversationStatuses (state, _value) {
175 directConversationService.clear(state.currentDirectConversation)
176 }
177 }
178 }
179
180 export default directConversations