import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Upload, X, File, Trash2 } from "lucide-react"; import axios from "axios"; interface LampiranModalProps { isOpen: boolean; onClose: () => void; idMcIpal: number; kodeKomponen: string; namaKomponen: string; editable: boolean; } interface FileItem { name: string; size: number; path: string; } const LampiranModal: React.FC = ({ isOpen, onClose, idMcIpal, kodeKomponen, namaKomponen, editable, }) => { const [files, setFiles] = useState([]); const [isUploading, setIsUploading] = useState(false); const [uploadProgress, setUploadProgress] = useState(0); const [dragActive, setDragActive] = useState(false); useEffect(() => { if (isOpen) { loadFiles(); } }, [isOpen, idMcIpal, kodeKomponen]); const loadFiles = async () => { try { const response = await axios.post( "/pelaporan/al/lampiran-syarat-teknis/list-files", { idmcipal: idMcIpal, kode_komponen: kodeKomponen, } ); setFiles(response.data); } catch (error) { console.error("Error loading files:", error); } }; const handleDrag = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.type === "dragenter" || e.type === "dragover") { setDragActive(true); } else if (e.type === "dragleave") { setDragActive(false); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); if (!editable) return; if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { handleFiles(e.dataTransfer.files); } }; const handleFileInput = (e: React.ChangeEvent) => { if (!editable) return; if (e.target.files && e.target.files.length > 0) { handleFiles(e.target.files); } }; const handleFiles = async (fileList: FileList) => { setIsUploading(true); setUploadProgress(0); const formData = new FormData(); for (let i = 0; i < fileList.length; i++) { formData.append("file[]", fileList[i]); } try { await axios.post( `/pelaporan/al/lampiran-syarat-teknis/upload-file/${idMcIpal}/${kodeKomponen}`, formData, { headers: { "Content-Type": "multipart/form-data", }, onUploadProgress: (progressEvent) => { if (progressEvent.total) { const progress = Math.round( (progressEvent.loaded * 100) / progressEvent.total ); setUploadProgress(progress); } }, } ); loadFiles(); } catch (error) { console.error("Error uploading files:", error); } finally { setIsUploading(false); } }; const deleteFile = async (filePath: string) => { if (!editable) return; try { await axios.post( "/pelaporan/al/lampiran-syarat-teknis/delete-file", { filePath, idmcipal: idMcIpal, kode_komponen: kodeKomponen, } ); loadFiles(); } catch (error) { console.error("Error deleting file:", error); } }; const formatFileSize = (bytes: number): string => { if (bytes === 0) return "0 Bytes"; const k = 1024; const sizes = ["Bytes", "KB", "MB", "GB"]; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; }; if (!isOpen) return null; return (

Lampiran {kodeKomponen}: {namaKomponen}

{editable && (
{isUploading && (

Mengunggah: {uploadProgress}%

)}
)}

File yang diunggah:

{files.length === 0 ? (

Belum ada file yang diunggah

) : (
{files.map((file, index) => (

{file.name}

{formatFileSize(file.size)}

Lihat {editable && ( )}
))}
)}
); }; export default LampiranModal;