mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-22 11:08:35 +00:00
simplify implementation
This commit is contained in:
parent
6249631a72
commit
6e6a2439c3
@ -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(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user