import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useScenarios, useStartScenario, useStopScenario, useDeleteScenario } from '@/hooks/useScenarios'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Checkbox } from '@/components/ui/checkbox'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { MoreHorizontal, Play, Square, Trash2, BarChart3, X, FileText, } from 'lucide-react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; const statusColors = { draft: 'secondary', running: 'default', completed: 'outline', archived: 'destructive', } as const; export function ScenariosPage() { const navigate = useNavigate(); const { data: scenarios, isLoading } = useScenarios(); const [selectedScenarios, setSelectedScenarios] = useState>(new Set()); const [showCompareModal, setShowCompareModal] = useState(false); const startScenario = useStartScenario(''); const stopScenario = useStopScenario(''); const deleteScenario = useDeleteScenario(); const toggleScenario = (id: string, e: React.MouseEvent) => { e.stopPropagation(); setSelectedScenarios((prev) => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else if (next.size < 4) { next.add(id); } return next; }); }; const toggleAll = () => { if (selectedScenarios.size > 0) { setSelectedScenarios(new Set()); } else if (scenarios?.items) { const firstFour = scenarios.items.slice(0, 4).map((s) => s.id); setSelectedScenarios(new Set(firstFour)); } }; const clearSelection = () => { setSelectedScenarios(new Set()); }; const handleCompare = () => { setShowCompareModal(true); }; const confirmCompare = () => { const ids = Array.from(selectedScenarios); navigate('/compare', { state: { scenarioIds: ids } }); }; const handleStart = (_id: string, e: React.MouseEvent) => { e.stopPropagation(); startScenario.mutate(); }; const handleStop = (_id: string, e: React.MouseEvent) => { e.stopPropagation(); stopScenario.mutate(); }; const handleDelete = (id: string, e: React.MouseEvent) => { e.stopPropagation(); if (confirm('Are you sure you want to delete this scenario?')) { deleteScenario.mutate(id); } }; const canCompare = selectedScenarios.size >= 2 && selectedScenarios.size <= 4; if (isLoading) { return
Loading...
; } const selectedScenarioData = scenarios?.items.filter((s) => selectedScenarios.has(s.id)); return (
{/* Header */}

Scenarios

Manage your AWS cost simulation scenarios

{selectedScenarios.size > 0 && (
{selectedScenarios.size} selected
)}
{/* Selection Mode Indicator */} {selectedScenarios.size > 0 && (
Comparison Mode: Select 2-4 scenarios
{selectedScenarioData?.map((s) => ( {s.name} setSelectedScenarios((prev) => { const next = new Set(prev); next.delete(s.id); return next; })} /> ))}
)} 0 && selectedScenarios.size === (scenarios?.items.length || 0)} onCheckedChange={toggleAll} aria-label="Select all" /> Name Status Region Requests Cost Actions {scenarios?.items.map((scenario) => ( navigate(`/scenarios/${scenario.id}`)} > e.stopPropagation()}> {}} onClick={(e: React.MouseEvent) => toggleScenario(scenario.id, e)} aria-label={`Select ${scenario.name}`} /> {scenario.name} {scenario.status} {scenario.region} {scenario.total_requests.toLocaleString()} ${scenario.total_cost_estimate.toFixed(6)} e.stopPropagation()}>
{scenario.status === 'draft' && ( handleStart(scenario.id, e as React.MouseEvent)}> Start )} {scenario.status === 'running' && ( handleStop(scenario.id, e as React.MouseEvent)}> Stop )} handleDelete(scenario.id, e as React.MouseEvent)} > Delete
))}
{/* Compare Confirmation Modal */} Compare Scenarios You are about to compare {selectedScenarios.size} scenarios side by side.

Selected scenarios:

    {selectedScenarioData?.map((s, i) => (
  • {i + 1}. {s.name} {s.region}
  • ))}
); }