| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import { type ImportDataFileAddedEvent } from 'common/telemetry-constants'
- import { useCallback, useState, type DragEvent } from 'react'
- import { flagInvalidFileImport } from '@/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.utils'
- interface UseCsvFileDropOptions {
- enabled: boolean
- onFileDropped: (file: File) => void
- onTelemetryEvent?: (eventName: ImportDataFileAddedEvent['action']) => void
- }
- interface UseCsvFileDropReturn {
- isDraggedOver: boolean
- onDragOver: (event: DragEvent<HTMLDivElement>) => void
- onFileDrop: (event: DragEvent<HTMLDivElement>) => void
- }
- export function useCsvFileDrop({
- enabled,
- onFileDropped,
- onTelemetryEvent,
- }: UseCsvFileDropOptions): UseCsvFileDropReturn {
- const [isDraggedOver, setIsDraggedOver] = useState(false)
- const onDragOver = useCallback(
- (event: DragEvent<HTMLDivElement>) => {
- if (!enabled) return
- const [item] = event.dataTransfer.items
- // ignore non files drop, like column headers
- if (item && item.kind !== 'file') return
- if (event.type === 'dragover' && !isDraggedOver) {
- setIsDraggedOver(true)
- } else if (event.type === 'dragleave' || event.type === 'drop') {
- setIsDraggedOver(false)
- }
- event.stopPropagation()
- event.preventDefault()
- },
- [enabled, isDraggedOver]
- )
- const onFileDrop = useCallback(
- (event: DragEvent<HTMLDivElement>) => {
- if (!enabled) return
- onDragOver(event)
- const [file] = event.dataTransfer.files
- const [item] = event.dataTransfer.items
- // ignore non files drop, like column headers
- if (item && item.kind !== 'file') return
- if (flagInvalidFileImport(file)) return
- onFileDropped(file)
- onTelemetryEvent?.('import_data_dropzone_file_added')
- },
- [enabled, onDragOver, onFileDropped, onTelemetryEvent]
- )
- return {
- isDraggedOver,
- onDragOver,
- onFileDrop,
- }
- }
|