From 2116c14d079dda64aa5cd4f3217956fc38c85f74 Mon Sep 17 00:00:00 2001 From: Ahmet Guzererler Date: Sun, 22 Mar 2026 22:51:35 +0100 Subject: [PATCH] fix: prevent multiple run triggers from button clicks - add isTriggering state to Dashboard - disable button immediately upon click - update isLoading prop to include trigger state --- agent_os/frontend/src/Dashboard.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/agent_os/frontend/src/Dashboard.tsx b/agent_os/frontend/src/Dashboard.tsx index 2e8ac8ae..2a81f95b 100644 --- a/agent_os/frontend/src/Dashboard.tsx +++ b/agent_os/frontend/src/Dashboard.tsx @@ -26,12 +26,16 @@ const API_BASE = 'http://127.0.0.1:8088/api'; export const Dashboard: React.FC = () => { const [activeRunId, setActiveRunId] = useState(null); + const [isTriggering, setIsTriggering] = useState(false); const [portfolioId, setPortfolioId] = useState("main_portfolio"); const { events, status, clearEvents } = useAgentStream(activeRunId); const { isOpen, onOpen, onClose } = useDisclosure(); const [selectedNode, setSelectedNode] = useState(null); const startRun = async (type: string) => { + if (isTriggering || status === 'streaming' || status === 'connecting') return; + + setIsTriggering(true); try { clearEvents(); const res = await axios.post(`${API_BASE}/run/${type}`, { @@ -41,6 +45,8 @@ export const Dashboard: React.FC = () => { setActiveRunId(res.data.run_id); } catch (err) { console.error("Failed to start run:", err); + } finally { + setIsTriggering(false); } }; @@ -73,7 +79,7 @@ export const Dashboard: React.FC = () => { colorScheme="cyan" variant="solid" onClick={() => startRun('scan')} - isLoading={status === 'connecting' || status === 'streaming'} + isLoading={isTriggering || status === 'connecting' || status === 'streaming'} > Start Market Scan