{"mappings":"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","sources":["packages/react-stately/src/dnd/useDroppableCollectionState.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n  Collection,\n  DragTypes,\n  DropOperation,\n  DroppableCollectionProps,\n  DropTarget,\n  ItemDropTarget,\n  Key,\n  Node\n} from '@react-types/shared';\nimport {MultipleSelectionManager} from '../selection/types';\nimport {useCallback, useRef, useState} from 'react';\n\ninterface DropOperationEvent {\n  target: DropTarget;\n  types: DragTypes;\n  allowedOperations: DropOperation[];\n  isInternal: boolean;\n  draggingKeys: Set<Key>;\n}\n\nexport interface DroppableCollectionStateOptions extends Omit<\n  DroppableCollectionProps,\n  'onDropMove' | 'onDropActivate'\n> {\n  /** A collection of items. */\n  collection: Collection<Node<unknown>>;\n  /** An interface for reading and updating multiple selection state. */\n  selectionManager: MultipleSelectionManager;\n  /** Whether the drop events should be disabled. */\n  isDisabled?: boolean;\n}\n\nexport interface DroppableCollectionState {\n  /** A collection of items. */\n  collection: Collection<Node<unknown>>;\n  /** An interface for reading and updating multiple selection state. */\n  selectionManager: MultipleSelectionManager;\n  /** The current drop target. */\n  target: DropTarget | null;\n  /** Whether drop events are disabled. */\n  isDisabled?: boolean;\n  /** Sets the current drop target. */\n  setTarget(target: DropTarget | null): void;\n  /** Returns whether the given target is equivalent to the current drop target. */\n  isDropTarget(target: DropTarget | null): boolean;\n  /** Returns the drop operation for the given parameters. */\n  getDropOperation(e: DropOperationEvent): DropOperation;\n}\n\n/**\n * Manages state for a droppable collection.\n */\nexport function useDroppableCollectionState(\n  props: DroppableCollectionStateOptions\n): DroppableCollectionState {\n  let {\n    acceptedDragTypes = 'all',\n    isDisabled,\n    onInsert,\n    onRootDrop,\n    onItemDrop,\n    onReorder,\n    onMove,\n    shouldAcceptItemDrop,\n    collection,\n    selectionManager,\n    onDropEnter,\n    getDropOperation,\n    onDrop\n  } = props;\n  let [target, setTarget] = useState<DropTarget | null>(null);\n  let targetRef = useRef<DropTarget | null>(null);\n\n  let getOppositeTarget = (target: ItemDropTarget): ItemDropTarget | null => {\n    if (target.dropPosition === 'before') {\n      let node = collection.getItem(target.key);\n      return node && node.prevKey != null\n        ? {type: 'item', key: node.prevKey, dropPosition: 'after'}\n        : null;\n    } else if (target.dropPosition === 'after') {\n      let node = collection.getItem(target.key);\n      return node && node.nextKey != null\n        ? {type: 'item', key: node.nextKey, dropPosition: 'before'}\n        : null;\n    }\n    return null;\n  };\n\n  let defaultGetDropOperation = useCallback(\n    (e: DropOperationEvent) => {\n      let {target, types, allowedOperations, isInternal, draggingKeys} = e;\n\n      if (isDisabled || !target) {\n        return 'cancel';\n      }\n\n      if (acceptedDragTypes === 'all' || acceptedDragTypes.some(type => types.has(type))) {\n        let isValidInsert =\n          onInsert &&\n          target.type === 'item' &&\n          !isInternal &&\n          (target.dropPosition === 'before' || target.dropPosition === 'after');\n        let isValidReorder =\n          onReorder &&\n          target.type === 'item' &&\n          isInternal &&\n          (target.dropPosition === 'before' || target.dropPosition === 'after') &&\n          isDraggingWithinParent(collection, target, draggingKeys);\n\n        let isItemDropAllowed =\n          target.type !== 'item' ||\n          target.dropPosition !== 'on' ||\n          !shouldAcceptItemDrop ||\n          shouldAcceptItemDrop(target, types);\n\n        let isValidMove = onMove && target.type === 'item' && isInternal && isItemDropAllowed;\n\n        // Feedback was that internal root drop was weird so preventing that from happening\n        let isValidRootDrop = onRootDrop && target.type === 'root' && !isInternal;\n\n        // Automatically prevent items (i.e. folders) from being dropped on themselves.\n        let isValidOnItemDrop =\n          onItemDrop &&\n          target.type === 'item' &&\n          target.dropPosition === 'on' &&\n          !(isInternal && target.key != null && draggingKeys.has(target.key)) &&\n          isItemDropAllowed;\n\n        if (\n          onDrop ||\n          isValidInsert ||\n          isValidReorder ||\n          isValidMove ||\n          isValidRootDrop ||\n          isValidOnItemDrop\n        ) {\n          if (getDropOperation) {\n            return getDropOperation(target, types, allowedOperations);\n          } else {\n            return allowedOperations[0];\n          }\n        }\n      }\n\n      return 'cancel';\n    },\n    [\n      isDisabled,\n      collection,\n      acceptedDragTypes,\n      getDropOperation,\n      onInsert,\n      onRootDrop,\n      onItemDrop,\n      shouldAcceptItemDrop,\n      onReorder,\n      onMove,\n      onDrop\n    ]\n  );\n\n  return {\n    collection,\n    selectionManager,\n    isDisabled,\n    target,\n    setTarget(newTarget) {\n      if (this.isDropTarget(newTarget)) {\n        return;\n      }\n\n      let target = targetRef.current;\n      if (target && typeof props.onDropExit === 'function') {\n        props.onDropExit({\n          type: 'dropexit',\n          x: 0, // todo\n          y: 0,\n          target\n        });\n      }\n\n      if (newTarget && typeof onDropEnter === 'function') {\n        onDropEnter({\n          type: 'dropenter',\n          x: 0, // todo\n          y: 0,\n          target: newTarget\n        });\n      }\n\n      targetRef.current = newTarget ?? null;\n      setTarget(newTarget ?? null);\n    },\n    isDropTarget(dropTarget) {\n      let target = targetRef.current;\n      if (!target || !dropTarget) {\n        return false;\n      }\n      if (isEqualDropTarget(dropTarget, target)) {\n        return true;\n      }\n\n      // Check if the targets point at the same point between two items, one referring before, and the other after.\n      if (\n        dropTarget?.type === 'item' &&\n        target?.type === 'item' &&\n        dropTarget.key !== target.key &&\n        dropTarget.dropPosition !== target.dropPosition &&\n        dropTarget.dropPosition !== 'on' &&\n        target.dropPosition !== 'on'\n      ) {\n        return (\n          isEqualDropTarget(getOppositeTarget(dropTarget), target) ||\n          isEqualDropTarget(dropTarget, getOppositeTarget(target))\n        );\n      }\n\n      return false;\n    },\n    getDropOperation(e) {\n      let {target, isInternal, draggingKeys} = e;\n\n      // Prevent dropping items onto themselves or their descendants\n      if (isInternal && target.type === 'item' && draggingKeys.size > 0) {\n        if (draggingKeys.has(target.key) && target.dropPosition === 'on') {\n          return 'cancel';\n        }\n\n        let currentKey: Key | null = target.key;\n        while (currentKey != null) {\n          let item = collection.getItem(currentKey);\n          let parentKey = item?.parentKey;\n          if (parentKey != null && draggingKeys.has(parentKey)) {\n            return 'cancel';\n          }\n          currentKey = parentKey ?? null;\n        }\n      }\n\n      return defaultGetDropOperation(e);\n    }\n  };\n}\n\nfunction isEqualDropTarget(a?: DropTarget | null, b?: DropTarget | null) {\n  if (!a) {\n    return !b;\n  }\n\n  switch (a.type) {\n    case 'root':\n      return b?.type === 'root';\n    case 'item':\n      return b?.type === 'item' && b?.key === a.key && b?.dropPosition === a.dropPosition;\n  }\n}\n\nfunction isDraggingWithinParent(\n  collection: Collection<Node<unknown>>,\n  target: ItemDropTarget,\n  draggingKeys: Set<Key>\n) {\n  let targetNode = collection.getItem(target.key);\n\n  for (let key of draggingKeys) {\n    let node = collection.getItem(key);\n    if (node?.parentKey !== targetNode?.parentKey) {\n      return false;\n    }\n  }\n\n  return true;\n}\n"],"names":[],"version":3,"file":"useDroppableCollectionState.cjs.map"}