Facebook-Events-iCal-Converter/lib/frontend/services/storageListener.js

52 lines
1.3 KiB
JavaScript

import { STORAGE_KEYS } from '../constants'
import { configStore, eventStore } from '../stores'
class StorageListener {
constructor() {
this._storeSubscribers = new Set()
}
register() {
window.addEventListener('storage', this._handleStorageChange)
const unsubscribeConfigStore = configStore.subscribe(this._handleConfigStoreChange)
const unsubscribeEventStore = eventStore.subscribe(this._handleEventStoreChange)
this._storeSubscribers = new Set([
...this._storeSubscribers,
unsubscribeConfigStore,
unsubscribeEventStore,
])
}
unregister() {
window.removeEventListener('storage', this._handleStorageChange)
this._storeSubscribers.forEach((unsubscribe) => unsubscribe())
this._storeSubscribers.clear()
}
_handleStorageChange(event) {
switch (event.key) {
case STORAGE_KEYS.CONFIG:
configStore.set(JSON.parse(event.newValue))
break
case STORAGE_KEYS.EVENTS:
eventStore.set({ events: JSON.parse(event.newValue) })
break
default:
return
}
}
_handleConfigStoreChange(value) {
localStorage.setItem(STORAGE_KEYS.CONFIG, JSON.stringify(value))
}
_handleEventStoreChange(value) {
localStorage.setItem(STORAGE_KEYS.EVENTS, JSON.stringify(value.events || []))
}
}
export default new StorageListener()