Spaces:
Running
Running
import React, { useCallback, useEffect, useState } from "react"; | |
import axios from 'axios'; | |
import { useDropzone } from 'react-dropzone'; | |
import {getHost} from "@/helpers/getHost" | |
const FileUpload = () => { | |
const [files, setFiles] = useState([]); | |
const host = getHost(); | |
const fetchFiles = useCallback(async () => { | |
try { | |
const response = await axios.get(`${host}/files/`); | |
setFiles(response.data.files); | |
} catch (error) { | |
console.error('Error fetching files:', error); | |
} | |
}, [host]); | |
useEffect(() => { | |
fetchFiles(); | |
}, [fetchFiles]); | |
const onDrop = async (acceptedFiles: any[]) => { | |
const formData = new FormData(); | |
acceptedFiles.forEach(file => { | |
formData.append('file', file); | |
}); | |
try { | |
await axios.post(`${host}/upload/`, formData, { | |
headers: { | |
'Content-Type': 'multipart/form-data' | |
} | |
}); | |
fetchFiles(); | |
} catch (error) { | |
console.error('Error uploading files:', error); | |
} | |
}; | |
const deleteFile = async (filename: never) => { | |
try { | |
await axios.delete(`${host}/files/${filename}`); | |
fetchFiles(); | |
} catch (error) { | |
console.error('Error deleting file:', error); | |
} | |
}; | |
const { getRootProps, getInputProps } = useDropzone({ onDrop }); | |
return ( | |
<div className={"mb-4 w-full"}> | |
<div {...getRootProps()} style={{ border: '2px dashed #cccccc', padding: '20px', textAlign: 'center' }}> | |
<input {...getInputProps()} /> | |
<p>Drag 'n' drop some files here, or click to select files</p> | |
</div> | |
{files.length > 0 && ( | |
<> | |
<h2 className={"text-gray-900 mt-2 text-xl"}>Uploaded Files</h2> | |
<ul role={"list"} className={"my-2 divide-y divide-gray-100"}> | |
{files.map(file => ( | |
<li key={file} className={"flex justify-between gap-x-6 py-1"}> | |
<span className={"flex-1"}>{file}</span> | |
<button onClick={(e) => { e.preventDefault(); deleteFile(file) }}> | |
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth="1.5" | |
stroke="currentColor" className="size-6"> | |
<path strokeLinecap="round" strokeLinejoin="round" | |
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"/> | |
</svg> | |
</button> | |
</li> | |
))} | |
</ul> | |
</> | |
)} | |
</div> | |
); | |
}; | |
export default FileUpload; |