UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

2 lines (1 loc) 4.32 kB
import{useEffect as $,useRef as R,useState as A}from"react";var f=new Map;function k(o,e){let[t,l]=A(e?.initialValue),[a,p]=A(!!e?.withLoading),c=R(e?.initialValue),i=R(e?.equals||((n,s)=>n===s)),S=o.getId(),u=n=>{(c.current===void 0||!i.current(n,c.current))&&(c.current=n,l(n))};return $(()=>{f.has(S)||f.set(S,{lastValue:void 0,listeners:new Set,unsubscribe:null});let n=f.get(S);return n.listeners.add(u),n.lastValue!==void 0?(u(n.lastValue),e?.withLoading&&p(!1)):(e?.withLoading&&p(!0),o.select().then(s=>{n.lastValue=s,n.listeners.forEach(T=>T(s)),e?.withLoading&&p(!1)}).catch(s=>{e?.withLoading&&p(!1)})),n.unsubscribe||(n.unsubscribe=o.subscribe({notify:s=>{n.lastValue=s,n.listeners.forEach(T=>{try{T(s)}catch{}})}})),()=>{let s=f.get(S);s&&(s.listeners.delete(u),s.listeners.size===0&&(s.unsubscribe&&s.unsubscribe(),f.delete(S)))}},[o,S]),e?.withLoading?{data:t,isLoading:a}:t}import{useEffect as z,useState as F}from"react";var U=(o,e)=>{let[t,l]=F(void 0);return z(()=>{let a=!0;(async()=>{try{let i=await o.getState(),S=e(i);a&&l(S)}catch{}})();let c;try{c=o.subscribe(e,i=>{a&&l(i)})}catch{c=()=>{}}return()=>{a=!1,c()}},[o,e]),t};import{createContext as N,useContext as y,useEffect as E,useRef as _,useState as w}from"react";var h=(o,e)=>{for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(typeof e[t]=="object"&&e[t]!==null&&!Array.isArray(e[t])?((!o[t]||typeof o[t]!="object")&&(o[t]={}),h(o[t],e[t])):o[t]=e[t])};import{jsx as g}from"react/jsx-runtime";var m="useSynapseActions \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0430 contextSynapse";function ae(o,e){let{loadingComponent:t=null,mergeFn:l=h}=e||{},a=null,p=!1,c=(async()=>{try{a=await(o instanceof Promise?o:Promise.resolve(o)),p=!0}catch{}})(),i=N(null),S=()=>{let r=y(i);if(!r)throw new Error(m);return r.storage},u=()=>{let r=y(i);if(!r)throw new Error(m);return r.selectors},n=()=>{let r=y(i);if(!r)throw new Error(m);if("actions"in r)return r.actions;throw new Error("useSynapseActions: actions \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u044F createDispatcherFn \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")},s=()=>{let r=y(i);if(!r)throw new Error(m);if("state$"in r)return r.state$;throw new Error("useSynapseState$: state$ \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0438\u043F\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u044B \u0444\u0443\u043D\u043A\u0446\u0438\u0438 createDispatcherFn \u0438 createEffectConfig \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430.")};function T(r){function C({contextProps:d,...O}){let[W,L]=w(!1),[x,V]=w(p),D=_(`synapse-${a?.storage.name||"initializing"}`);return E(()=>{p||c.then(()=>{V(!0)})},[]),E(()=>{if(!x)return;let P=!0;return(async()=>{try{a&&d&&Object.keys(d).length>0&&await a.storage.update(b=>{l(b,d)}),P&&L(!0)}catch{}})(),()=>{P=!1}},[d,x]),x?W?g(i.Provider,{value:a,children:g(r,{...O})}):t||g("div",{children:"\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430..."}):t||g("div",{children:"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430..."})}let v=r.displayName||r.name||"Component";return C.displayName=`SynapseContext(${v})`,C}return{contextSynapse:T,useSynapseStorage:S,useSynapseSelectors:u,useSynapseActions:n,useSynapseState$:s,cleanupSynapse:async()=>(await c,a?.destroy()||Promise.resolve())}}export{ae as createSynapseCtx,k as useSelector,U as useStorageSubscribe};