Skip to content

Commit 4c00ea5

Browse files
committed
style: paper upload page
1 parent d04cb9e commit 4c00ea5

File tree

2 files changed

+92
-51
lines changed

2 files changed

+92
-51
lines changed

src/app/upload/page.tsx

Lines changed: 92 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,66 @@
11
"use client";
2-
import React, { useState } from "react";
2+
import React, { useState, useEffect } from "react";
33
import axios, { AxiosError } from "axios";
44
import toast from "react-hot-toast";
55
import { handleAPIError } from "../../util/error";
66
import { Button } from "@/components/ui/button";
77

88
import { type APIResponse } from "@/interface";
99
import Dropzone from "react-dropzone";
10+
import { Upload } from "lucide-react";
1011

1112
const Page = () => {
1213
const [campus, setCampus] = useState("Vellore");
13-
1414
const [files, setFiles] = useState<File[]>([]);
15-
1615
const [isUploading, setIsUploading] = useState(false);
1716
const [, setResetSearch] = useState(false);
17+
const [isDragging, setIsDragging] = useState(false);
18+
const [isGlobalDragging, setIsGlobalDragging] = useState(false);
19+
20+
useEffect(() => {
21+
const handleDragEnter = (e: DragEvent) => {
22+
e.preventDefault();
23+
e.stopPropagation();
24+
setIsGlobalDragging(true);
25+
};
26+
27+
const handleDragOver = (e: DragEvent) => {
28+
e.preventDefault();
29+
e.stopPropagation();
30+
};
31+
32+
const handleDragLeave = (e: DragEvent) => {
33+
e.preventDefault();
34+
e.stopPropagation();
35+
36+
if (
37+
!e.relatedTarget ||
38+
(e.currentTarget !== e.relatedTarget &&
39+
!(e.currentTarget as Element)?.contains(e.relatedTarget as Node))
40+
) {
41+
setIsGlobalDragging(false);
42+
}
43+
};
44+
45+
const handleDrop = (e: DragEvent) => {
46+
e.preventDefault();
47+
e.stopPropagation();
48+
setIsGlobalDragging(false);
49+
};
50+
51+
document.addEventListener("dragenter", handleDragEnter);
52+
document.addEventListener("dragover", handleDragOver);
53+
document.addEventListener("dragleave", handleDragLeave);
54+
document.addEventListener("drop", handleDrop);
55+
56+
return () => {
57+
document.removeEventListener("dragenter", handleDragEnter);
58+
document.removeEventListener("dragover", handleDragOver);
59+
document.removeEventListener("dragleave", handleDragLeave);
60+
document.removeEventListener("drop", handleDrop);
61+
};
62+
}, []);
63+
1864
function fileCheckAndSelect<T extends File>(acceptedFiles: T[]) {
1965
const maxFileSize = 5 * 1024 * 1024;
2066
const allowedFileTypes = [
@@ -39,7 +85,6 @@ const Page = () => {
3985
return;
4086
}
4187

42-
// File validations
4388
const invalidFiles = acceptedFiles.filter(
4489
(file) =>
4590
file.size > maxFileSize || !allowedFileTypes.includes(file.type),
@@ -73,22 +118,20 @@ const Page = () => {
73118
id: toastId,
74119
});
75120
}
121+
76122
const handlePrint = async () => {
77123
if (!campus) {
78124
setCampus("Vellore");
79125
}
80126

81127
const isPdf = files.length === 1 && files[0]?.type === "application/pdf";
82128

83-
// Prepare FormData
84129
const formData = new FormData();
85130
files.forEach((file) => {
86131
formData.append("files", file);
87132
});
88133

89-
// formData.append("exam", exam);
90134
formData.append("campus", campus);
91-
92135
formData.append("isPdf", String(isPdf));
93136

94137
setIsUploading(true);
@@ -117,10 +160,6 @@ const Page = () => {
117160
},
118161
);
119162

120-
// setSlot("");
121-
// setSubject("");
122-
// setExam("");
123-
// setYear("");
124163
setFiles([]);
125164
setResetSearch(true);
126165
setTimeout(() => setResetSearch(false), 100);
@@ -131,34 +170,59 @@ const Page = () => {
131170
}
132171
};
133172

173+
const isCurrentlyDragging = isDragging || isGlobalDragging;
174+
134175
return (
135-
<div className="play flex h-screen flex-col justify-center">
176+
<div className="play flex h-[calc(100vh-85px)] flex-col justify-center px-6">
136177
<div className="2xl:my-15 flex flex-col items-center">
137178
<fieldset className="mb-4 w-full max-w-md rounded-lg border-2 border-gray-300 p-4 pr-8">
138-
{/* <legend className="text-lg font-bold">Upload papers</legend> */}
139-
140179
<div className="flex w-full flex-col 2xl:gap-y-4">
141180
{/* File Dropzone */}
142181
<div>
143-
<Dropzone onDrop={fileCheckAndSelect}>
182+
<Dropzone
183+
onDrop={fileCheckAndSelect}
184+
onDragEnter={() => setIsDragging(true)}
185+
onDragLeave={() => setIsDragging(false)}
186+
onDropAccepted={() => {
187+
setIsDragging(false);
188+
setIsGlobalDragging(false);
189+
}}
190+
onDropRejected={() => {
191+
setIsDragging(false);
192+
setIsGlobalDragging(false);
193+
}}
194+
>
144195
{({ getRootProps, getInputProps }) => (
145196
<section
146197
{...getRootProps()}
147-
className="my-2 -mr-2 cursor-pointer rounded-2xl border-2 border-dashed p-8 text-center"
198+
className={`my-2 -mr-2 cursor-pointer rounded-2xl border-2 ${
199+
isCurrentlyDragging
200+
? "border-solid border-[#6D28D9] bg-purple-50 dark:bg-[#130E1F]"
201+
: "border-dashed border-gray-300"
202+
} p-8 text-center transition-all duration-200`}
148203
>
149-
<input {...getInputProps()} />
204+
<input {...getInputProps()} />
205+
{isCurrentlyDragging ? (
206+
<div className="flex flex-col items-center">
207+
<p className="text-lg font-medium text-[#6D28D9]">
208+
Drop files here
209+
</p>
210+
<Upload className="mt-2 h-10 w-10 animate-bounce text-[#6D28D9]" />
211+
</div>
212+
) : (
150213
<p>
151214
Drag &apos;n&apos; drop some files here, or{" "}
152215
<span className="text-[#6D28D9]">click</span> to select
153216
files
154217
</p>
155-
<div
156-
className={`mt-2 text-xs ${
157-
files?.length === 0 ? "text-red-500" : "text-gray-600"
158-
}`}
159-
>
160-
{files?.length || 0} files selected
161-
</div>
218+
)}
219+
<div
220+
className={`mt-2 text-xs ${
221+
files?.length === 0 ? "text-red-500" : "text-gray-600"
222+
}`}
223+
>
224+
{files?.length || 0} files selected
225+
</div>
162226
</section>
163227
)}
164228
</Dropzone>
@@ -171,8 +235,10 @@ const Page = () => {
171235
</fieldset>
172236
<Button
173237
onClick={handlePrint}
174-
disabled={isUploading}
175-
className={`w-fit rounded-md px-4 py-3 text-xl ${isUploading ? "bg-gray-300" : ""}`}
238+
disabled={isUploading || files.length === 0}
239+
className={`w-fit rounded-md px-4 py-3 text-base ${
240+
isUploading || files.length === 0 ? "opacity-60" : ""
241+
}`}
176242
>
177243
{isUploading ? "Uploading..." : "Upload Papers"}
178244
</Button>

src/lib/auth.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)