{"version":3,"sources":["../../../src/hooks/filtering/utils.ts","../../../src/hooks/filtering/useFilters.ts"],"names":["countActiveFilters","filters","value","useFilters","options","parsers","onChange","history","scroll","shallow","setFiltersState","useQueryStates","hasFilters","useMemo","activeCount","setFilter","useCallback","key","newFilters","setFilters","updates","merged","removeFilter","clearFilters","toggleFilter","getFilterValues","isFilterActive","currentValue"],"mappings":"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","file":"index.cjs","sourcesContent":["export function countActiveFilters(filters: Record<string, unknown>): number {\n  return Object.values(filters).filter(\n    (value) =>\n      value !== undefined &&\n      value !== null &&\n      value !== '' &&\n      !(Array.isArray(value) && value.length === 0)\n  ).length\n}\n","import { useQueryStates } from 'nuqs'\nimport { useCallback, useMemo } from 'react'\nimport type { UseFiltersOptions, UseFiltersResult, Values } from './types'\nimport { countActiveFilters } from './utils'\n\n// biome-ignore lint/suspicious/noExplicitAny: parsers can be any nuqs parser type\nexport function useFilters<TParsers extends Record<string, any>>(\n  options: UseFiltersOptions<TParsers>\n): UseFiltersResult<Values<TParsers>> {\n  const { parsers, onChange, history = 'replace', scroll = false, shallow = true } = options\n\n  const [filters, setFiltersState] = useQueryStates(parsers, {\n    history,\n    scroll,\n    shallow,\n  })\n\n  const hasFilters = useMemo(() => countActiveFilters(filters) > 0, [filters])\n\n  const activeCount = useMemo(() => countActiveFilters(filters), [filters])\n\n  const setFilter = useCallback(\n    (key: keyof Values<TParsers>, value: unknown) => {\n      // biome-ignore lint/suspicious/noExplicitAny: dynamic filter updates\n      setFiltersState({ [key]: value === undefined ? null : value } as any)\n\n      if (onChange) {\n        const newFilters = { ...filters, [key]: value } as Values<TParsers>\n        onChange(newFilters)\n      }\n    },\n    [setFiltersState, filters, onChange]\n  )\n\n  const setFilters = useCallback(\n    (newFilters: Partial<Values<TParsers>>) => {\n      const updates: Record<string, unknown> = {}\n      for (const [key, value] of Object.entries(newFilters)) {\n        updates[key] = value === undefined ? null : value\n      }\n      // biome-ignore lint/suspicious/noExplicitAny: dynamic filter updates\n      setFiltersState(updates as any)\n\n      if (onChange) {\n        const merged = { ...filters, ...newFilters } as Values<TParsers>\n        onChange(merged)\n      }\n    },\n    [setFiltersState, filters, onChange]\n  )\n\n  const removeFilter = useCallback(\n    (key: keyof Values<TParsers>) => {\n      // biome-ignore lint/suspicious/noExplicitAny: dynamic filter updates\n      setFiltersState({ [key]: null } as any)\n\n      if (onChange) {\n        const newFilters = { ...filters } as Values<TParsers>\n        delete newFilters[key as keyof typeof newFilters]\n        onChange(newFilters)\n      }\n    },\n    [setFiltersState, filters, onChange]\n  )\n\n  const clearFilters = useCallback(() => {\n    const updates: Record<string, null> = {}\n    for (const key of Object.keys(filters)) {\n      updates[key] = null\n    }\n    // biome-ignore lint/suspicious/noExplicitAny: dynamic filter updates\n    setFiltersState(updates as any)\n\n    if (onChange) {\n      onChange({} as Values<TParsers>)\n    }\n  }, [setFiltersState, filters, onChange])\n\n  const toggleFilter = useCallback(\n    (key: keyof Values<TParsers>, value: unknown) => {\n      const currentValue = filters[key]\n      if (currentValue === value) {\n        removeFilter(key)\n      } else {\n        setFilter(key, value)\n      }\n    },\n    [filters, setFilter, removeFilter]\n  )\n\n  const getFilterValues = useCallback(\n    (key: keyof Values<TParsers>): unknown[] => {\n      const value = filters[key]\n      if (Array.isArray(value)) return value\n      if (value !== undefined && value !== null) return [value]\n      return []\n    },\n    [filters]\n  )\n\n  const isFilterActive = useCallback(\n    (key: keyof Values<TParsers>, value?: unknown): boolean => {\n      const currentValue = filters[key]\n      if (value !== undefined) {\n        if (Array.isArray(currentValue)) {\n          return currentValue.includes(value)\n        }\n        return currentValue === value\n      }\n      return currentValue !== undefined && currentValue !== null\n    },\n    [filters]\n  )\n\n  return {\n    filters: filters as Values<TParsers>,\n    hasFilters,\n    activeCount,\n    setFilter: setFilter as <K extends keyof Values<TParsers>>(\n      key: K,\n      value: Values<TParsers>[K]\n    ) => void,\n    setFilters,\n    removeFilter,\n    clearFilters,\n    toggleFilter: toggleFilter as <K extends keyof Values<TParsers>>(\n      key: K,\n      value: Values<TParsers>[K]\n    ) => void,\n    getFilterValues,\n    isFilterActive: isFilterActive as <K extends keyof Values<TParsers>>(\n      key: K,\n      value?: Values<TParsers>[K]\n    ) => boolean,\n    isPending: false,\n  }\n}\n"]}