From d5f1856cc5a0aded4aca765ebad5870549f2a85d Mon Sep 17 00:00:00 2001 From: thibaud-leclere Date: Tue, 14 Apr 2026 15:27:29 +0200 Subject: [PATCH] feat(ui): add delete confirmation modal --- src/components/projects/ProjectDashboard.tsx | 13 +++- src/components/settings/SettingsPage.tsx | 13 +++- src/components/tickets/TicketDetail.tsx | 13 +++- src/components/trackers/TrackerList.tsx | 16 ++++- src/components/ui/ConfirmModal.tsx | 74 ++++++++++++++++++++ 5 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 src/components/ui/ConfirmModal.tsx diff --git a/src/components/projects/ProjectDashboard.tsx b/src/components/projects/ProjectDashboard.tsx index fc4e13f..228cb6c 100644 --- a/src/components/projects/ProjectDashboard.tsx +++ b/src/components/projects/ProjectDashboard.tsx @@ -4,6 +4,7 @@ import { useParams, Link, useNavigate } from "react-router-dom"; import { getProject, deleteProject, listTrackers, listProcessedTickets } from "../../lib/api"; import type { Project, WatchedTracker, ProcessedTicket } from "../../lib/types"; import TrackerList from "../trackers/TrackerList"; +import ConfirmModal from "../ui/ConfirmModal"; type ActivityLevel = "info" | "success" | "error"; @@ -41,6 +42,7 @@ export default function ProjectDashboard() { const [activity, setActivity] = useState([]); const [activePolls, setActivePolls] = useState>({}); const [activeAgents, setActiveAgents] = useState>({}); + const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); function appendActivity(level: ActivityLevel, message: string) { const item: ActivityItem = { @@ -218,8 +220,7 @@ export default function ProjectDashboard() { async function handleDelete() { if (!projectId) return; - if (!window.confirm(`Delete project "${project?.name}"?`)) return; - + setIsDeleteModalOpen(false); await deleteProject(projectId); window.dispatchEvent(new Event("orchai:refresh-projects")); navigate("/"); @@ -258,7 +259,7 @@ export default function ProjectDashboard() { Edit + + + + + ); +}