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> | |
| ); | |
| } | |