diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 9f79cf038..785bb7b33 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -85,7 +85,7 @@ module.exports = class MetamaskController extends EventEmitter { // notices this.noticeController = new NoticeController({ - configManager: this.configManager, + initState: initState.NoticeController, }) this.noticeController.updateNoticesList() // to be uncommented when retrieving notices from a remote server. @@ -189,7 +189,7 @@ module.exports = class MetamaskController extends EventEmitter { this.messageManager.memStore.getState(), this.keyringController.memStore.getState(), this.preferencesController.store.getState(), - this.noticeController.getState(), + this.noticeController.memStore.getState(), // config manager this.configManager.getConfig(), { diff --git a/app/scripts/migrations/008.js b/app/scripts/migrations/008.js new file mode 100644 index 000000000..7f6e72ee6 --- /dev/null +++ b/app/scripts/migrations/008.js @@ -0,0 +1,36 @@ +const version = 8 + +/* + +This migration breaks out the NoticeController substate + +*/ + +const extend = require('xtend') + +module.exports = { + version, + + migrate: function (versionedData) { + versionedData.meta.version = version + try { + const state = versionedData.data + const newState = transformState(state) + versionedData.data = newState + } catch (err) { + console.warn(`MetaMask Migration #${version}` + err.stack) + } + return Promise.resolve(versionedData) + }, +} + +function transformState (state) { + const newState = extend(state, { + NoticeController: { + noticesList: state.noticesList || [], + }, + }) + delete newState.noticesList + + return newState +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index d608f5314..a25d3b044 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -18,4 +18,5 @@ module.exports = [ require('./005'), require('./006'), require('./007'), + require('./008'), ] diff --git a/app/scripts/notice-controller.js b/app/scripts/notice-controller.js index c3777b4b1..ba7c68df4 100644 --- a/app/scripts/notice-controller.js +++ b/app/scripts/notice-controller.js @@ -1,36 +1,37 @@ 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.configManager = opts.configManager this.noticePoller = null + const initState = extend({ + noticesList: [], + }, opts.initState) + this.store = new ObservableStore(initState) + this.memStore = new ObservableStore({}) + this.store.subscribe(() => this._updateMemstore()) } - getState () { - var lastUnreadNotice = this.getLatestUnreadNotice() + getNoticesList () { + return this.store.getState().noticesList + } - return { - lastUnreadNotice: lastUnreadNotice, - noActiveNotices: !lastUnreadNotice, - } + getUnreadNotices () { + const notices = this.getNoticesList() + return notices.filter((notice) => notice.read === false) } - getNoticesList () { - var data = this.configManager.getData() - if ('noticesList' in data) { - return data.noticesList - } else { - return [] - } + getLatestUnreadNotice () { + const unreadNotices = this.getUnreadNotices() + return unreadNotices[unreadNotices.length - 1] } - setNoticesList (list) { - var data = this.configManager.getData() - data.noticesList = list - this.configManager.setData(data) + setNoticesList (noticesList) { + this.store.updateState({ noticesList }) return Promise.resolve(true) } @@ -56,14 +57,6 @@ module.exports = class NoticeController extends EventEmitter { }) } - getLatestUnreadNotice () { - var notices = this.getNoticesList() - var filteredNotices = notices.filter((notice) => { - return notice.read === false - }) - return filteredNotices[filteredNotices.length - 1] - } - startPolling () { if (this.noticePoller) { clearInterval(this.noticePoller) @@ -92,5 +85,10 @@ module.exports = class NoticeController extends EventEmitter { return Promise.resolve(hardCodedNotices) } + _updateMemstore () { + const lastUnreadNotice = this.getLatestUnreadNotice() + const noActiveNotices = !lastUnreadNotice + this.memStore.updateState({ lastUnreadNotice, noActiveNotices }) + } }