From 9743579c296f8183c975300c67abb9c626c93034 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sun, 1 Mar 2026 07:27:30 -0600 Subject: [PATCH] add debug draw overlay to debug replay --- web/src/pages/Replay.tsx | 95 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/web/src/pages/Replay.tsx b/web/src/pages/Replay.tsx index fb0e5211d..c1c50f56d 100644 --- a/web/src/pages/Replay.tsx +++ b/web/src/pages/Replay.tsx @@ -1,5 +1,5 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; import { Trans, useTranslation } from "react-i18next"; import useSWR from "swr"; import axios from "axios"; @@ -45,11 +45,14 @@ import { ObjectType } from "@/types/ws"; import WsMessageFeed from "@/components/ws/WsMessageFeed"; import { ConfigSectionTemplate } from "@/components/config-form/sections/ConfigSectionTemplate"; -import { LuInfo, LuSettings } from "react-icons/lu"; +import { LuExternalLink, LuInfo, LuSettings } from "react-icons/lu"; import { LuSquare } from "react-icons/lu"; import { MdReplay } from "react-icons/md"; -import { isMobile } from "react-device-detect"; +import { isDesktop, isMobile } from "react-device-detect"; import Logo from "@/components/Logo"; +import { Separator } from "@/components/ui/separator"; +import { useDocDomain } from "@/hooks/use-doc-domain"; +import DebugDrawingLayer from "@/components/overlay/DebugDrawingLayer"; type DebugReplayStatus = { active: boolean; @@ -105,6 +108,7 @@ const REPLAY_INIT_SKELETON_TIMEOUT_MS = 8000; export default function Replay() { const { t } = useTranslation(["views/replay", "views/settings", "common"]); const navigate = useNavigate(); + const { getLocaleDocUrl } = useDocDomain(); const { data: status, @@ -187,6 +191,10 @@ export default function Replay() { const [showReplayInitSkeleton, setShowReplayInitSkeleton] = useState(false); + // debug draw + const containerRef = useRef(null); + const [debugDraw, setDebugDraw] = useState(false); + useEffect(() => { if (!status?.active || !status.replay_camera) { setShowReplayInitSkeleton(false); @@ -321,7 +329,7 @@ export default function Replay() { ) : ( status.replay_camera && ( -
+
+ {debugDraw && ( + + )} {showReplayInitSkeleton && (
@@ -452,6 +473,70 @@ export default function Replay() {
); })} + {isDesktop && ( + <> + +
+
+
+ + + + +
+ + + {t("button.info", { ns: "common" })} + +
+
+ + {t("debug.objectShapeFilterDrawing.tips", { + ns: "views/settings", + })} +
+ + {t("readTheDocumentation", { + ns: "common", + })} + + +
+
+
+
+
+ {t("debug.objectShapeFilterDrawing.desc", { + ns: "views/settings", + })} +
+
+ { + setDebugDraw(isChecked); + }} + /> +
+ + )}