{"version":3,"file":"use-tree.cjs","sources":["../../../src/components/Tree/use-tree.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport {\n  CheckedNodeStatus,\n  getAllCheckedNodes,\n} from './get-all-checked-nodes/get-all-checked-nodes';\nimport {\n  getAllChildrenNodes,\n  getChildrenNodesValues,\n} from './get-children-nodes-values/get-children-nodes-values';\nimport { memoizedIsNodeChecked } from './is-node-checked/is-node-checked';\nimport { memoizedIsNodeIndeterminate } from './is-node-indeterminate/is-node-indeterminate';\nimport type { TreeNodeData } from './Tree';\n\nexport type TreeExpandedState = Record<string, boolean>;\n\nfunction getInitialTreeExpandedState(\n  initialState: TreeExpandedState,\n  data: TreeNodeData[],\n  value: string | string[] | undefined,\n  acc: TreeExpandedState = {}\n) {\n  data.forEach((node) => {\n    acc[node.value] = node.value in initialState ? initialState[node.value] : node.value === value;\n\n    if (Array.isArray(node.children)) {\n      getInitialTreeExpandedState(initialState, node.children, value, acc);\n    }\n  });\n\n  return acc;\n}\n\nexport function getTreeExpandedState(data: TreeNodeData[], expandedNodesValues: string[] | '*') {\n  const state = getInitialTreeExpandedState({}, data, []);\n\n  if (expandedNodesValues === '*') {\n    return Object.keys(state).reduce((acc, key) => ({ ...acc, [key]: true }), {});\n  }\n\n  expandedNodesValues.forEach((node) => {\n    state[node] = true;\n  });\n\n  return state;\n}\n\nfunction getInitialCheckedState(initialState: string[], data: TreeNodeData[]) {\n  const acc: string[] = [];\n\n  initialState.forEach((node) => acc.push(...getChildrenNodesValues(node, data)));\n\n  return Array.from(new Set(acc));\n}\n\nexport interface UseTreeInput {\n  /** Initial expanded state of all nodes */\n  initialExpandedState?: TreeExpandedState;\n\n  /** Initial selected state of nodes */\n  initialSelectedState?: string[];\n\n  /** Initial checked state of nodes */\n  initialCheckedState?: string[];\n\n  /** Determines whether multiple node can be selected at a time */\n  multiple?: boolean;\n\n  /** Called with the node value when it is expanded */\n  onNodeExpand?: (value: string) => void;\n\n  /** Called with the node value when it is collapsed */\n  onNodeCollapse?: (value: string) => void;\n}\n\nexport interface UseTreeReturnType {\n  /** Determines whether multiple node can be selected at a time */\n  multiple: boolean;\n\n  /** A record of `node.value` and boolean values that represent nodes expanded state */\n  expandedState: TreeExpandedState;\n\n  /** An array of selected nodes values */\n  selectedState: string[];\n\n  /** An array of checked nodes values */\n  checkedState: string[];\n\n  /** A value of the node that was last clicked\n   * Anchor node is used to determine range of selected nodes for multiple selection\n   */\n  anchorNode: string | null;\n\n  /** Initializes tree state based on provided data, called automatically by the Tree component */\n  initialize: (data: TreeNodeData[]) => void;\n\n  /** Toggles expanded state of the node with provided value */\n  toggleExpanded: (value: string) => void;\n\n  /** Collapses node with provided value */\n  collapse: (value: string) => void;\n\n  /** Expands node with provided value */\n  expand: (value: string) => void;\n\n  /** Expands all nodes */\n  expandAllNodes: () => void;\n\n  /** Collapses all nodes */\n  collapseAllNodes: () => void;\n\n  /** Sets expanded state */\n  setExpandedState: React.Dispatch<React.SetStateAction<TreeExpandedState>>;\n\n  /** Toggles selected state of the node with provided value */\n  toggleSelected: (value: string) => void;\n\n  /** Selects node with provided value */\n  select: (value: string) => void;\n\n  /** Deselects node with provided value */\n  deselect: (value: string) => void;\n\n  /** Clears selected state */\n  clearSelected: () => void;\n\n  /** Sets selected state */\n  setSelectedState: React.Dispatch<React.SetStateAction<string[]>>;\n\n  /** A value of the node that is currently hovered */\n  hoveredNode: string | null;\n\n  /** Sets hovered node */\n  setHoveredNode: React.Dispatch<React.SetStateAction<string | null>>;\n\n  /** Checks node with provided value */\n  checkNode: (value: string) => void;\n\n  /** Unchecks node with provided value */\n  uncheckNode: (value: string) => void;\n\n  /** Checks all nodes */\n  checkAllNodes: () => void;\n\n  /** Unchecks all nodes */\n  uncheckAllNodes: () => void;\n\n  /** Sets checked state */\n  setCheckedState: React.Dispatch<React.SetStateAction<string[]>>;\n\n  /** Returns all checked nodes with status */\n  getCheckedNodes: () => CheckedNodeStatus[];\n\n  /** Returns `true` if node with provided value is checked */\n  isNodeChecked: (value: string) => boolean;\n\n  /** Returns `true` if node with provided value is indeterminate */\n  isNodeIndeterminate: (value: string) => boolean;\n}\n\nexport function useTree({\n  initialSelectedState = [],\n  initialCheckedState = [],\n  initialExpandedState = {},\n  multiple = false,\n  onNodeCollapse,\n  onNodeExpand,\n}: UseTreeInput = {}): UseTreeReturnType {\n  const [data, setData] = useState<TreeNodeData[]>([]);\n  const [expandedState, setExpandedState] = useState(initialExpandedState);\n  const [selectedState, setSelectedState] = useState(initialSelectedState);\n  const [checkedState, setCheckedState] = useState(initialCheckedState);\n  const [anchorNode, setAnchorNode] = useState<string | null>(null);\n  const [hoveredNode, setHoveredNode] = useState<string | null>(null);\n\n  const initialize = useCallback(\n    (_data: TreeNodeData[]) => {\n      setExpandedState((current) => getInitialTreeExpandedState(current, _data, selectedState));\n      setCheckedState((current) => getInitialCheckedState(current, _data));\n      setData(_data);\n    },\n    [selectedState, checkedState]\n  );\n\n  const toggleExpanded = useCallback(\n    (value: string) => {\n      setExpandedState((current) => {\n        const nextState = { ...current, [value]: !current[value] };\n        nextState[value] ? onNodeExpand?.(value) : onNodeCollapse?.(value);\n        return nextState;\n      });\n    },\n    [onNodeCollapse, onNodeExpand]\n  );\n\n  const collapse = useCallback(\n    (value: string) => {\n      setExpandedState((current) => {\n        if (current[value] !== false) {\n          onNodeCollapse?.(value);\n        }\n\n        return { ...current, [value]: false };\n      });\n    },\n    [onNodeCollapse]\n  );\n\n  const expand = useCallback(\n    (value: string) => {\n      setExpandedState((current) => {\n        if (current[value] !== true) {\n          onNodeExpand?.(value);\n        }\n\n        return { ...current, [value]: true };\n      });\n    },\n    [onNodeExpand]\n  );\n\n  const expandAllNodes = useCallback(() => {\n    setExpandedState((current) => {\n      const next = { ...current };\n      Object.keys(next).forEach((key) => {\n        next[key] = true;\n      });\n\n      return next;\n    });\n  }, []);\n\n  const collapseAllNodes = useCallback(() => {\n    setExpandedState((current) => {\n      const next = { ...current };\n      Object.keys(next).forEach((key) => {\n        next[key] = false;\n      });\n\n      return next;\n    });\n  }, []);\n\n  const toggleSelected = useCallback(\n    (value: string) =>\n      setSelectedState((current) => {\n        if (!multiple) {\n          if (current.includes(value)) {\n            setAnchorNode(null);\n            return [];\n          }\n\n          setAnchorNode(value);\n          return [value];\n        }\n\n        if (current.includes(value)) {\n          setAnchorNode(null);\n          return current.filter((item) => item !== value);\n        }\n\n        setAnchorNode(value);\n\n        return [...current, value];\n      }),\n    []\n  );\n\n  const select = useCallback((value: string) => {\n    setAnchorNode(value);\n    setSelectedState((current) =>\n      multiple ? (current.includes(value) ? current : [...current, value]) : [value]\n    );\n  }, []);\n\n  const deselect = useCallback((value: string) => {\n    anchorNode === value && setAnchorNode(null);\n    setSelectedState((current) => current.filter((item) => item !== value));\n  }, []);\n\n  const clearSelected = useCallback(() => {\n    setSelectedState([]);\n    setAnchorNode(null);\n  }, []);\n\n  const checkNode = useCallback(\n    (value: string) => {\n      const checkedNodes = getChildrenNodesValues(value, data);\n      setCheckedState((current) => Array.from(new Set([...current, ...checkedNodes])));\n    },\n    [data]\n  );\n\n  const uncheckNode = useCallback(\n    (value: string) => {\n      const checkedNodes = getChildrenNodesValues(value, data);\n      setCheckedState((current) => current.filter((item) => !checkedNodes.includes(item)));\n    },\n    [data]\n  );\n\n  const checkAllNodes = useCallback(() => {\n    setCheckedState(() => getAllChildrenNodes(data));\n  }, [data]);\n\n  const uncheckAllNodes = useCallback(() => {\n    setCheckedState([]);\n  }, []);\n\n  const getCheckedNodes = () => getAllCheckedNodes(data, checkedState).result;\n  const isNodeChecked = (value: string) => memoizedIsNodeChecked(value, data, checkedState);\n  const isNodeIndeterminate = (value: string) =>\n    memoizedIsNodeIndeterminate(value, data, checkedState);\n\n  return {\n    multiple,\n    expandedState,\n    selectedState,\n    checkedState,\n    anchorNode,\n    initialize,\n\n    toggleExpanded,\n    collapse,\n    expand,\n    expandAllNodes,\n    collapseAllNodes,\n    setExpandedState,\n\n    checkNode,\n    uncheckNode,\n    checkAllNodes,\n    uncheckAllNodes,\n    setCheckedState,\n\n    toggleSelected,\n    select,\n    deselect,\n    clearSelected,\n    setSelectedState,\n\n    hoveredNode,\n    setHoveredNode,\n    getCheckedNodes,\n    isNodeChecked,\n    isNodeIndeterminate,\n  };\n}\n\nexport type TreeController = ReturnType<typeof useTree>;\n"],"names":["getChildrenNodesValues","useState","useCallback","getAllChildrenNodes","getAllCheckedNodes","isNodeChecked","memoizedIsNodeChecked","isNodeIndeterminate","memoizedIsNodeIndeterminate"],"mappings":"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"}