diff --git a/client/src/__tests__/components/ImageGallery/ImageGallery.test.tsx b/client/src/__tests__/components/ImageGallery/ImageGallery.test.tsx
index 9604b35..f1da956 100644
--- a/client/src/__tests__/components/ImageGallery/ImageGallery.test.tsx
+++ b/client/src/__tests__/components/ImageGallery/ImageGallery.test.tsx
@@ -32,7 +32,6 @@ describe("ImageDialog Component", () => {
render(
@@ -50,7 +49,6 @@ describe("ImageDialog Component", () => {
render(
@@ -68,7 +66,6 @@ describe("ImageDialog Component", () => {
render(
@@ -85,32 +82,11 @@ describe("ImageDialog Component", () => {
expect(screen.getByText("Copié!")).toBeInTheDocument();
});
- test("shows edit field when admin clicks edit button", async () => {
- await act(async () => {
- render(
-
- );
- });
-
- await waitFor(() => expect(ApiService.getImages).toHaveBeenCalled());
-
- const editButton = screen.getByTestId("edit-button-1");
- fireEvent.click(editButton);
-
- expect(screen.getByDisplayValue("image1.jpg")).toBeInTheDocument();
- });
-
test("navigates to next and previous page", async () => {
await act(async () => {
render(
@@ -127,4 +103,48 @@ describe("ImageDialog Component", () => {
await waitFor(() => expect(ApiService.getImages).toHaveBeenCalledWith(1, 3));
});
+
+ test("deletes an image successfully", async () => {
+ jest.spyOn(ApiService, "deleteImage").mockResolvedValue(true);
+
+ await act(async () => {
+ render(
+
+ );
+ });
+
+ await waitFor(() => expect(ApiService.getImages).toHaveBeenCalled());
+
+ fireEvent.click(screen.getByTestId("delete-button-1"));
+
+ await waitFor(() => expect(ApiService.deleteImage).toHaveBeenCalledWith("1"));
+
+ expect(screen.queryByTestId("delete-button-1")).not.toBeInTheDocument();
+ });
+
+ test("handles failed delete when image is linked", async () => {
+ jest.spyOn(ApiService, "deleteImage").mockResolvedValue(false);
+
+ await act(async () => {
+ render(
+
+ );
+ });
+
+ await waitFor(() => expect(ApiService.getImages).toHaveBeenCalled());
+
+ fireEvent.click(screen.getByTestId("delete-button-1"));
+
+ await waitFor(() => expect(ApiService.deleteImage).toHaveBeenCalledWith("1"));
+
+ expect(screen.getByText("Confirmer la suppression")).toBeInTheDocument();
+ });
});
\ No newline at end of file
diff --git a/client/src/components/ImageGallery/ImageGallery.tsx b/client/src/components/ImageGallery/ImageGallery.tsx
index 069a846..60dfc14 100644
--- a/client/src/components/ImageGallery/ImageGallery.tsx
+++ b/client/src/components/ImageGallery/ImageGallery.tsx
@@ -12,31 +12,30 @@ import {
TableRow,
IconButton,
Paper,
- TextField,
- Box
+ Box,
+ CircularProgress
} 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 DeleteIcon from "@mui/icons-material/Delete";
import { Images } from "../../Types/Images";
import ApiService from '../../services/ApiService';
import { ENV_VARIABLES } from '../../constants';
type Props = {
galleryOpen: boolean;
- admin: boolean;
setDialogOpen: React.Dispatch>;
setImageLinks: React.Dispatch>;
-}
-
-const ImageDialog: React.FC = ({ galleryOpen, admin, setDialogOpen, setImageLinks }) => {
+};
+const ImageDialog: React.FC = ({ galleryOpen, setDialogOpen, setImageLinks }) => {
const [copiedId, setCopiedId] = useState(null);
- const [editingId, setEditingId] = useState(null);
const [images, setImages] = useState([]);
const [totalImg, setTotalImg] = useState(0);
const [imgPage, setImgPage] = useState(1);
const [imgLimit] = useState(3);
+ const [loading, setLoading] = useState(false);
+ const [deleteConfirm, setDeleteConfirm] = useState<{ id: string | null; linked: boolean }>({ id: null, linked: false });
const fetchImages = async (page: number, limit: number) => {
const data = await ApiService.getImages(page, limit);
@@ -46,37 +45,50 @@ const ImageDialog: React.FC = ({ galleryOpen, admin, setDialogOpen, setIm
useEffect(() => {
fetchImages(imgPage, imgLimit);
- }, [imgPage]); // Re-fetch images when page changes
-
- const handleEditClick = (id: string) => {
- setEditingId(id === editingId ? null : id);
- };
+ }, [imgPage]);
const onCopy = (id: string) => {
const escLink = `${ENV_VARIABLES.IMG_URL}/api/image/get/${id}`;
- console.log(escLink);
setCopiedId(id);
setImageLinks(prevLinks => [...prevLinks, escLink]);
};
- const handleNextPage = () => {
- if ((imgPage * imgLimit) < totalImg) {
- setImgPage(prev => prev + 1);
- }
+ const handleDelete = async (id: string) => {
+ setLoading(true);
+ const isDeleted = await ApiService.deleteImage(id);
+ setLoading(false);
+ if (!isDeleted) {
+ setDeleteConfirm({ id, linked: true });
+ } else {
+ setImages(images.filter(image => image.id !== id));
+ setDeleteConfirm({ id: null, linked: false });
+ }
};
-
+
+ const confirmDelete = async () => {
+ if (deleteConfirm.id) {
+ setLoading(true);
+ await ApiService.deleteImage(deleteConfirm.id);
+ setImages(images.filter(image => image.id !== deleteConfirm.id));
+ setDeleteConfirm({ id: null, linked: false });
+ setLoading(false);
+ }
+ };
+
+ const handleNextPage = () => {
+ if ((imgPage * imgLimit) < totalImg) {
+ setImgPage(prev => prev + 1);
+ }
+ };
+
const handlePrevPage = () => {
- if (imgPage > 1) {
- setImgPage(prev => prev - 1);
- }
+ if (imgPage > 1) {
+ setImgPage(prev => prev - 1);
+ }
};
return (
-