Skip to content

Commit 638452b

Browse files
Implement drag and drop to upload file
1 parent 4bff0c3 commit 638452b

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

src/app/page.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,21 @@ export default function Home() {
9292
setDarkMode(!darkMode);
9393
}
9494

95-
function handleFileUpload(e) {
96-
var uploadedFile = e.target.files[0];
97-
if (/\.(jpe?g|png)$/i.test(uploadedFile.name) === true) {
95+
function handleFileUpload(event) {
96+
const uploadedFile = event.target.files[0];
97+
setNewFile(uploadedFile);
98+
}
99+
100+
function handleFileDrop(event) {
101+
event.preventDefault();
102+
const droppedFiles = event.dataTransfer.files;
103+
setNewFile(droppedFiles[0]);
104+
};
105+
106+
function setNewFile(file) {
107+
if (/\.(jpe?g|png)$/i.test(file.name) === true) {
98108
setFileIsValid(true);
99-
setFile(URL.createObjectURL(uploadedFile));
109+
setFile(URL.createObjectURL(file));
100110
} else {
101111
setFileIsValid(false);
102112
}
@@ -144,7 +154,7 @@ export default function Home() {
144154
</nav>
145155

146156
<main id="main" className="flex justify-center items-center py-6">
147-
{file == null ? <UploadArea fileIsValid={fileIsValid} onFileUpload={handleFileUpload}></UploadArea> :
157+
{file == null ? <UploadArea fileIsValid={fileIsValid} onFileUpload={handleFileUpload} onFileDrop={handleFileDrop}></UploadArea> :
148158
<ImageCanvas file={file} imageFilters={imageFilters} gridMode={gridMode}></ImageCanvas>}
149159
</main>
150160
</div>

src/components/UploadArea.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import {
33
UploadIcon,
44
} from "@radix-ui/react-icons";
55

6-
export default function UploadArea({ fileIsValid, onFileUpload }) {
6+
export default function UploadArea({ fileIsValid, onFileUpload, onFileDrop }) {
77
return (
8-
<div id="uploadArea" className="flex justify-center px-5 mx-5 transition duration-300 ease-in-out cursor-pointer group bg-foreground/15 hover:bg-foreground/10 dark:bg-foreground dark:hover:bg-foreground/90 outline-dashed outline-gray dark:outline-gray/30 dark:hover:outline-gray/40 outline-2 outline-offset-2">
8+
<div id="uploadArea" onDrop={(event) => onFileDrop(event)}
9+
onDragOver={(event) => event.preventDefault()} className="flex justify-center px-5 mx-5 transition duration-300 ease-in-out cursor-pointer group bg-foreground/15 hover:bg-foreground/10 dark:bg-foreground dark:hover:bg-foreground/90 outline-dashed outline-gray dark:outline-gray/30 dark:hover:outline-gray/40 outline-2 outline-offset-2">
910
<label htmlFor="dropzone" className="flex flex-col justify-center text-center cursor-pointer">
1011
<UploadIcon className="mx-auto w-12 h-12 transition duration-300 ease-in-out rotate-3 group-hover:rotate-0 text-foreground/50 dark:text-gray"></UploadIcon>
1112
<h2 className="mt-4 text-2xl font-bold text-foreground/50 dark:text-gray">Click to upload or drag and drop</h2>

0 commit comments

Comments
 (0)