Skip to content

Commit

Permalink
feat(useDropZone): expose more hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Jun 27, 2023
1 parent 89c9a09 commit 17d8da6
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions packages/core/useDropZone/index.ts
Expand Up @@ -8,18 +8,31 @@ export interface UseDropZoneReturn {
isOverDropZone: Ref<boolean>
}

export interface UseDropZoneOptions {
onDrop?: (files: File[] | null, event: DragEvent) => void
onEnter?: (files: File[] | null, event: DragEvent) => void
onLeave?: (files: File[] | null, event: DragEvent) => void
}

export function useDropZone(
target: MaybeRefOrGetter<HTMLElement | null | undefined>,
onDrop?: (files: File[] | null) => void,
options: UseDropZoneOptions | UseDropZoneOptions['onDrop'] = {},
): UseDropZoneReturn {
const isOverDropZone = ref(false)
let counter = 0

if (isClient) {
const _options = typeof options === 'function' ? { onDrop: options } : options
const getFiles = (event: DragEvent) => {
const files = Array.from(event.dataTransfer?.files ?? [])
return files.length === 0 ? null : files
}

useEventListener<DragEvent>(target, 'dragenter', (event) => {
event.preventDefault()
counter += 1
isOverDropZone.value = true
_options.onEnter?.(getFiles(event), event)
})
useEventListener<DragEvent>(target, 'dragover', (event) => {
event.preventDefault()
Expand All @@ -29,13 +42,13 @@ export function useDropZone(
counter -= 1
if (counter === 0)
isOverDropZone.value = false
_options.onLeave?.(getFiles(event), event)
})
useEventListener<DragEvent>(target, 'drop', (event) => {
event.preventDefault()
counter = 0
isOverDropZone.value = false
const files = Array.from(event.dataTransfer?.files ?? [])
onDrop?.(files.length === 0 ? null : files)
_options.onDrop?.(getFiles(event), event)
})
}

Expand Down

0 comments on commit 17d8da6

Please sign in to comment.