EvalueTonSavoir/client/src/components/ImageGallery/ImageGallery.tsx

151 lines
4.7 KiB
TypeScript
Raw Normal View History

2025-03-04 19:49:18 -05:00
import React, { useState, useEffect } from "react";
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Table,
TableBody,
TableCell,
TableContainer,
TableRow,
IconButton,
Paper,
TextField,
Box
} from "@mui/material";
import ContentCopyIcon from "@mui/icons-material/ContentCopy";
import CloseIcon from "@mui/icons-material/Close";
import EditIcon from "@mui/icons-material/Edit";
import { Images } from "../../Types/Images";
import ApiService from '../../services/ApiService';
2025-03-11 19:53:34 -04:00
import { ENV_VARIABLES } from '../../constants';
2025-03-04 19:49:18 -05:00
type Props = {
galleryOpen: boolean;
admin: boolean;
setDialogOpen: React.Dispatch<React.SetStateAction<boolean>>;
setImageLinks: React.Dispatch<React.SetStateAction<string[]>>;
}
const ImageDialog: React.FC<Props> = ({ galleryOpen, admin, setDialogOpen, setImageLinks }) => {
const [copiedId, setCopiedId] = useState<string | null>(null);
const [editingId, setEditingId] = useState<string | null>(null);
const [images, setImages] = useState<Images[]>([]);
const [totalImg, setTotalImg] = useState(0);
const [imgPage, setImgPage] = useState(1);
const [imgLimit] = useState(3);
const fetchImages = async (page: number, limit: number) => {
const data = await ApiService.getImages(page, limit);
setImages(data.images);
setTotalImg(data.total);
};
useEffect(() => {
fetchImages(imgPage, imgLimit);
}, [imgPage]); // Re-fetch images when page changes
const handleEditClick = (id: string) => {
setEditingId(id === editingId ? null : id);
};
const onCopy = (id: string) => {
const escLink = `${ENV_VARIABLES.IMG_URL}/api/image/get/${id}`;
console.log(escLink);
2025-03-04 19:49:18 -05:00
setCopiedId(id);
2025-03-04 19:59:05 -05:00
setImageLinks(prevLinks => [...prevLinks, escLink]);
2025-03-04 19:49:18 -05:00
};
const handleNextPage = () => {
if ((imgPage * imgLimit) < totalImg) {
setImgPage(prev => prev + 1);
}
};
const handlePrevPage = () => {
if (imgPage > 1) {
setImgPage(prev => prev - 1);
}
};
return (
<Dialog
open={galleryOpen}
onClose={() => setDialogOpen(false)}
maxWidth="xl" // 'md' stands for medium size
>
<DialogTitle>
Images disponibles
<IconButton
aria-label="close"
color="primary"
onClick={() => setDialogOpen(false)}
style={{ position: "absolute", right: 8, top: 8 }}
>
<CloseIcon />
</IconButton>
</DialogTitle>
<DialogContent>
<TableContainer component={Paper}>
<Table>
<TableBody>
{images.map((obj: Images) => (
<TableRow key={obj.id}>
<TableCell>
<img
src={`data:${obj.mime_type};base64,${obj.file_content}`}
alt={`Image ${obj.file_name}`}
style={{ width: 350, height: "auto", borderRadius: 8 }}
/>
</TableCell>
<TableCell>
{admin && editingId === obj.id ? (
<TextField
value={obj.file_name}
variant="outlined"
size="small"
style={{ maxWidth: 150 }}
/>
) : (
obj.file_name
)}
</TableCell>
<TableCell style={{ minWidth: 150 }}>
{obj.id}
2025-03-06 20:33:57 -05:00
<IconButton onClick={() => onCopy(obj.id)} size="small" data-testid={`copy-button-${obj.id}`}>
2025-03-04 19:49:18 -05:00
<ContentCopyIcon fontSize="small" />
</IconButton>
{admin && (
<>
2025-03-06 20:33:57 -05:00
<IconButton onClick={() => handleEditClick(obj.id)} size="small" color="primary" data-testid={`edit-button-${obj.id}`}>
2025-03-04 19:49:18 -05:00
<EditIcon fontSize="small" />
</IconButton>
</>
)}
{copiedId === obj.id && <span style={{ marginLeft: 8, color: "green" }}>Copié!</span>}
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
</DialogContent>
<DialogActions style={{ justifyContent: "center", width: "100%" }}>
<Box display="flex" justifyContent="center" width="100%">
<Button onClick={handlePrevPage} disabled={imgPage === 1} color="primary">
Précédent
</Button>
<Button onClick={handleNextPage} disabled={(imgPage * imgLimit) >= totalImg} color="primary">
Suivant
</Button>
</Box>
</DialogActions>
</Dialog>
);
};
export default ImageDialog;