Skip to content
This repository has been archived by the owner on Oct 23, 2024. It is now read-only.

Add optional drag event handlers to dropzone #258

Merged
merged 2 commits into from
Apr 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/components/inputs/Dropzone/Dropzone.story.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,26 @@ const onChange = (event: DropChangeEvent) => {
);
};

const onDragEnter = (event: DragEvent) => {
console.log('Drag enter', event);
};

const onDragLeave = (event: DragEvent) => {
console.log('Drag leave', event);
};

const onDragOver = (event: DragEvent) => {
console.log('Drag over', event);
};

const Template: Story<Props> = (args) => {
return (
<Dropzone
style={{ maxWidth: '40rem' }}
onChange={onChange}
onDragEnter={onDragEnter}
onDragLeave={onDragLeave}
onDragOver={onDragOver}
{...args}
>
<Header size="3">Drag files here</Header>
Expand Down
22 changes: 18 additions & 4 deletions src/components/inputs/Dropzone/Dropzone.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,26 @@ function DropzoneComponent({
forwardRef,
multiple,
onChange,
onDragEnter,
onDragLeave,
onDragOver,
...props
}: Props) {
const ref = useForwardRef(forwardRef);
const [drag, dragSet] = useState(false);

const onDragOver = stopPrevent<DragEvent>(() => dragSet(true));
const onDragLeave = stopPrevent<DragEvent>(() => dragSet(false));
const handleDragOver = stopPrevent<DragEvent>(
(e: DragEvent<HTMLDivElement>) => {
onDragOver?.(e);
dragSet(true);
}
);
const handleDragLeave = stopPrevent<DragEvent>(
(e: DragEvent<HTMLDivElement>) => {
onDragLeave?.(e);
dragSet(false);
}
);

const onDrop = stopPrevent<DragEvent>(
(event: DragEvent<HTMLDivElement> & DropChangeEvent) => {
Expand All @@ -39,8 +52,9 @@ function DropzoneComponent({
<DropzoneContainer
drag={active || drag}
format={format}
onDragLeave={onDragLeave}
onDragOver={onDragOver}
onDragEnter={onDragEnter}
onDragLeave={handleDragLeave}
onDragOver={handleDragOver}
onDrop={onDrop}
{...props}
>
Expand Down
5 changes: 4 additions & 1 deletion src/components/inputs/Dropzone/Dropzone.types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ChangeEvent, ReactNode } from 'react';
import { ChangeEvent, DragEventHandler, ReactNode } from 'react';
import { IrisInputProps } from '../../../utils';

export type DropChangeEvent = ChangeEvent<HTMLInputElement> & {
Expand All @@ -22,4 +22,7 @@ export type Props = IrisInputProps<{
*/
format?: 'primary' | 'secondary';
onChange?: (event: DropChangeEvent) => void;
onDragEnter?: DragEventHandler<HTMLDivElement>;
onDragLeave?: DragEventHandler<HTMLDivElement>;
onDragOver?: DragEventHandler<HTMLDivElement>;
}>;