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"; import { escapeForGIFT } from "src/utils/giftUtils"; import { ENV_VARIABLES } from "src/constants"; interface ImagesProps { handleCopy?: (id: string) => void; handleDelete?: (id: string) => void; } const ImageGallery: React.FC = ({ handleCopy, handleDelete }) => { 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.getUserImages(imgPage, imgLimit); setImages(data.images); setTotalImg(data.total); setLoading(false); }; useEffect(() => { fetchImages(); }, [imgPage]); const defaultHandleDelete = async (id: string) => { if (imageToDelete) { setLoading(true); const isDeleted = await ApiService.deleteImage(id); setLoading(false); if (isDeleted) { setImgPage(1); fetchImages(); 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) { const link = `${ENV_VARIABLES.BACKEND_URL}/api/image/get/${id}`; const imgTag = `[markdown] ![texte alternatif d'écrivant l'image pour les personnes qui ne peuvent pas voir l'image](${escapeForGIFT(link)} "texte de l'infobulle (ne fonctionne pas sur écran tactile généralement)") `; setSnackbarMessage("Le lien Markdown de l'image a été copié dans le presse-papiers"); setSnackbarSeverity("success"); setSnackbarOpen(true); navigator.clipboard.writeText(imgTag); } if(handleCopy) { handleCopy(id); } }; const handleDeleteFunction = handleDelete || defaultHandleDelete; 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 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); setImportedImage(null); setPreview(null); setTabValue(0); } catch (error) { setSnackbarMessage(`Une erreur est survenue.\n${error}\nVeuillez réessayer plus tard.`); setSnackbarSeverity("error"); setSnackbarOpen(true); } }; const handleCloseSnackbar = () => { setSnackbarOpen(false); }; return ( setTabValue(newValue)}> {tabValue === 0 && ( <> {loading ? ( ) : ( <> {images.map((obj) => ( setSelectedImage(obj)}> {`Image { e.stopPropagation(); defaultHandleCopy(obj.id); }} color="primary" data-testid={`gallery-tab-copy-${obj.id}`} > { e.stopPropagation(); setImageToDelete(obj); setOpenDeleteDialog(true); }} color="error" data-testid={`gallery-tab-delete-${obj.id}`} > ))} )} )} {tabValue === 1 && ( {/* Image Preview at the top */} {preview && ( Preview )} )} setSelectedImage(null)} maxWidth="md"> setSelectedImage(null)} sx={{ position: "absolute", right: 8, top: 8, zIndex: 1 }} data-testid="close-button"> {selectedImage && ( Enlarged view )} {/* Delete Confirmation Dialog */} setOpenDeleteDialog(false)}> Supprimer Voulez-vous supprimer cette image? {snackbarMessage} ); }; export default ImageGallery;