simplify implementation

This commit is contained in:
Kaspars 2024-05-07 12:54:33 +02:00
parent 6249631a72
commit 6e6a2439c3

View File

@ -1,5 +1,5 @@
import {atom, onMount} from 'nanostores'; import { atom, onMount } from 'nanostores';
import { persistentAtom, windowPersistentEvents } from '@nanostores/persistent'; import { persistentAtom } from '@nanostores/persistent';
import { useStore } from '@nanostores/react'; import { useStore } from '@nanostores/react';
import { logger } from '@strudel/core'; import { logger } from '@strudel/core';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
@ -24,52 +24,24 @@ export const patternFilterName = {
export let sessionAtom = persistentAtom; export let sessionAtom = persistentAtom;
if (typeof sessionStorage !== 'undefined') { if (typeof sessionStorage !== 'undefined') {
const identity = a => a; const identity = (a) => a;
const eventsEngine = windowPersistentEvents;
sessionAtom = (name, initial = undefined, opts = {}) => { sessionAtom = (name, initial = undefined, opts = {}) => {
let encode = opts.encode || identity let encode = opts.encode || identity;
let decode = opts.decode || identity let decode = opts.decode || identity;
if (opts.listen) console.error('sessionAtom does not support "listen" option');
let store = atom(initial) let store = atom(sessionStorage[name] ? decode(sessionStorage[name]) : initial);
let set = store.set store.listen((newValue) => {
store.set = newValue => {
if (typeof newValue === 'undefined') { if (typeof newValue === 'undefined') {
delete sessionStorage[name] delete sessionStorage[name];
} else { } else {
sessionStorage[name] = encode(newValue) sessionStorage[name] = encode(newValue);
} }
set(newValue) });
}
function listener(e) { return store;
if (e.key === name) { };
if (e.newValue === null) {
set(undefined)
} else {
set(decode(e.newValue))
}
} else if (!sessionStorage[name]) {
set(undefined)
}
}
function restore() {
store.set(sessionStorage[name] ? decode(sessionStorage[name]) : initial)
}
onMount(store, () => {
restore()
if (opts.listen !== false) {
eventsEngine.addEventListener(name, listener, restore)
return () => {
eventsEngine.removeEventListener(name, listener, restore)
}
}
})
return store
}
} }
export let $viewingPatternData = sessionAtom( export let $viewingPatternData = sessionAtom(