{"version":3,"sources":["../../../src/hooks/multi-select/utils.ts","../../../src/hooks/multi-select/useMultiSelect.ts"],"names":["parseSelection","value","separator","item","serializeSelection","items","addItem","maxSelection","removeItem","i","useMultiSelect","options","defaultSelected","allItems","key","history","scroll","shallow","rawValue","setRawValue","useQueryState","parseAsString","selected","useMemo","count","isEmpty","isAllSelected","setSelected","useCallback","ids","limitedIds","select","id","newSelection","deselect","toggle","selectAll","itemsToSelect","deselectAll","isSelected"],"mappings":"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","file":"index.cjs","sourcesContent":["export function parseSelection(value: string | null, separator: string): string[] {\n  if (!value) return []\n  return value.split(separator).filter((item) => item.trim() !== '')\n}\n\nexport function serializeSelection(items: string[], separator: string): string | null {\n  if (items.length === 0) return null\n  return items.join(separator)\n}\n\nexport function toggleItem(items: string[], item: string): string[] {\n  const index = items.indexOf(item)\n  if (index === -1) {\n    return [...items, item]\n  }\n  return items.filter((i) => i !== item)\n}\n\nexport function addItem(items: string[], item: string, maxSelection?: number): string[] {\n  if (items.includes(item)) return items\n\n  if (maxSelection !== undefined && items.length >= maxSelection) {\n    return items\n  }\n\n  return [...items, item]\n}\n\nexport function removeItem(items: string[], item: string): string[] {\n  return items.filter((i) => i !== item)\n}\n","import { parseAsString, useQueryState } from 'nuqs'\nimport { useCallback, useMemo } from 'react'\nimport type { UseMultiSelectOptions, UseMultiSelectResult } from './types'\nimport { addItem, parseSelection, removeItem, serializeSelection } from './utils'\n\nexport function useMultiSelect(options: UseMultiSelectOptions = {}): UseMultiSelectResult {\n  const {\n    defaultSelected = [],\n    allItems = [],\n    key = 'selected',\n    separator = ',',\n    maxSelection,\n    history = 'replace',\n    scroll = false,\n    shallow = true,\n  } = options\n\n  const [rawValue, setRawValue] = useQueryState(\n    key,\n    parseAsString.withDefault(serializeSelection(defaultSelected, separator) ?? '').withOptions({\n      history,\n      scroll,\n      shallow,\n    })\n  )\n\n  const selected = useMemo(() => parseSelection(rawValue, separator), [rawValue, separator])\n\n  const count = selected.length\n  const isEmpty = count === 0\n  const isAllSelected = useMemo(\n    () => allItems.length > 0 && allItems.every((item) => selected.includes(item)),\n    [allItems, selected]\n  )\n\n  const setSelected = useCallback(\n    (ids: string[]) => {\n      const limitedIds = maxSelection !== undefined ? ids.slice(0, maxSelection) : ids\n      setRawValue(serializeSelection(limitedIds, separator))\n    },\n    [setRawValue, separator, maxSelection]\n  )\n\n  const select = useCallback(\n    (id: string) => {\n      const newSelection = addItem(selected, id, maxSelection)\n      setRawValue(serializeSelection(newSelection, separator))\n    },\n    [selected, setRawValue, separator, maxSelection]\n  )\n\n  const deselect = useCallback(\n    (id: string) => {\n      const newSelection = removeItem(selected, id)\n      setRawValue(serializeSelection(newSelection, separator))\n    },\n    [selected, setRawValue, separator]\n  )\n\n  const toggle = useCallback(\n    (id: string) => {\n      if (selected.includes(id)) {\n        deselect(id)\n      } else if (maxSelection === undefined || selected.length < maxSelection) {\n        select(id)\n      }\n    },\n    [selected, select, deselect, maxSelection]\n  )\n\n  const selectAll = useCallback(() => {\n    const itemsToSelect = maxSelection !== undefined ? allItems.slice(0, maxSelection) : allItems\n    setRawValue(serializeSelection(itemsToSelect, separator))\n  }, [allItems, setRawValue, separator, maxSelection])\n\n  const deselectAll = useCallback(() => {\n    setRawValue(null)\n  }, [setRawValue])\n\n  const isSelected = useCallback(\n    (id: string): boolean => {\n      return selected.includes(id)\n    },\n    [selected]\n  )\n\n  return {\n    selected,\n    count,\n    isEmpty,\n    isAllSelected,\n    select,\n    deselect,\n    toggle,\n    selectAll,\n    deselectAll,\n    setSelected,\n    isSelected,\n    isPending: false,\n  }\n}\n"]}