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 (

Manage HDFS

{/* File Upload Section */}

Upload File

setFile(e.target.files[0])} className="w-full mb-3 text-sm text-gray-600 file:mr-4 file:py-2 file:px-4 file:rounded file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100" /> {file && (

Selected file: {file.name}

)} {uploadMessage && (

{uploadMessage}

)}
{/* Create Folder Section */}

Create Folder

setNewFolderName(e.target.value)} className="w-full mb-3 px-3 py-2 border border-gray-300 rounded-lg placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-200" /> {folderMessage && (

{folderMessage}

)}
); }; FileUploadModal.propTypes = { show: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onUploadSuccess: PropTypes.func.isRequired, }; export default FileUploadModal;