import { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import PropTypes from "prop-types"; import { setIsUploading } from "../store/UploadStatusSlice"; const FileUploadModal = ({ show, onClose, onUploadSuccess }) => { const currentPath = useSelector((state) => state.path.currentPath); const dispatch = useDispatch(); const [file, setFile] = useState(null); const [uploading, setUploading] = useState(false); const [uploadMessage, setUploadMessage] = useState(""); const [newFolderName, setNewFolderName] = useState(""); const [creatingFolder, setCreatingFolder] = useState(false); const [folderMessage, setFolderMessage] = useState(""); const username = localStorage.getItem("username"); const API_URL = import.meta.env.VITE_API_URL; useEffect(() => { const handleEsc = (e) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", handleEsc); return () => document.removeEventListener("keydown", handleEsc); }, [onClose]); const isFolderNameValid = (name) => { return /^[a-zA-Z0-9-_ ]+$/.test(name); // disallow special chars like / \ * ? etc. }; const uploadFileToHDFS = async () => { if (!file) { setUploadMessage("⚠️ Please select a file before uploading."); return; } const formData = new FormData(); formData.append("file", file); formData.append("hdfsPath", currentPath); formData.append("uploadedFileName", file.name); formData.append("username", username); try { setUploading(true); setUploadMessage("⏳ Uploading file..."); const response = await fetch(`${API_URL}/api/hdfs/uploadFile`, { method: "POST", body: formData, }); if (!response.ok) { const errorText = await response.text(); setUploadMessage(`❌ Upload failed: ${errorText}`); } else { setUploadMessage("✅ File uploaded successfully!"); dispatch(setIsUploading(true)); // Dispatch the action to set isUploading to true onUploadSuccess(); // Call the onUploadSuccess prop to notify the parent setTimeout(() => { setUploadMessage(""); onClose(); }, 1000); } } catch (err) { console.error(err); setUploadMessage("❌ An error occurred during upload."); } finally { setUploading(false); } }; const createFolder = async () => { if (!newFolderName.trim()) { setFolderMessage("⚠️ Please enter a folder name."); return; } if (!isFolderNameValid(newFolderName.trim())) { setFolderMessage("❌ Folder name contains invalid characters."); return; } try { setCreatingFolder(true); setFolderMessage("⏳ Creating folder..."); const folderPath = currentPath === "/" ? "" : currentPath.replace(/\/$/, ""); const newFolderPath = `${folderPath}/${newFolderName}`; console.log(newFolderPath); const response = await fetch( `${API_URL}/api/hdfs/createFolder?hdfsPath=${newFolderPath}`, { method: "POST" } ); if (!response.ok) { const errorText = await response.text(); setFolderMessage(`❌ Folder creation failed: ${errorText}`); } else { setFolderMessage("✅ Folder created successfully!"); dispatch(setIsUploading(true)); // Dispatch the action to set isUploading to true onUploadSuccess(currentPath); // Call the onUploadSuccess prop after folder creation too setNewFolderName(""); setTimeout(() => { setFolderMessage(""); onClose(); }, 1000); } } catch (err) { console.error(err); setFolderMessage("❌ An error occurred during folder creation."); } finally { setCreatingFolder(false); } }; if (!show) return null; return (
Selected file: {file.name}
)} {uploadMessage && ({uploadMessage}
)}{folderMessage}
)}