diff --git a/web/src/pages/backoffice/PremiumDemos.tsx b/web/src/pages/backoffice/PremiumDemos.tsx index d83c911..ba71fa0 100644 --- a/web/src/pages/backoffice/PremiumDemos.tsx +++ b/web/src/pages/backoffice/PremiumDemos.tsx @@ -28,6 +28,7 @@ import { useNavigate } from 'react-router-dom' import { api, ApiError, type Demo, type DemoDetails } from '../../lib/api' import { statusColor, statusLabel } from '../../lib/format' import { ChevronIcon, PodStatusPanel } from '../../components/PodStatusPanel' +import { ConfirmDialog } from '../../components/ConfirmDialog' import { CreateDemoModal } from '../../components/CreateDemoModal' import { EditDomainModal } from '../../components/EditDomainModal' import { DemoCard } from '../../components/DemoCard' @@ -42,6 +43,8 @@ export function PremiumDemos() { const navigate = useNavigate() const [demos, setDemos] = useState([]) const [loading, setLoading] = useState(true) + const [busy, setBusy] = useState(null) + const [toDelete, setToDelete] = useState(null) const [createModalOpen, setCreateModalOpen] = useState(false) const [editingDomain, setEditingDomain] = useState(null) @@ -68,6 +71,23 @@ export function PremiumDemos() { return () => clearInterval(id) }, [load]) + const confirmDestroy = async () => { + if (!toDelete) return + const d = toDelete + setBusy(d.id) + try { + await api.deleteDemo(d.id) + toast({ status: 'success', title: 'Plateforme détruite' }) + setToDelete(null) + await load() + } catch (err) { + const msg = err instanceof ApiError ? err.message : 'Erreur' + toast({ status: 'error', title: 'Destruction impossible', description: msg }) + } finally { + setBusy(null) + } + } + const toggleRow = async (d: Demo) => { if (expandedId === d.id) { setExpandedId(null) @@ -107,6 +127,21 @@ export function PremiumDemos() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [expandedId]) + const renderActions = (d: Demo) => ( + + ) + return ( <> @@ -143,6 +178,7 @@ export function PremiumDemos() { Client Statut URL + @@ -198,9 +234,12 @@ export function PremiumDemos() { /> + + {renderActions(d)} + - + {detailsLoading && !details ? ( @@ -234,12 +273,29 @@ export function PremiumDemos() { detailsLoading={detailsLoading} details={expandedId === d.id ? details : null} onEditDomain={() => setEditingDomain(d)} + actions={renderActions(d)} /> ))} )} + setToDelete(null)} + > + La plateforme{' '} + + {toDelete?.namespace} + {' '} + et toutes ses données (client payant) seront supprimées définitivement. Cette action est + irréversible. + + setEditingDomain(null)}