Spaces:
Running
Running
import { useState } from "react"; | |
interface FileUploadProps { | |
isFileUploaded: boolean; | |
setIsFileUploaded: (isFileUploaded: boolean) => void; | |
} | |
function FileUpload({ isFileUploaded, setIsFileUploaded }: FileUploadProps) { | |
const [error, setError] = useState(""); | |
const [isLoading, setIsLoading] = useState(false); | |
const onSubmitFile = async (e: React.FormEvent<HTMLFormElement>) => { | |
e.preventDefault(); | |
const form = e.currentTarget; | |
const formData = new FormData(form); | |
const file = formData.get("file") as File; | |
if (!file) { | |
setError("Please choose a file"); | |
return; | |
} | |
// if file is not a text or pdf file, set error | |
if (!file.name.endsWith(".txt") && !file.name.endsWith(".pdf")) { | |
setError("Please choose a text or PDF file"); | |
return; | |
} | |
setIsLoading(true); | |
try { | |
const response = await fetch(form.action, { | |
method: "POST", | |
body: formData, | |
}); | |
if (!response.ok) { | |
throw new Error(`HTTP error! status: ${response.status}`); | |
} | |
const data = await response.json(); | |
if (data.session_id) { | |
sessionStorage.setItem("session_id", data.session_id); | |
} | |
console.log("response", response); | |
setIsFileUploaded(true); | |
} catch (error) { | |
setError("Error uploading file"); | |
console.error("Error uploading file", error); | |
} finally { | |
form.reset(); | |
setIsLoading(false); | |
} | |
}; | |
const onChangeFile = (e: React.ChangeEvent<HTMLInputElement>) => { | |
e.currentTarget.form?.requestSubmit(); | |
}; | |
return !isFileUploaded ? ( | |
<> | |
{isLoading && ( | |
<div className="flex flex-col items-center justify-center w-full"> | |
<p className="text-gray-500 text-center mb-4">Loading...</p> | |
<div className="w-40 h-40 border-4 border-gray-300 border-t-blue-500 rounded-full animate-spin"></div> | |
</div> | |
)} | |
{!isLoading && ( | |
<form | |
method="post" | |
action="/api/file" | |
onSubmit={onSubmitFile} | |
encType="multipart/form-data" | |
className="w-full" | |
> | |
{error && <p className="text-red-500 text-center mb-4">{error}</p>} | |
<div className="bg-white relative w-full h-40 flex items-center justify-center text-gray-500 rounded-3xl relative border border-transparent hover:border-blue-500 hover:text-blue-500 transition-colors duration-300 shadow-md"> | |
<input | |
type="file" | |
name="file" | |
onChange={onChangeFile} | |
placeholder="Upload a file" | |
className="absolute inset-0 opacity-0 cursor-pointer" | |
/> | |
<p className="text-center"> | |
<span className="font-bold text-xl">Drop a .pdf or .txt</span> | |
<br /> | |
or click to upload | |
</p> | |
</div> | |
</form> | |
)} | |
</> | |
) : null; | |
} | |
export { FileUpload }; | |