diff --git a/src/components/landing/PortfolioSection.tsx b/src/components/landing/PortfolioSection.tsx index 410ce184..14ef3989 100644 --- a/src/components/landing/PortfolioSection.tsx +++ b/src/components/landing/PortfolioSection.tsx @@ -402,38 +402,38 @@ export default function PortfolioSection() { return () => window.clearInterval(interval); }, [refreshStatus]); - useEffect(() => { - const fetchStatus = async () => { - try { - const res = await apiRequest("GET", "/engine/status"); - const data = await res.json(); - setEngineStatus(data); - } catch { - setEngineStatus(null); - } - }; - - fetchStatus(); - const id = window.setInterval(fetchStatus, 5000); - return () => window.clearInterval(id); + const refreshEngineStatus = useCallback(async () => { + try { + const res = await apiRequest("GET", "/engine/status"); + const data = await res.json(); + setEngineStatus(data); + } catch { + setEngineStatus(null); + } }, []); useEffect(() => { - const fetchMarketStatus = async () => { - try { - const res = await apiRequest("GET", "/market/status"); - const data = await res.json(); - setMarketStatus(data); - } catch { - setMarketStatus(null); - } - }; - - fetchMarketStatus(); - const id = window.setInterval(fetchMarketStatus, 5000); + void refreshEngineStatus(); + const id = window.setInterval(refreshEngineStatus, 5000); return () => window.clearInterval(id); + }, [refreshEngineStatus]); + + const refreshMarketStatus = useCallback(async () => { + try { + const res = await apiRequest("GET", "/market/status"); + const data = await res.json(); + setMarketStatus(data); + } catch { + setMarketStatus(null); + } }, []); + useEffect(() => { + void refreshMarketStatus(); + const id = window.setInterval(refreshMarketStatus, 5000); + return () => window.clearInterval(id); + }, [refreshMarketStatus]); + useEffect(() => { if (prefersReducedMotion) { setIsVisible(true); @@ -800,10 +800,21 @@ export default function PortfolioSection() { description: result?.message || result?.status || "Unable to start strategy.", }); } + } catch (error: any) { + const message = error?.message || "Unable to start strategy."; + if (String(message).includes("401:")) { + setLoginPromptOpen(true); + } + toast({ + title: "Start failed", + description: message, + }); } finally { setIsStarting(false); await Promise.allSettled([ refreshStatus(), + refreshEngineStatus(), + refreshMarketStatus(), refreshBrokerData({ includeEquityCurve: true }), ]); } @@ -859,10 +870,21 @@ export default function PortfolioSection() { description: result?.message || result?.status || "Unable to resume strategy.", }); } + } catch (error: any) { + const message = error?.message || "Unable to resume strategy."; + if (String(message).includes("401:")) { + setLoginPromptOpen(true); + } + toast({ + title: "Resume failed", + description: message, + }); } finally { setIsResuming(false); await Promise.allSettled([ refreshStatus(), + refreshEngineStatus(), + refreshMarketStatus(), refreshBrokerData({ includeEquityCurve: true }), ]); } @@ -873,10 +895,17 @@ export default function PortfolioSection() { try { await stopStrategy(); setFreshStartRequested(false); + } catch (error: any) { + toast({ + title: "Stop failed", + description: error?.message || "Unable to stop strategy.", + }); } finally { setIsStopping(false); await Promise.allSettled([ refreshStatus(), + refreshEngineStatus(), + refreshMarketStatus(), refreshBrokerData({ includeEquityCurve: true }), ]); }