-
Notifications
You must be signed in to change notification settings - Fork 161
fix(upload/createDropzone): correct event handler for drags #1057
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| "@solid-primitives/upload": minor | ||
| --- | ||
|
|
||
| `createDropzone`: corrected `isDragging` signal & removed unnecessary props | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -48,32 +48,23 @@ function createDropzone<T extends HTMLElement = HTMLElement>( | |
| ref = r; | ||
| }; | ||
|
|
||
| const onDragStart: JSX.EventHandler<T, DragEvent> = event => { | ||
| setIsDragging(true); | ||
| Promise.resolve(options?.onDragStart?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
| const onDragEnd: JSX.EventHandler<T, DragEvent> = event => { | ||
| setIsDragging(false); | ||
| Promise.resolve(options?.onDragEnd?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
|
|
||
| const onDragEnter: JSX.EventHandler<T, DragEvent> = event => { | ||
| setIsDragging(true); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win Track nested drag events before clearing
Proposed fix+ let dragDepth = 0;
+
const onDragEnter: JSX.EventHandler<T, DragEvent> = event => {
- setIsDragging(true);
+ dragDepth += 1;
+ setIsDragging(true);
Promise.resolve(options?.onDragEnter?.(transformFiles(event.dataTransfer?.files || null)));
};
const onDragLeave: JSX.EventHandler<T, DragEvent> = event => {
- setIsDragging(false);
+ dragDepth = Math.max(0, dragDepth - 1);
+ if (dragDepth === 0) setIsDragging(false);
Promise.resolve(options?.onDragLeave?.(transformFiles(event.dataTransfer?.files || null)));
};
@@
- setIsDragging(false)
+ dragDepth = 0;
+ setIsDragging(false);Also applies to: 56-56, 67-67 🤖 Prompt for AI Agents |
||
| Promise.resolve(options?.onDragEnter?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
| const onDragLeave: JSX.EventHandler<T, DragEvent> = event => { | ||
| setIsDragging(false); | ||
| Promise.resolve(options?.onDragLeave?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
| const onDragOver: JSX.EventHandler<T, DragEvent> = event => { | ||
| event.preventDefault(); | ||
| Promise.resolve(options?.onDragOver?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
| const onDrag: JSX.EventHandler<T, DragEvent> = event => { | ||
| Promise.resolve(options?.onDrag?.(transformFiles(event.dataTransfer?.files || null))); | ||
| }; | ||
|
|
||
| const onDrop: JSX.EventHandler<T, DragEvent> = event => { | ||
| event.preventDefault(); | ||
|
|
||
| setIsDragging(false) | ||
| const parsedFiles = transformFiles(event.dataTransfer?.files || null); | ||
| setFiles(parsedFiles); | ||
|
|
||
|
|
@@ -84,21 +75,15 @@ function createDropzone<T extends HTMLElement = HTMLElement>( | |
| if (!ref) return; | ||
|
|
||
| // TODO: Should event.stopPropagation() or event.preventDefault() in handlers below? | ||
| ref.addEventListener("dragstart", onDragStart as any); | ||
| ref.addEventListener("dragenter", onDragEnter as any); | ||
| ref.addEventListener("dragend", onDragEnd as any); | ||
| ref.addEventListener("dragleave", onDragLeave as any); | ||
| ref.addEventListener("dragover", onDragOver as any); | ||
| ref.addEventListener("drag", onDrag as any); | ||
| ref.addEventListener("drop", onDrop as any); | ||
|
|
||
| onCleanup(() => { | ||
| ref?.removeEventListener("dragstart", onDragStart as any); | ||
| ref?.removeEventListener("dragenter", onDragEnter as any); | ||
| ref?.removeEventListener("dragend", onDragEnd as any); | ||
| ref?.removeEventListener("dragleave", onDragLeave as any); | ||
| ref?.removeEventListener("dragover", onDragOver as any); | ||
| ref?.removeEventListener("drag", onDrag as any); | ||
| ref?.removeEventListener("drop", onDrop as any); | ||
| }); | ||
| }); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
Repository: solidjs-community/solid-primitives
Length of output: 3025
🤖 get_repo_knowledge executed:
get_repo_knowledge solidjs-community/solid-primitives /tmp/coderabbit-repo-knowledge/solidjs-community-solid-primitives-c87aa1c8/learningsLength of output: 3523
🏁 Script executed:
Repository: solidjs-community/solid-primitives
Length of output: 9228
Use a major changeset for the removed callback options.
DropzoneOptionsis publicly exported, andcreateDropzoneaccepts it. RemovingdragStart,drag, anddragEndcan cause existing consumers to fail type-checking. Changeminortomajor.🤖 Prompt for AI Agents