@matthew.ngo/react-filter-pilot
Version:
Powerful filtering, pagination, and sorting for React with TanStack Query integration
3 lines • 3.21 kB
JavaScript
;var reactQuery=require('@tanstack/react-query'),react=require('react');/* @matthew.ngo/react-filter-pilot - MIT License */
var _=Object.defineProperty;var n=(s,a)=>_(s,"name",{value:a,configurable:true});function J(s){const a=reactQuery.useQueryClient(),{filterPilot:f,mutationFn:Q,onSuccess:l,onError:T,onSettled:g,invalidateOnSuccess:F=true,optimisticUpdate:v,updateAllQueries:E=false,queryFilter:q,findItemFn:h,updateItemFn:O,maxQueriesUpdated:V=10,debug:o=false,mutationOptions:k={}}=s,c=react.useRef(new Set),w=react.useRef(),m=react.useRef([]),I=react.useRef(false),M=react.useCallback(()=>f.getQueryKey(),[f]),K=react.useCallback(async()=>{if(!(I.current||m.current.length===0)){I.current=true;try{await m.current.shift()?.();}finally{I.current=false,m.current.length>0&&K();}}},[]);react.useCallback(e=>{m.current.push(e),K();},[K]);const C=react.useCallback(e=>{let t=a.getQueryCache().findAll({predicate:n(r=>(Array.isArray(r.queryKey)?r.queryKey[0]:r.queryKey)===e,"predicate")});return q&&(t=t.filter(q)),t.length>V&&(t=t.slice(0,V)),t},[a,q,V,o]),U=react.useCallback(()=>{w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{const e=M();a.invalidateQueries({queryKey:e.slice(0,-1),exact:false,refetchType:"active"});},50);},[a,M]);return reactQuery.useMutation({mutationFn:n(async e=>{const i=`mutation_${Date.now()}_${Math.random()}`;c.current.add(i);try{return await Q(e)}finally{c.current.delete(i);}},"mutationFn"),onMutate:n(async e=>{const i=`mutation_${Date.now()}_${Math.random()}`,t=M();if(v||E&&h&&O)try{await a.cancelQueries({queryKey:t.slice(0,-1),exact:!1});const r=a.getQueryData(t),d={};if(c.current.size<=1&&(v&&a.setQueryData(t,u=>{if(!u?.data)return u;const y=v(e);return {...u,data:y,totalRecords:u.totalRecords+(y.length>(u.data?.length||0)?1:y.length<(u.data?.length||0)?-1:0)}}),E&&h&&O)){const u=Array.isArray(t)?t[0]:t,y=C(u);let $=0;for(const A of y){const R=A.queryKey,P=a.getQueryData(R);P?.data&&(d[A.queryHash]={queryKey:R,data:P},a.setQueryData(R,D=>{if(!D?.data)return D;const x=D.data.map(S=>h(S,e)?O(S,e):S);return $++,{...D,data:x}}));}}return {previousData:r,previousDataMap:d,mutationId:i,wasOptimistic:c.current.size<=1}}catch{return {mutationId:i,wasOptimistic:false}}return {mutationId:i,wasOptimistic:false}},"onMutate"),onError:n((e,i,t)=>{if(t?.wasOptimistic){if(t?.previousData){const r=M();a.setQueryData(r,t.previousData);}if(t?.previousDataMap)for(const r in t.previousDataMap){const{queryKey:d,data:u}=t.previousDataMap[r];a.setQueryData(d,u);}}F&&U(),T?.(e,i,t);},"onError"),onSuccess:n((e,i,t)=>{F&&U(),l?.(e,i,t);},"onSuccess"),onSettled:n((e,i,t,r)=>{r?.mutationId&&c.current.delete(r.mutationId),F&&!i&&setTimeout(()=>{U();},100),g?.(e,i,t,r);},"onSettled"),retry:false,networkMode:"online",...k})}n(J,"useFilterMutation");function Z({filterPilot:s,mutationFn:a,itemIdField:f="id",...Q}){return J({filterPilot:s,mutationFn:a,updateAllQueries:true,findItemFn:n((l,T)=>l[f]===T,"findItemFn"),updateItemFn:n((l,T,g)=>({...l,...g}),"updateItemFn"),...Q})}n(Z,"useItemMutation");exports.useFilterMutation=J;exports.useItemMutation=Z;//# sourceMappingURL=useFilterMutation.cjs.map
//# sourceMappingURL=useFilterMutation.cjs.map