{"version":3,"sources":["../../src/use-multi-select/index.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useCreation } from '../use-creation'\nimport { useLatest } from '../use-latest'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\n\nimport type { ReactSetState } from '../use-safe-state'\n\nexport interface UseMultiSelectReturnsState<T> {\n  /**\n   * The selected items\n   */\n  selected: T[]\n  /**\n   * Whether none of the items are selected\n   */\n  isNoneSelected: boolean\n  /**\n   * Whether all of the items are selected\n   */\n  isAllSelected: boolean\n  /**\n   * Whether some of the items are selected\n   */\n  isPartiallySelected: boolean\n}\n\nexport interface UseMultiSelectReturnsActions<T> {\n  /**\n   * Whether the item is selected\n   */\n  isItemSelected: (item: T) => boolean\n  /**\n   * Set the selected items\n   */\n  setSelected: ReactSetState<T[]>\n  /**\n   * Select the item\n   */\n  select: (item: T) => void\n  /**\n   * Select all items\n   */\n  selectAll(): void\n  /**\n   * Unselect the item\n   *\n   * @deprecated Use `unselect` instead\n   */\n  unSelect: (item: T) => void\n  /**\n   * Unselect all items\n   *\n   * @deprecated Use `unselectAll` instead\n   */\n  unSelectAll(): void\n  /**\n   * Unselect the item\n   *\n   * @since 1.7.0\n   */\n  unselect: (item: T) => void\n  /**\n   * Unselect all items\n   *\n   * @since 1.7.0\n   */\n  unselectAll(): void\n  /**\n   * Toggle the item\n   */\n  toggle: (item: T) => void\n  /**\n   * Toggle all items\n   */\n  toggleAll(): void\n}\n\nexport type UseMultiSelectReturns<T> = readonly [UseMultiSelectReturnsState<T>, UseMultiSelectReturnsActions<T>]\n\n/**\n * A React Hook that manages multi-select state.\n */\nexport function useMultiSelect<T>(items: T[], defaultSelected: T[] = []): UseMultiSelectReturns<T> {\n  const [selected, setSelected] = useSafeState<T[]>(defaultSelected)\n\n  const set = useMemo(() => new Set(selected), [selected])\n\n  const isNoneSelected = useMemo(() => items.every((o) => !set.has(o)), [items, set])\n  const isAllSelected = useMemo(() => items.every((o) => set.has(o)) && !isNoneSelected, [items, set, isNoneSelected])\n\n  const latest = useLatest({ set })\n\n  const isPartiallySelected = useCreation(() => {\n    return !isNoneSelected && !isAllSelected\n  }, [isNoneSelected, isAllSelected])\n\n  const select = useStableFn((item: T) => {\n    latest.current.set.add(item)\n    setSelected(Array.from(latest.current.set))\n  })\n\n  const unselect = useStableFn((item: T) => {\n    latest.current.set.delete(item)\n    setSelected(Array.from(latest.current.set))\n  })\n\n  const selectAll = useStableFn(() => {\n    for (const item of items) {\n      latest.current.set.add(item)\n    }\n    setSelected(Array.from(latest.current.set))\n  })\n\n  const unselectAll = useStableFn(() => {\n    for (const item of items) {\n      latest.current.set.delete(item)\n    }\n    setSelected(Array.from(latest.current.set))\n  })\n\n  const toggleAll = useStableFn(() => {\n    for (const item of items) {\n      isItemSelected(item) ? unselect(item) : select(item)\n    }\n  })\n\n  const toggle = useStableFn((item: T) => (isItemSelected(item) ? unselect(item) : select(item)))\n  const isItemSelected = useStableFn((item: T) => latest.current.set.has(item))\n\n  const state = {\n    selected,\n    isNoneSelected,\n    isAllSelected,\n    isPartiallySelected,\n  }\n\n  const actions = useCreation(() => ({\n    isItemSelected,\n    select,\n    selectAll,\n    setSelected,\n    toggle,\n    toggleAll,\n    unselect,\n    unselectAll,\n    unSelect: unselect,\n    unSelectAll: unselectAll,\n  }))\n\n  return [state, actions] as const\n}\n"],"names":["useMultiSelect","items","defaultSelected","useSafeState","selected","setSelected","set","useMemo","Set","isNoneSelected","every","o","has","isAllSelected","latest","useLatest","isPartiallySelected","useCreation","select","useStableFn","item","current","add","Array","from","unselect","delete","selectAll","unselectAll","toggleAll","isItemSelected","toggle","state","actions","unSelect","unSelectAll"],"mappings":"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"}