stunk
Version:
Stunk is a lightweight, framework-agnostic state management library for JavaScript and TypeScript. It uses chunk-based state units for efficient updates, reactivity, and performance optimization in React, Vue(WIP), Svelte(Coming soon), and Vanilla JS/TS a
1 lines • 4.07 kB
JavaScript
import {b}from'../chunk-DLH6F22O.js';import {b as b$1}from'../chunk-PZ7A72TA.js';import {useState,useEffect,useCallback,useMemo,useRef}from'react';function D(n,t,e={}){let{useShallowEqual:o=false}=e,u=n.get(),s=t(u),i=b(s),a=()=>{let m=n.get(),l=t(m);(o?!b$1(l,s):l!==s)&&(s=l,i.set(l));},c=n.subscribe(a),{set:d,reset:P,...T}=i;return {...T,derive:m=>D(i,m,e),destroy:()=>{c(),i.destroy();}}}function V(n,t){let e=t?D(n,t):n,[o,u]=useState(()=>e.get());useEffect(()=>{let c=e.subscribe(d=>{u(()=>d);});return ()=>c()},[e]);let s=useCallback(c=>{"set"in n&&n.set(c);},[n]),i=useCallback(()=>{"reset"in n&&n.reset();},[n]),a=useCallback(()=>{n.destroy();},[n]);return [o,s,i,a]}function ee(n,t){let[e]=V(n,t);return e}function R(n){return "nextPage"in n}function x(n){return "setParams"in n}function te(n){return "clearParams"in n}function se(n){return "__scopedFactory"in n}function F(n,t={}){let e=useMemo(()=>se(n)?n.__scopedFactory():n,[n]),o=t.params,{fetchOnMount:u=false,onSuccess:s,onError:i,enabled:a=true}=t,[c,d]=useState(()=>e.get()),P=useRef({resolvedParams:o,fetchOnMount:u,onSuccess:s,onError:i});P.current={resolvedParams:o,fetchOnMount:u,onSuccess:s,onError:i};let T=useRef(e.get()),m=useRef(a),l=useRef(false);useEffect(()=>{let r=m.current;if(m.current=a,l.current=false,!r&&a){l.current=true;let{resolvedParams:v}=P.current;v&&x(e)?e.setParams(v):e.reload();}else r&&!a&&e.cancel?.();},[a,e]),useEffect(()=>{let r=e.get();d(r),T.current=r;let v=e.subscribe(f=>{let q=T.current;q.loading&&!f.loading&&!f.error&&f.data!==null&&P.current.onSuccess?.(f.data),q.loading&&!f.loading&&f.error&&P.current.onError?.(f.error),T.current=f,d(f);}),{resolvedParams:_,fetchOnMount:Y}=P.current;return _&&x(e)?a&&e.setParams(_):a&&(Y||r.data===null&&!r.loading)&&e.reload(),()=>{v(),e.cleanup();}},[e]);let E=useRef(false),g=o?JSON.stringify(o):null;useEffect(()=>{if(!E.current){E.current=true;return}if(l.current){l.current=false;return}if(!a)return;let r=P.current.resolvedParams;r&&x(e)&&e.setParams(r);},[g]);let p=useCallback(r=>e.reload(r),[e]),b=useCallback(r=>e.refresh(r),[e]),U=useCallback(r=>e.mutate(r),[e]),M=useCallback(r=>e.reset(r),[e]),C=useCallback(r=>{x(e)&&e.setParams(r);},[e]),y=useCallback(()=>{te(e)&&e.clearParams();},[e]),O=useCallback(()=>R(e)?e.nextPage():Promise.resolve(),[e]),H=useCallback(()=>R(e)?e.prevPage():Promise.resolve(),[e]),j=useCallback(r=>R(e)?e.goToPage(r):Promise.resolve(),[e]),J=useCallback(()=>R(e)?e.resetPagination():Promise.resolve(),[e]),{data:K,loading:N,error:B,lastFetched:G,isPlaceholderData:Q=false,pagination:X}=c,A={data:K,loading:N,error:B,lastFetched:G,isPlaceholderData:Q,reload:p,refresh:b,mutate:U,reset:M};if(x(e)&&(A.setParams=C,A.clearParams=y),R(e)){let r=A;r.pagination=X,r.nextPage=O,r.prevPage=H,r.goToPage=j,r.resetPagination=J;}return A}function ie(n,t={}){let{initialParams:e,params:o,autoLoad:u=true,threshold:s=1,fetchOnMount:i}=t,a=F(n,{...o&&{params:o},...!o&&e&&{initialParams:e},fetchOnMount:i}),{loading:c,pagination:d,nextPage:P,data:T,error:m,isPlaceholderData:l}=a,E=useRef(c),g=useRef(d?.hasMore??false),p=useRef(P);E.current=c,g.current=d?.hasMore??false,p.current=P;let b=useRef(null);useEffect(()=>{if(!u||typeof window>"u"||!("IntersectionObserver"in window))return;let C=new IntersectionObserver(O=>{O[0].isIntersecting&&!E.current&&g.current&&p.current();},{threshold:s}),y=b.current;return y&&C.observe(y),()=>{y&&C.unobserve(y),C.disconnect();}},[u,s]);let U=useCallback(()=>{!E.current&&g.current&&p.current();},[]),M=c&&T!==null&&T.length>0&&(d?.page??1)>1;return {...a,data:T,error:m,isPlaceholderData:l??false,isFetchingMore:M,hasMore:d?.hasMore??false,loadMore:U,observerTarget:b}}function le(n){let[t,e]=useState(()=>n.get());useEffect(()=>(e(n.get()),n.subscribe(i=>{e(i);})),[n]);let o=useCallback((...s)=>n.mutate(...s),[n]),u=useCallback(()=>n.reset(),[n]);return {loading:t.loading,data:t.data,error:t.error,isSuccess:t.isSuccess,mutate:o,reset:u}}export{F as useAsyncChunk,V as useChunk,ee as useChunkValue,ie as useInfiniteAsyncChunk,le as useMutation};