Spaces:
Running
Running
import { useState } from "react"; | |
export default function FileUpload({ | |
onUploadSuccess, | |
}: { | |
onUploadSuccess: () => void; | |
}) { | |
const [uploading, setUploading] = useState(false); | |
const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => { | |
const file = e.target.files?.[0]; | |
if (!file) return; | |
setUploading(true); | |
const formData = new FormData(); | |
formData.append("file", file); | |
try { | |
const response = await fetch( | |
`${process.env.NEXT_PUBLIC_API_URL}/upload`, | |
{ | |
method: "POST", | |
body: formData, | |
} | |
); | |
if (!response.ok) throw new Error("Upload failed"); | |
onUploadSuccess(); | |
} catch (error) { | |
console.error("Upload error:", error); | |
} finally { | |
setUploading(false); | |
} | |
}; | |
return ( | |
<div className="w-full max-w-md"> | |
<label className="flex flex-col items-center p-4 border-2 border-dashed rounded-lg cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-900"> | |
<span className="text-sm mb-2"> | |
{uploading ? "Uploading..." : "Upload PDF"} | |
</span> | |
<input | |
type="file" | |
className="hidden" | |
accept=".pdf" | |
onChange={handleFileUpload} | |
disabled={uploading} | |
/> | |
</label> | |
</div> | |
); | |
} | |