import React, { useState, useEffect } from "react"; import { Box, CircularProgress, Button, IconButton, Card, CardContent, Dialog, DialogContent, DialogActions, DialogTitle, DialogContentText, Tabs, Tab, TextField, Snackbar, Alert } from "@mui/material"; import DeleteIcon from "@mui/icons-material/Delete"; import ContentCopyIcon from "@mui/icons-material/ContentCopy"; import CloseIcon from "@mui/icons-material/Close"; import { ImageType } from "../../Types/ImageType"; import ApiService from "../../services/ApiService"; import { Upload } from "@mui/icons-material"; interface ImagesProps { handleCopy?: (id: string) => void; } const ImageGallery: React.FC = ({ handleCopy }) => { const [images, setImages] = useState([]); const [totalImg, setTotalImg] = useState(0); const [imgPage, setImgPage] = useState(1); const [imgLimit] = useState(6); const [loading, setLoading] = useState(false); const [selectedImage, setSelectedImage] = useState(null); const [openDeleteDialog, setOpenDeleteDialog] = useState(false); const [imageToDelete, setImageToDelete] = useState(null); const [tabValue, setTabValue] = useState(0); const [importedImage, setImportedImage] = useState(null); const [preview, setPreview] = useState(null); const [snackbarOpen, setSnackbarOpen] = useState(false); const [snackbarMessage, setSnackbarMessage] = useState(""); const [snackbarSeverity, setSnackbarSeverity] = useState<"success" | "error">("success"); const fetchImages = async () => { setLoading(true); const data = await ApiService.getImages(imgPage, imgLimit); setImages(data.images); setTotalImg(data.total); setLoading(false); }; useEffect(() => { fetchImages(); }, [imgPage]); const handleDelete = async () => { if (imageToDelete) { setLoading(true); const isDeleted = await ApiService.deleteImage(imageToDelete.id); setLoading(false); if (isDeleted) { setImages(images.filter((image) => image.id !== imageToDelete.id)); setSnackbarMessage("Image supprimée avec succès !"); setSnackbarSeverity("success"); } else { setSnackbarMessage("Erreur lors de la suppression de l'image. Veuillez réessayer."); setSnackbarSeverity("error"); } setSnackbarOpen(true); setSelectedImage(null); setImageToDelete(null); setOpenDeleteDialog(false); } }; const defaultHandleCopy = (id: string) => { if (navigator.clipboard) { navigator.clipboard.writeText(id); } }; const handleCopyFunction = handleCopy || defaultHandleCopy; const handleImageUpload = (event: React.ChangeEvent) => { const file = event.target.files ? event.target.files[0] : null; setImportedImage(file); if (file) { const objectUrl = URL.createObjectURL(file); setPreview(objectUrl); } }; const handleSaveImage = async () => { try { if (!importedImage) { setSnackbarMessage("Veuillez d'abord choisir une image à téléverser."); setSnackbarSeverity("error"); setSnackbarOpen(true); return; } const imageUrl = await ApiService.uploadImage(importedImage); if (imageUrl.includes("ERROR")) { setSnackbarMessage("Une erreur est survenue. Veuillez réessayer plus tard."); setSnackbarSeverity("error"); setSnackbarOpen(true); return; } fetchImages(); setSnackbarMessage("Téléversée avec succès !"); setSnackbarSeverity("success"); setSnackbarOpen(true); // Reset the input field and preview after successful upload setImportedImage(null); setPreview(null); } catch (error) { setSnackbarMessage(`Une erreur est survenue.\n${error}\nVeuillez réessayer plus tard.`); setSnackbarSeverity("error"); setSnackbarOpen(true); } }; return ( setTabValue(newValue)}> {tabValue === 0 && ( <> {loading ? ( ) : ( <> {images.map((obj) => ( setSelectedImage(obj)}> {`Image { e.stopPropagation(); handleCopyFunction(obj.id); }} color="primary" > { e.stopPropagation(); setImageToDelete(obj); setOpenDeleteDialog(true); }} color="error" > ))} )} )} {tabValue === 1 && ( {/* Image Preview at the top */} {preview && ( Preview )} )} setSelectedImage(null)} maxWidth="md"> setSelectedImage(null)} sx={{ position: "absolute", right: 8, top: 8, zIndex: 1 }}> {selectedImage && ( Enlarged view )} {/* Delete Confirmation Dialog */} setOpenDeleteDialog(false)}> Supprimer Voulez-vous supprimer cette image? setSnackbarOpen(false)}> setSnackbarOpen(false)} severity={snackbarSeverity} sx={{ width: "100%" }}> {snackbarMessage} ); }; export default ImageGallery;