Pinafore-Web-Client-Frontend/src/routes/_store/LocalStorageStore.js

52 lines
1.3 KiB
JavaScript
Raw Normal View History

import { safeLocalStorage as LS } from '../_utils/safeLocalStorage.js'
import { lifecycle } from '../_utils/lifecycle.js'
import { safeParse } from '../_utils/safeParse.js'
import * as storePackage from 'svelte/store.umd.js'
const { Store } = storePackage
2018-01-28 23:56:25 +01:00
2018-01-28 22:09:39 +01:00
export class LocalStorageStore extends Store {
2018-02-09 07:29:29 +01:00
constructor (state, keysToWatch) {
2018-01-28 22:09:39 +01:00
super(state)
if (!process.browser) {
return
}
this._keysToWatch = keysToWatch
this._keysToSave = {}
2019-08-03 22:49:37 +02:00
const newState = {}
2018-01-28 22:09:39 +01:00
for (let i = 0, len = LS.length; i < len; i++) {
2019-08-03 22:49:37 +02:00
const key = LS.key(i)
2018-01-28 22:09:39 +01:00
if (key.startsWith('store_')) {
2019-08-03 22:49:37 +02:00
const item = LS.getItem(key)
2018-01-28 23:56:25 +01:00
newState[key.substring(6)] = safeParse(item)
2018-01-28 22:09:39 +01:00
}
}
this.set(newState)
this.on('state', ({ changed }) => {
2018-01-28 22:09:39 +01:00
Object.keys(changed).forEach(change => {
if (this._keysToWatch.has(change)) {
this._keysToSave[change] = true
}
})
})
2018-02-28 08:38:33 +01:00
if (process.browser) {
lifecycle.addEventListener('statechange', e => {
if (e.newState === 'passive') {
console.log('saving LocalStorageStore...')
this.save()
}
})
2018-02-28 08:38:33 +01:00
}
2018-01-28 22:09:39 +01:00
}
2018-02-09 07:29:29 +01:00
save () {
2018-01-28 22:09:39 +01:00
if (!process.browser) {
return
}
Object.keys(this._keysToSave).forEach(key => {
LS.setItem(`store_${key}`, JSON.stringify(this.get()[key]))
2018-01-28 22:09:39 +01:00
})
this._keysToSave = {}
}
2018-02-09 07:29:29 +01:00
}