import React, { useId, useState } from 'react' import classnames from 'classnames' import { __ } from '@wordpress/i18n' import type { DragEventHandler, RefObject } from 'react' export interface DragDropUploadAreaProps { fileInputRef: RefObject onFileSelect: (files: FileList | undefined) => void disabled?: boolean } const useDragDropZone = ( disabled: boolean | undefined, onFileSelect: (files: FileList | undefined) => void ) => { const [dragOver, setDragOver] = useState(false) const handleDragOver: DragEventHandler = event => { if (disabled) { return } event.preventDefault() setDragOver(true) } const handleDragLeave: DragEventHandler = event => { if (disabled) { return } event.preventDefault() setDragOver(false) } const handleDrop: DragEventHandler = event => { if (disabled) { return } handleDragLeave(event) if (0 < event.dataTransfer.files.length) { onFileSelect(event.dataTransfer.files) } } return { dragOver, handleDragOver, handleDragLeave, handleDrop } } export const DragDropUploadArea: React.FC = ({ fileInputRef, onFileSelect, disabled }) => { const fileInputId = useId() const { dragOver, handleDragOver, handleDragLeave, handleDrop } = useDragDropZone(disabled, onFileSelect) return (
onFileSelect(event.target.files ?? undefined)} disabled={disabled} aria-label={__('Select files to import', 'code-snippets')} />
) }