aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/notice-controller.js
blob: 57aad40c53c4e858909b76e1441729a89b931826 (plain) (blame)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const EventEmitter = require('events').EventEmitter
const extend = require('xtend')
const ObservableStore = require('obs-store')
const hardCodedNotices = require('../../notices/notices.json')

module.exports = class NoticeController extends EventEmitter {

  constructor (opts) {
    super()
    this.noticePoller = null
    const initState = extend({
      noticesList: [],
    }, opts.initState)
    this.store = new ObservableStore(initState)
    this.memStore = new ObservableStore({})
    this.store.subscribe(() => this._updateMemstore())
  }

  getNoticesList () {
    return this.store.getState().noticesList
  }

  getUnreadNotices () {
    const notices = this.getNoticesList()
    return notices.filter((notice) => notice.read === false)
  }

  getLatestUnreadNotice () {
    const unreadNotices = this.getUnreadNotices()
    return unreadNotices[unreadNotices.length - 1]
  }

  setNoticesList (noticesList) {
    this.store.updateState({ noticesList })
    return Promise.resolve(true)
  }

  markNoticeRead (noticeToMark, cb) {
    cb = cb || function (err) { if (err) throw err }
    try {
      var notices = this.getNoticesList()
      var index = notices.findIndex((currentNotice) => currentNotice.id === noticeToMark.id)
      notices[index].read = true
      notices[index].body = ''
      this.setNoticesList(notices)
      const latestNotice = this.getLatestUnreadNotice()
      cb(null, latestNotice)
    } catch (err) {
      cb(err)
    }
  }

  updateNoticesList () {
    return this._retrieveNoticeData().then((newNotices) => {
      var oldNotices = this.getNoticesList()
      var combinedNotices = this._mergeNotices(oldNotices, newNotices)
      return Promise.resolve(this.setNoticesList(combinedNotices))
    })
  }

  startPolling () {
    if (this.noticePoller) {
      clearInterval(this.noticePoller)
    }
    this.noticePoller = setInterval(() => {
      this.noticeController.updateNoticesList()
    }, 300000)
  }

  _mergeNotices (oldNotices, newNotices) {
    var noticeMap = this._mapNoticeIds(oldNotices)
    newNotices.forEach((notice) => {
      if (noticeMap.indexOf(notice.id) === -1) {
        oldNotices.push(notice)
      }
    })
    return oldNotices
  }

  _mapNoticeIds (notices) {
    return notices.map((notice) => notice.id)
  }

  _retrieveNoticeData () {
    // Placeholder for the API.
    return Promise.resolve(hardCodedNotices)
  }

  _updateMemstore () {
    const lastUnreadNotice = this.getLatestUnreadNotice()
    const noActiveNotices = !lastUnreadNotice
    this.memStore.updateState({ lastUnreadNotice, noActiveNotices })
  }

}