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