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