1
0
Fork 0
mirror of synced 2024-08-09 15:17:57 +12:00
budibase/packages/frontend-core/src/stores/localStorage.js
2022-01-18 09:39:19 +00:00

44 lines
1.2 KiB
JavaScript

import { get, writable } from "svelte/store"
export const createLocalStorageStore = (localStorageKey, initialValue) => {
const store = writable(initialValue, () => {
// Hydrate from local storage when we get a new subscriber
hydrate()
// Listen for local storage changes and keep store in sync
const storageListener = ({ key }) => key === localStorageKey && hydrate()
window.addEventListener("storage", storageListener)
return () => window.removeEventListener("storage", storageListener)
})
// New store setter which updates the store and localstorage
const set = value => {
store.set(value)
localStorage.setItem(localStorageKey, JSON.stringify(value))
}
// New store updater which updates the store and localstorage
const update = updaterFn => set(updaterFn(get(store)))
// Hydrates the store from localstorage
const hydrate = () => {
const localValue = localStorage.getItem(localStorageKey)
if (localValue == null) {
set(initialValue)
} else {
try {
store.set(JSON.parse(localValue))
} catch {
set(initialValue)
}
}
}
// Patch the default svelte store functions with our overrides
return {
...store,
set,
update,
}
}