import { merge } from 'lodash' const polls = { state: { // Contains key = id, value = number of trackers for this poll trackedPolls: {}, pollsObject: {} }, mutations: { mergeOrAddPoll (state, poll) { const existingPoll = state.pollsObject[poll.id] // Make expired-state change trigger re-renders properly poll.expired = Date.now() > Date.parse(poll.expires_at) if (existingPoll) { state.pollsObject[poll.id] = merge(existingPoll, poll) } else { state.pollsObject[poll.id] = poll } }, trackPoll (state, pollId) { const currentValue = state.trackedPolls[pollId] if (currentValue) { state.trackedPolls[pollId] = currentValue + 1 } else { state.trackedPolls[pollId] = 1 } }, untrackPoll (state, pollId) { const currentValue = state.trackedPolls[pollId] if (currentValue) { state.trackedPolls[pollId] = currentValue - 1 } else { state.trackedPolls[pollId] = 0 } } }, actions: { mergeOrAddPoll ({ commit }, poll) { commit('mergeOrAddPoll', poll) }, updateTrackedPoll ({ rootState, dispatch, commit }, pollId) { rootState.api.backendInteractor.fetchPoll({ pollId }).then(poll => { setTimeout(() => { if (rootState.polls.trackedPolls[pollId]) { dispatch('updateTrackedPoll', pollId) } }, 30 * 1000) commit('mergeOrAddPoll', poll) }) }, trackPoll ({ rootState, commit, dispatch }, pollId) { if (!rootState.polls.trackedPolls[pollId]) { setTimeout(() => dispatch('updateTrackedPoll', pollId), 30 * 1000) } commit('trackPoll', pollId) }, untrackPoll ({ commit }, pollId) { commit('untrackPoll', pollId) }, votePoll ({ rootState, commit }, { id, pollId, choices }) { return rootState.api.backendInteractor.vote({ pollId, choices }).then(poll => { commit('mergeOrAddPoll', poll) return poll }) } } } export default polls