import ObservableStore from 'obs-store' /** * @typedef {Object} AlertControllerInitState * @property {Object} alertEnabledness - A map of any alerts that were suppressed keyed by alert ID, where the value * is the timestamp of when the user suppressed the alert. */ /** * @typedef {Object} AlertControllerOptions * @property {AlertControllerInitState} initState - The initial controller state */ export const ALERT_TYPES = { unconnectedAccount: 'unconnectedAccount', } const defaultState = { alertEnabledness: Object.keys(ALERT_TYPES) .reduce( (alertEnabledness, alertType) => { alertEnabledness[alertType] = true return alertEnabledness }, {}, ), unconnectedAccountAlertShownOrigins: {}, } /** * Controller responsible for maintaining * alert related state */ export default class AlertController { /** * @constructor * @param {AlertControllerOptions} [opts] - Controller configuration parameters */ constructor (opts = {}) { const { initState, preferencesStore } = opts const state = Object.assign( {}, defaultState, initState, { unconnectedAccountAlertShownOrigins: {}, }, ) this.store = new ObservableStore(state) const { selectedAddress } = preferencesStore.getState() this.selectedAddress = selectedAddress preferencesStore.subscribe(({ selectedAddress }) => { const currentState = this.store.getState() if (currentState.unconnectedAccountAlertShownOrigins && this.selectedAddress !== selectedAddress) { this.selectedAddress = selectedAddress this.store.updateState({ unconnectedAccountAlertShownOrigins: {} }) } }) } setAlertEnabledness (alertId, enabledness) { let { alertEnabledness } = this.store.getState() alertEnabledness = { ...alertEnabledness } alertEnabledness[alertId] = enabledness this.store.updateState({ alertEnabledness }) } /** * Sets the "switch to connected" alert as shown for the given origin * @param {string} origin - The origin the alert has been shown for */ setUnconnectedAccountAlertShown (origin) { let { unconnectedAccountAlertShownOrigins } = this.store.getState() unconnectedAccountAlertShownOrigins = { ...unconnectedAccountAlertShownOrigins } unconnectedAccountAlertShownOrigins[origin] = true this.store.updateState({ unconnectedAccountAlertShownOrigins }) } }