-
- DISTANCE
+
);
diff --git a/app/ui/src/app/results/hooks/useIsClient.ts b/app/ui/src/app/results/hooks/useIsClient.ts
new file mode 100644
index 00000000..acafeac8
--- /dev/null
+++ b/app/ui/src/app/results/hooks/useIsClient.ts
@@ -0,0 +1,12 @@
+"use client";
+
+import { useSyncExternalStore } from "react";
+
+/** True after mount; false during SSR (for createPortal targets). */
+export function useIsClient(): boolean {
+ return useSyncExternalStore(
+ () => () => {},
+ () => true,
+ () => false,
+ );
+}
diff --git a/app/ui/src/app/results/page.tsx b/app/ui/src/app/results/page.tsx
index 8ec3ad7d..8bbd3c57 100644
--- a/app/ui/src/app/results/page.tsx
+++ b/app/ui/src/app/results/page.tsx
@@ -3,6 +3,13 @@
"use client";
import { useCallback, useEffect, useState } from "react";
+import { NAVBAR_V2_LOGO, NAVBAR_V2_ROOT } from "../edit/formStyles.v2";
+import styles from "../edit/edit.module.css";
+import EditSidebar from "../edit/components/layout/sidebar/Sidebar";
+import SidebarEditButton from "../edit/components/layout/sidebar/SidebarEditButton";
+import SidebarResultsButton from "../edit/components/layout/sidebar/SidebarResultsButton";
+import ExportEditWarningModal from "./components/ExportEditWarningModal";
+import ExportRoutesModal from "./components/ExportRoutesModal";
import MapComponent from "./components/Map";
import Sidebar from "./components/Sidebar";
import type { PendingPinMove, Route } from "./types";
@@ -36,11 +43,12 @@ export default function ResultsPage() {
}
}, [initialRoutes.length]);
- const [isSidebarOpen, setIsSidebarOpen] = useState(true);
const [isEditMode, setIsEditMode] = useState(false);
const [pendingPinMove, setPendingPinMove] = useState
(
null,
);
+ const [exportOpen, setExportOpen] = useState(false);
+ const [exportWarningOpen, setExportWarningOpen] = useState(false);
const updateStopNote = useCallback(
(routeId: string, stopId: string, note: string) => {
@@ -106,8 +114,33 @@ export default function ResultsPage() {
const cancelPendingPinMove = useCallback(() => setPendingPinMove(null), []);
+ const handleExportClick = useCallback(() => {
+ if (isEditMode || pendingPinMove != null) {
+ setExportWarningOpen(true);
+ return;
+ }
+ setExportOpen(true);
+ }, [isEditMode, pendingPinMove]);
+
+ const handleDoneEditingForExport = useCallback(() => {
+ handleEditModeChange(false);
+ setExportWarningOpen(false);
+ }, [handleEditModeChange]);
+
return (
-
+
+ setExportOpen(false)}
+ routes={routes}
+ />
+ setExportWarningOpen(false)}
+ onDoneEditing={handleDoneEditingForExport}
+ />
{error && (
@@ -122,35 +155,9 @@ export default function ResultsPage() {
)}{" "}
{/* Map container switched to h-screen and added overflow hidden so the page is forced to be exactly one screen tall, whereas before the page was allowed to get taller than browser window leading to a long scroll */}
-