From 14ae6efa102a0856dfdbd021956dad10c6ade3d9 Mon Sep 17 00:00:00 2001 From: "Niraj Chaudhari (Persistent Systems Inc)" Date: Wed, 27 May 2026 15:04:24 +0530 Subject: [PATCH] fix: prevent plan page infinite loading on refresh before approval --- src/frontend/src/pages/PlanPage.tsx | 33 ++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/pages/PlanPage.tsx b/src/frontend/src/pages/PlanPage.tsx index 11f598525..6304e40e5 100644 --- a/src/frontend/src/pages/PlanPage.tsx +++ b/src/frontend/src/pages/PlanPage.tsx @@ -25,6 +25,9 @@ import "../styles/PlanPage.css" // Create API service instance const apiService = new APIService(); +// Module-level flag to ensure reload redirect only fires once per actual page reload +let hasHandledReload = false; + /** * Page component for displaying a specific plan * Accessible via the route /plan/{plan_id} @@ -460,8 +463,36 @@ const PlanPage: React.FC = () => { }); return () => unsubscribe(); - }, [scrollToBottom, planData, processAgentMessage]); //onPlanReceived, scrollToBottom + }, [scrollToBottom, planData, processAgentMessage]); //onPlanReceived, scrollToBottom + + // Detect page reload and navigate to Home (only if plan is not yet approved) + useEffect(() => { + if (hasHandledReload) return; + if (loading) return; // Wait until plan data is loaded before deciding + if (!showApprovalButtons) return; // Plan already approved, stay on page + const navEntries = performance.getEntriesByType("navigation") as PerformanceNavigationTiming[]; + if (navEntries.length > 0 && navEntries[0].type === "reload") { + hasHandledReload = true; + navigate("/", { replace: true }); + } + }, [navigate, showApprovalButtons, loading]); + + // Warn user before page refresh/close (only when plan is pending approval) + useEffect(() => { + const handleBeforeUnload = (e: BeforeUnloadEvent) => { + e.preventDefault(); + e.returnValue = ""; + }; + if (planId && !errorLoading && showApprovalButtons) { + window.addEventListener("beforeunload", handleBeforeUnload); + } + + return () => { + window.removeEventListener("beforeunload", handleBeforeUnload); + }; + }, [planId, errorLoading, showApprovalButtons]); + console.log('Niraj Chaudhari 99'); // Loading message rotation effect useEffect(() => { let interval: NodeJS.Timeout;