pinafore/routes/_utils/store.js

123 lines
3.6 KiB
JavaScript
Raw Normal View History

import { Store } from 'svelte/store.js'
2018-01-23 05:55:25 +00:00
const LOCAL_STORAGE_KEYS = new Set([
"currentInstance",
"currentRegisteredInstance",
"currentRegisteredInstanceName",
"instanceNameInSearch",
"instanceThemes",
"loggedInInstances",
"loggedInInstancesInOrder"
])
2018-01-23 05:16:27 +00:00
2018-01-13 06:05:57 +00:00
const LS = process.browser && localStorage
class PinaforeStore extends Store {
2018-01-13 06:05:57 +00:00
constructor(state) {
super(state)
if (process.browser) {
2018-01-23 05:55:25 +00:00
this.keysToStore = {}
2018-01-13 06:05:57 +00:00
let newState = {}
for (let i = 0, len = LS.length; i < len; i++) {
let key = LS.key(i)
if (key.startsWith('store_')) {
let item = LS.getItem(key)
newState[key.substring(6)] = item === 'undefined' ? undefined : JSON.parse(item)
}
}
2018-01-13 06:05:57 +00:00
this.set(newState)
this.onchange((state, changed) => {
Object.keys(changed).forEach(change => {
2018-01-23 05:55:25 +00:00
if (LOCAL_STORAGE_KEYS.has(change)) {
this.keysToStore[change] = true
2018-01-13 06:05:57 +00:00
}
})
})
}
}
save() {
if (process.browser) {
2018-01-23 05:55:25 +00:00
Object.keys(this.keysToStore).forEach(key => {
2018-01-13 06:05:57 +00:00
LS.setItem(`store_${key}`, JSON.stringify(this.get(key)))
})
2018-01-23 05:55:25 +00:00
this.keysToStore = {}
}
}
setForTimeline(instanceName, timelineName, obj) {
let timelines = this.get('timelines') || {}
let timelineData = timelines[instanceName] || {}
timelineData[timelineName] = Object.assign(timelineData[timelineName] || {}, obj)
timelines[instanceName] = timelineData
this.set({timelines: timelines})
}
}
const store = new PinaforeStore({
2018-01-13 06:24:54 +00:00
instanceNameInSearch: '',
currentRegisteredInstance: null,
currentRegisteredInstanceName: '',
currentInstance: null,
loggedInInstances: {},
loggedInInstancesInOrder: [],
instanceThemes: {}
})
2018-01-09 02:14:21 +00:00
store.compute(
'isUserLoggedIn',
2018-01-13 06:24:54 +00:00
['currentInstance', 'loggedInInstances'],
(currentInstance, loggedInInstances) => !!(currentInstance && Object.keys(loggedInInstances).includes(currentInstance))
2018-01-09 02:14:21 +00:00
)
store.compute(
'loggedInInstancesAsList',
['currentInstance', 'loggedInInstances', 'loggedInInstancesInOrder'],
(currentInstance, loggedInInstances, loggedInInstancesInOrder) => {
return loggedInInstancesInOrder.map(instanceName => {
return Object.assign({
current: currentInstance === instanceName,
name: instanceName
}, loggedInInstances[instanceName])
})
}
)
2018-01-13 22:19:51 +00:00
store.compute(
'currentInstanceData',
['currentInstance', 'loggedInInstances'],
(currentInstance, loggedInInstances) => {
return Object.assign({
name: currentInstance
}, loggedInInstances[currentInstance])
})
2018-01-23 05:16:27 +00:00
store.compute(
'accessToken',
['currentInstanceData'],
(currentInstanceData) => currentInstanceData.access_token
)
2018-01-14 01:41:15 +00:00
store.compute(
'currentTheme',
['currentInstance', 'instanceThemes'],
(currentInstance, instanceThemes) => {
return instanceThemes[currentInstance] || 'default'
}
)
store.compute('currentTimelineData', ['currentInstance', 'currentTimeline', 'timelines'],
(currentInstance, currentTimeline, timelines) => {
return ((timelines && timelines[currentInstance]) || {})[currentTimeline] || {}
})
store.compute('statusIds', ['currentTimelineData'], (currentTimelineData) => currentTimelineData.statusIds || [])
store.compute('runningUpdate', ['currentTimelineData'], (currentTimelineData) => currentTimelineData.runningUpdate)
store.compute('initialized', ['currentTimelineData'], (currentTimelineData) => currentTimelineData.initialized)
store.compute('lastStatusId', ['statusIds'], (statusIds) => statusIds.length && statusIds[statusIds.length - 1])
2018-01-09 02:14:21 +00:00
if (process.browser && process.env.NODE_ENV !== 'production') {
window.store = store // for debugging
}
export { store }