58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
import { writable, get, derived } from "svelte/store"
|
|
import { createLocalStorageStore } from "@budibase/frontend-core"
|
|
|
|
const createStateStore = () => {
|
|
const appId = window["##BUDIBASE_APP_ID##"] || "app"
|
|
const localStorageKey = `${appId}.state`
|
|
const persistentStore = createLocalStorageStore(localStorageKey, {})
|
|
|
|
// Initialise the temp store to mirror the persistent store
|
|
const tempStore = writable(get(persistentStore))
|
|
|
|
// Sets a value to state, optionally persistent
|
|
const setValue = (key, value, persist = false) => {
|
|
const storeToSave = persist ? persistentStore : tempStore
|
|
const storeToClear = persist ? tempStore : persistentStore
|
|
storeToSave.update(state => {
|
|
state[key] = value
|
|
return state
|
|
})
|
|
storeToClear.update(state => {
|
|
delete state[key]
|
|
return state
|
|
})
|
|
}
|
|
|
|
// Delete a certain key from both stores
|
|
const deleteValue = key => {
|
|
const stores = [tempStore, persistentStore]
|
|
stores.forEach(store => {
|
|
store.update(state => {
|
|
delete state[key]
|
|
return state
|
|
})
|
|
})
|
|
}
|
|
|
|
// Initialises the temporary state store with a certain value
|
|
const initialise = tempStore.set
|
|
|
|
// Derive the combination of both persisted and non persisted stores
|
|
const store = derived(
|
|
[tempStore, persistentStore],
|
|
([$tempStore, $persistentStore]) => {
|
|
return {
|
|
...$tempStore,
|
|
...$persistentStore,
|
|
}
|
|
}
|
|
)
|
|
|
|
return {
|
|
subscribe: store.subscribe,
|
|
actions: { setValue, deleteValue, initialise },
|
|
}
|
|
}
|
|
|
|
export const stateStore = createStateStore()
|