iterative/vscode-dvc

View on GitHub
webview/src/shared/components/dragDrop/Draggable.tsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React, { DragEvent } from 'react'

export type DragFunction = (e: DragEvent<HTMLElement>) => void

interface DraggableProps {
  id: string
  disabled: boolean
  children: JSX.Element
  onDrop: DragFunction
  onDragStart: DragFunction
  onDragEnter: DragFunction
  onDragEnd: DragFunction
  onDragLeave: DragFunction
}

export const Draggable: React.FC<DraggableProps> = ({
  id,
  children,
  disabled,
  onDrop,
  onDragEnter,
  onDragStart,
  onDragEnd,
  onDragLeave
}) => {
  const handleDragStart = (e: DragEvent<HTMLElement>) => {
    e.dataTransfer.effectAllowed = 'move'
    e.dataTransfer.dropEffect = 'move'
    onDragStart(e)
  }

  const handleDragOver = (e: DragEvent<HTMLElement>) => {
    e.preventDefault()
  }

  return (
    <children.type
      {...children.props}
      id={id}
      onDragLeave={onDragLeave}
      onDragStart={handleDragStart}
      onDragEnd={onDragEnd}
      onDragOver={handleDragOver}
      onDragEnter={onDragEnter}
      onDrop={onDrop}
      draggable={!disabled}
    />
  )
}