import { Suspense, lazy, useState, useCallback, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import * as Sentry from "@sentry/react"; import { useYjs } from "~/lib/use-yjs"; import { useRouting } from "~/lib/use-routing"; import { ProfileSelector } from "~/components/ProfileSelector"; import { ExportButton } from "~/components/ExportButton"; import { SaveToJournalButton } from "~/components/SaveToJournalButton"; import { YjsDebugPanel } from "~/components/YjsDebugPanel"; const PlannerMap = lazy(() => import("~/components/PlannerMap").then((m) => ({ default: m.PlannerMap })), ); const WaypointSidebar = lazy(() => import("~/components/WaypointSidebar").then((m) => ({ default: m.WaypointSidebar })), ); const ElevationChart = lazy(() => import("~/components/ElevationChart").then((m) => ({ default: m.ElevationChart })), ); interface SessionViewProps { sessionId: string; callbackUrl?: string; callbackToken?: string; returnUrl?: string; initialWaypoints?: Array<{ lat: number; lon: number; name?: string }>; } export function SessionView({ sessionId, callbackUrl, callbackToken, returnUrl, initialWaypoints }: SessionViewProps) { const { t } = useTranslation("planner"); useEffect(() => { Sentry.setTag("session_id", sessionId); }, [sessionId]); const yjs = useYjs(sessionId, initialWaypoints); const { isHost, computing, routeStats, requestRoute } = useRouting(yjs); const [highlightPosition, setHighlightPosition] = useState<[number, number] | null>(null); const handleElevationHover = useCallback((pos: [number, number] | null) => { setHighlightPosition(pos); }, []); if (!yjs) { return (

{t("connecting")}

); } return ( <>
{t("title")}
{callbackUrl && callbackToken && ( )} {computing && ( {t("computingRoute")} )} {isHost && ( {t("host")} )} {yjs.connected ? t("connected") : t("connecting")} ยท {sessionId.slice(0, 8)}
{computing && (
)} {t("loadingMap")}
} >
); }