"use client"; import { useState, useRef } from "react"; import toast, { Toaster } from "react-hot-toast"; export default function UploadForm() { const [file, setFile] = useState(null); const [uploading, setUploading] = useState(false); const [uploadedFileUrl, setUploadedFileUrl] = useState(null); const [progress, setProgress] = useState(0); // Track upload progress const fileInputRef = useRef(null); // Ref for the file input const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files) { setFile(e.target.files[0] ?? null); setUploadedFileUrl(null); // Reset the uploaded file URL when a new file is selected setProgress(0); // Reset progress setUploading(false); // Reset uploading state } }; const handleUpload = async () => { if (!file) return toast.error("Please select a file to upload."); setUploading(true); try { const formData = new FormData(); formData.append("file", file); const xhr = new XMLHttpRequest(); xhr.open("POST", "/api/upload", true); // Track upload progress xhr.upload.onprogress = (event) => { if (event.lengthComputable && event.total > 0) { const percentComplete = Math.round((event.loaded / event.total) * 100); setProgress(percentComplete); } }; xhr.onload = () => { if (xhr.status === 200) { const response = JSON.parse(xhr.responseText); setUploadedFileUrl(response.url); // Assume the API returns the uploaded file URL toast.success("File uploaded successfully!"); // Clear the file input and reset state setFile(null); if (fileInputRef.current) { fileInputRef.current.value = ""; // Clear the file input } } else { console.error("Upload failed:", xhr.responseText); toast.error("Failed to upload file."); } setUploading(false); }; xhr.onerror = () => { console.error("Upload failed"); toast.error("Failed to upload file."); setUploading(false); }; xhr.send(formData); } catch (error) { console.error(error); toast.error("Failed to upload file."); setUploading(false); } }; const handleCopyUrl = () => { if (uploadedFileUrl) { navigator.clipboard .writeText(uploadedFileUrl) .then(() => toast.success("File URL copied to clipboard!")) .catch(() => toast.error("Failed to copy URL.")); } }; return (
{/* Toast container */}
{/* Custom file input */}
{file && uploading && (
)} {uploadedFileUrl && (

{uploadedFileUrl}

)}
); }