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