@matthew.ngo/react-filter-pilot
Version:
Powerful filtering, pagination, and sorting for React with TanStack Query integration
3 lines • 3.4 kB
JavaScript
import {a}from'../chunk-KDVV4H2M.js';import {useRef,useEffect,useMemo,useCallback}from'react';/* @matthew.ngo/react-filter-pilot - MIT License */
function T(n,e){const s=useRef(n),t=useRef(null);useEffect(()=>{if(e?.debounceMs)return t.current&&clearTimeout(t.current),t.current=setTimeout(()=>{s.current=n;},e.debounceMs),()=>{t.current&&clearTimeout(t.current);};s.current=n;},[n,e?.debounceMs]);const i=useMemo(()=>{const u=e?.debounceMs?s.current:n;if(!e)return {enabled:true,reason:""};if(e.enabled!==void 0&&!(typeof e.enabled=="function"?e.enabled(u):e.enabled))return {enabled:false,reason:"Fetch is disabled"};if(e.requiredFilters)for(const r of e.requiredFilters){const o=u[r];if(o==null||o===""||Array.isArray(o)&&o.length===0)return {enabled:false,reason:`Required filter "${String(r)}" is missing`}}if(e.conditionalRequirements){for(const r of e.conditionalRequirements)if(r.when(n))for(const o of r.require){const l=n[o];if(l==null||l===""||Array.isArray(l)&&l.length===0)return {enabled:false,reason:r.message||`Conditional requirement not met: "${String(o)}" is required`}}}if(e.minimumValues)for(const[r,o]of Object.entries(e.minimumValues)){const l=n[r];if(typeof l=="string"&&l.length<o)return {enabled:false,reason:`"${r}" must be at least ${o} characters`};if(typeof l=="number"&&l<o)return {enabled:false,reason:`"${r}" must be at least ${o}`}}if(e.validate){const r=e.validate(n);if(!r.valid)return {enabled:false,reason:r.message||"Validation failed"}}return {enabled:true,reason:""}},[n,e]),a=useCallback(async u=>{if(!i.enabled)throw e?.onFetchSkipped?.(i.reason,n),new Error(i.reason);e?.onFetchStart?.(n);try{const r=await u();return e?.onFetchEnd?.(r),r}catch(r){throw e?.onFetchError?.(r,n),r}},[i,n,e]);return {shouldFetch:i.enabled,fetchReason:i.reason,controlledFetch:a}}a(T,"useFetchControl");function k(n,e){return useMemo(()=>{const s=[];for(const t of e){const i=n[t];(i==null||i===""||Array.isArray(i)&&i.length===0)&&s.push(String(t));}return {isValid:s.length===0,missing:s,message:s.length>0?`Missing required filters: ${s.join(", ")}`:""}},[n,e])}a(k,"useRequiredFilters");function p(n,e){return useMemo(()=>{const s=[];for(const t of e){const i=n[t.if];if(t.equals!==void 0?i===t.equals:!!i){const u=Array.isArray(t.then)?t.then:[t.then];for(const r of u){const o=n[r];(!o||Array.isArray(o)&&o.length===0)&&s.push(`When "${String(t.if)}" is set${t.equals!==void 0?` to "${t.equals}"`:""}, "${String(r)}" is required`);}}}return {isValid:s.length===0,errors:s}},[n,e])}a(p,"useDependentFilters");function q(n,e){return useMemo(()=>{const s=[];for(const t of e){const i=t.filters.filter(u=>{const r=n[u];return r!=null&&r!==""&&!(Array.isArray(r)&&r.length===0)});let a=false;switch(t.condition){case "all":a=i.length===t.filters.length,a||s.push(t.message||`All of these filters must be set: ${t.filters.join(", ")}`);break;case "any":a=i.length>0,a||s.push(t.message||`At least one of these filters must be set: ${t.filters.join(", ")}`);break;case "none":a=i.length===0,a||s.push(t.message||`None of these filters should be set together: ${t.filters.join(", ")}`);break}}return {isValid:s.length===0,errors:s}},[n,e])}a(q,"useFilterCombinations");export{p as useDependentFilters,T as useFetchControl,q as useFilterCombinations,k as useRequiredFilters};//# sourceMappingURL=useAdvancedFetchControl.js.map
//# sourceMappingURL=useAdvancedFetchControl.js.map