Spaces:
Sleeping
Sleeping
File size: 1,431 Bytes
375d687 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import { useRef, useState } from "react";
import { IconUpload } from "../lib/icons";
// Premium drag-and-drop upload zone. Validation + states live in the parent;
// this just surfaces the file and the drag affordance.
export default function Upload({ onFile, uploading }) {
const [drag, setDrag] = useState(false);
const inputRef = useRef(null);
function handleFiles(files) {
const file = files?.[0];
if (file) onFile(file);
}
return (
<div
className={`upload ${drag ? "drag" : ""}`}
role="button"
tabIndex={0}
onClick={() => inputRef.current?.click()}
onKeyDown={(e) => (e.key === "Enter" || e.key === " ") && inputRef.current?.click()}
onDragOver={(e) => {
e.preventDefault();
setDrag(true);
}}
onDragLeave={() => setDrag(false)}
onDrop={(e) => {
e.preventDefault();
setDrag(false);
handleFiles(e.dataTransfer.files);
}}
>
<div className="upload-ico">
<IconUpload size={22} />
</div>
<h3>{uploading ? "Processing…" : "Drag & drop a document"}</h3>
<p>or click to browse · PDF or TXT · up to 10 MB</p>
<input
ref={inputRef}
type="file"
accept=".pdf,.txt"
hidden
disabled={uploading}
onChange={(e) => {
handleFiles(e.target.files);
e.target.value = "";
}}
/>
</div>
);
}
|