aboutsummaryrefslogtreecommitdiff
path: root/src/modules/announcements.js
blob: 2ab2600cf7bd2ea6dd53f41578dda6500906cfc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { set } from 'vue'

const FETCH_ANNOUNCEMENT_INTERVAL_MS = 1000 * 60 * 5

export const defaultState = {
  announcements: [],
  fetchAnnouncementsTimer: undefined
}

export const mutations = {
  setAnnouncements (state, announcements) {
    set(state, 'announcements', announcements)
  },
  setAnnouncementRead (state, { id, read }) {
    if (!state.announcements[id]) {
      return
    }

    set(state.announcements[id], 'read', read)
  },
  setFetchAnnouncementsTimer (state, timer) {
    set(state, 'fetchAnnouncementsTimer', announcements)
  }
}

const announcements = {
  state: defaultState,
  mutations,
  actions: {
    fetchAnnouncements (store) {
      return store.rootState.api.backendInteractor.fetchAnnouncements()
        .then(announcements => {
          store.commit('setAnnouncements', announcements)
        })
    },
    markAnnouncementAsRead (store, id) {
      return store.rootState.api.backendInteractor.dismissAnnouncement({ id })
        .then(() => {
          store.commit('setAnnouncementRead', { id, read: true })
        })
    },
    startFetchingAnnouncements (store) {
      if (store.state.fetchAnnouncementsTimer) {
        return
      }

      const interval = setInterval(() => store.dispatch('fetchAnnouncements'), FETCH_ANNOUNCEMENT_INTERVAL_MS)
      store.commit('setFetchAnnouncementsTimer', interval)

      return store.dispatch('fetchAnnouncements')
    },
    stopFetchingAnnouncements (store) {
      const interval = store.state.fetchAnnouncementsTimer
      store.commit('setFetchAnnouncementsTimer', undefined)
      clearInterval(interval)
    }
  }
}

export default announcements