swr-global-state
Version:
Zero-setup & simple global state management for React Components
2 lines (1 loc) • 2.64 kB
JavaScript
;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("react"),g=require("swr"),I=c=>c&&typeof c=="object"&&"default"in c?c:{default:c},q=I(g);function H(c,a){let t;return{debouncedFunc:(...n)=>{clearTimeout(t),t=setTimeout(()=>c(...n),a)},cleanup:()=>{clearTimeout(t)}}}function K(c,a){let t=0,r;return{throttledFunc:(...u)=>{const o=Date.now();o-t>=a?(t=o,c(...u)):(clearTimeout(r),r=setTimeout(()=>{t=Date.now(),c(...u)},a-(o-t)))},cleanup:()=>{clearTimeout(r)}}}function x(c,a,t,r){if(a.customFunction)return{rateLimitedFunc:a.customFunction(c,a.delay),cleanup:()=>{}};const e=async(n,u)=>{t==null||t();try{await c(n,u)}finally{r==null||r()}};switch(a.type){case"debounce":{const{debouncedFunc:n,cleanup:u}=H(e,a.delay);return{rateLimitedFunc:n,cleanup:u}}case"throttle":{const{throttledFunc:n,cleanup:u}=K(e,a.delay);return{rateLimitedFunc:n,cleanup:u}}default:return{rateLimitedFunc:e,cleanup:()=>{}}}}function w(c,a){const{key:t,initial:r,persistor:e,onError:n,retryOnError:u=!0,rateLimit:o}=c,m=l.useMemo(()=>(t==null?void 0:t.toString())||"",[t]),{cache:F}=g.useSWRConfig(),f=l.useRef(null),[p,b]=l.useState(!1),S=l.useCallback(()=>!(e!=null&&e.onSet)||!o?null:x(async(d,s)=>{try{await Promise.resolve(e.onSet(d,s))}catch(h){if(n==null||n(h),!u)throw h}},o,()=>b(!0),()=>b(!1)),[e==null?void 0:e.onSet,o,n,u]);l.useEffect(()=>{if(o&&!f.current){const i=S();i&&(f.current={func:i.rateLimitedFunc,cleanup:i.cleanup})}return()=>{f.current&&(f.current.cleanup(),f.current=null)}},[o,S]);const k=l.useCallback(async()=>{var i,d;try{const s=(i=F.get(m))==null?void 0:i.data;return e!=null&&e.onGet?s===void 0?await Promise.resolve(e.onGet(t))??r:s:s??r}catch(s){if(n==null||n(s),u)throw s;return((d=F.get(m))==null?void 0:d.data)??r}},[F,m,e==null?void 0:e.onGet,t,r,n,u]),y=q.default(t,k,{fallbackData:r,revalidateOnFocus:!1,revalidateOnReconnect:!1,refreshWhenHidden:!1,refreshWhenOffline:!1,...a}),{data:C,mutate:L,error:P,isLoading:v}=y,M=l.useCallback(async(i,d)=>L(async s=>{var W;const h=s??((W=F.get(m))==null?void 0:W.data)??C,D=async T=>{if(e!=null&&e.onSet)if(f.current)f.current.func(t,T);else try{await Promise.resolve(e.onSet(t,T))}catch(O){if(n==null||n(O),!u)throw O}};if(typeof i!="function")return await D(i),i;const G=i,R=await Promise.resolve(G(h));return await D(R),R},d),[L,t,e==null?void 0:e.onSet,n,u,m]),j=l.useMemo(()=>({...y,isLoading:v,error:P,isPersisting:p}),[y,v,P,p]);return[C,M,j]}function _(c,a){return t=>w({...c,initial:t??c.initial},a)}const z={createStore:_,useStore:w};exports.createStore=_;exports.default=z;exports.useStore=w;