diff --git a/frontend/src/pages/Projects.tsx b/frontend/src/pages/Projects.tsx index c2ecadfe10..a13223f638 100644 --- a/frontend/src/pages/Projects.tsx +++ b/frontend/src/pages/Projects.tsx @@ -6,8 +6,14 @@ import { Menu, MenuItem, CircularProgress, + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + DialogActions, } from "@mui/material"; import SettingsIcon from "@mui/icons-material/Settings"; +import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; import { Plus, Link, FolderSearch } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; @@ -39,6 +45,7 @@ import { usePinnedProjectIds, usePinProject, useUnpinProject, + useDeleteProject, } from "../services"; import { useGitRepositories } from "../services/gitRepositoryService"; import type { @@ -140,6 +147,9 @@ const Projects: FC = () => { null, ); const [createDialogOpen, setCreateDialogOpen] = useState(false); + const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false); + const [projectToDelete, setProjectToDelete] = useState(null); + const deleteProjectMutation = useDeleteProject(); // Repository management const currentOrg = account.organizationTools.organization; @@ -309,6 +319,28 @@ const Projects: FC = () => { handleMenuClose(); }; + const handleDeleteProjectMenu = () => { + if (selectedProject) { + setProjectToDelete(selectedProject); + setDeleteConfirmOpen(true); + } + handleMenuClose(); + }; + + const handleConfirmDelete = async () => { + if (!projectToDelete?.id) return; + try { + await deleteProjectMutation.mutateAsync(projectToDelete.id); + snackbar.success("Project deleted successfully"); + await queryClient.invalidateQueries({ queryKey: ["projects"] }); + } catch { + snackbar.error("Failed to delete project"); + } finally { + setDeleteConfirmOpen(false); + setProjectToDelete(null); + } + }; + const handleNewProject = () => { if (!requireLogin()) return; setCreateDialogOpen(true); @@ -794,8 +826,49 @@ const Projects: FC = () => { Settings + + + Delete Project + + {/* Delete Project Confirmation Dialog */} + { + setDeleteConfirmOpen(false); + setProjectToDelete(null); + }} + maxWidth="xs" + fullWidth + > + Delete Project + + + Are you sure you want to delete {projectToDelete?.name}? This action cannot be undone. + + + + + + + + {/* Create Project Dialog */}