UNPKG

@aminnairi/react-signal

Version:
2 lines (1 loc) 1.78 kB
import{useSyncExternalStore as e,useCallback as t}from"react";class s{subscribers;value;constructor(e){this.value=e,this.subscribers=[]}emit(e){this.value=e,this.subscribers.forEach((e=>{e()}))}getValue(){return this.value}subscribe(e){return this.subscribers.push(e),()=>{const t=this.subscribers.findIndex((t=>t===e));this.subscribers.splice(t,1)}}next(e){this.emit(e(this.value))}}class r extends s{key;storage;constructor({storage:e,key:t,fallback:s,parse:r}){try{super(r(JSON.parse(e.getItem(t)||"")))}catch{super(s)}this.key=t,this.storage=e}emit(e){this.storage.setItem(this.key,JSON.stringify(e)),super.emit(e)}remove(){this.storage.removeItem(this.key)}}class n extends r{constructor({key:e,fallback:t,parse:s}){super({storage:localStorage,key:e,fallback:t,parse:s})}}class i extends r{constructor({key:e,fallback:t,parse:s}){super({storage:sessionStorage,key:e,fallback:t,parse:s})}}const c=t=>e(t.subscribe.bind(t),t.getValue.bind(t)),u=e=>c(e());function o(e){return"function"==typeof e}function a(e){const r=new s(e);return function(){return[c(r),t((e=>{o(e)?r.next((t=>e(t))):r.emit(e)}),[])]}}function f(e){return"function"==typeof e}function l(e){const s=new n(e);return function(){return[c(s),t((e=>{f(e)?s.next((t=>e(t))):s.emit(e)}),[]),t((()=>{s.remove()}),[])]}}function b(e){return"function"==typeof e}function h(e){const s=new i(e);return function(){return[c(s),t((e=>{b(e)?s.next((t=>e(t))):s.emit(e)}),[]),t((()=>{s.remove()}),[])]}}export{n as LocalStorageSignal,i as SessionStorageSignal,s as Signal,r as StorageSignal,l as createLocalStorageState,h as createSessionStorageState,a as createState,f as isSetLocalStorageSignalConstructor,b as isSetSessionStorageSignalConstructor,o as isSetSignalConstructor,c as useSignal,u as useSignalConstructor};