# All files / src/tree useTreeSelection.ts

100% Statements 63/63
100% Branches 12/12
100% Functions 1/1
100% Lines 63/63

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    641x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    38x
    38x
    38x
    38x
    15x
    15x
    1x
    14x
    15x
    15x
    15x
    38x
    38x
    38x
    14x
    14x
    10x
    10x
    4x
    4x
    14x
    2x
    2x
    2x
    2x
    4x
    4x
    4x
    14x
    38x
    38x
    38x
    38x
    38x
    38x
    38x
    38x
    38x
    38x
     "use client";
    import { useCallback, useState } from "react";
    import type { UseStateSetter } from "../types.js";
    import type { TreeItemDefaultIds, TreeItemIdSet } from "./types.js";

    /**
     * @remarks \@since 6.0.0 Renamed from `TreeItemSelection` and uses a Set
     * instead of a list to increase performance. Also renamed `onItemSelect` to
     * `toggleTreeItemSelection` and `onMultiItemSelect` to
     * `selectMultipleTreeItems`.
     */
    export interface TreeSelection {
      /** @defaultValue `false` */
      multiSelect?: boolean;
      selectedIds: ReadonlySet<string>;
      toggleTreeItemSelection(itemId: string): void;
      selectMultipleTreeItems: UseStateSetter<TreeItemIdSet>;
    }

    /**
     * @remarks \@since 6.0.0 Renamed from `useTreeItemSelection` and uses a Set
     * instead of a list to increase performance.
     */
    export function useTreeSelection(
      defaultSelectedIds?: TreeItemDefaultIds,
      multiSelect = false
    ): Required<TreeSelection> {
      const [selectedIds, setSelectedIds] = useState<TreeItemIdSet>(() => {
        const defaultIds =
          typeof defaultSelectedIds === "function"
            ? defaultSelectedIds()
            : defaultSelectedIds;

        return new Set(defaultIds);
      });

      const toggleTreeItemSelection = useCallback(
        (itemId: string) => {
          setSelectedIds((selectedIds) => {
            if (!multiSelect) {
              return selectedIds.has(itemId) ? selectedIds : new Set([itemId]);
            }

            const nextSelectedIds = new Set(selectedIds);
            if (selectedIds.has(itemId)) {
              nextSelectedIds.delete(itemId);
            } else {
              nextSelectedIds.add(itemId);
            }

            return nextSelectedIds;
          });
        },
        [multiSelect]
      );

      return {
        selectedIds,
        multiSelect,
        toggleTreeItemSelection,
        selectMultipleTreeItems: setSelectedIds,
      };
    }