From 3ce81e585a2db5fe9c3c36127bc8189e48120ec2 Mon Sep 17 00:00:00 2001 From: Will Chen Date: Thu, 31 Jul 2025 16:34:28 -0700 Subject: [PATCH] Intercept ctrl/command R for refresh (#759) Fixes #209 --- src/app/layout.tsx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3421466..98a54e6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -4,12 +4,39 @@ import { ThemeProvider } from "../contexts/ThemeContext"; import { DeepLinkProvider } from "../contexts/DeepLinkContext"; import { Toaster } from "sonner"; import { TitleBar } from "./TitleBar"; +import { useEffect } from "react"; +import { useRunApp } from "@/hooks/useRunApp"; +import { useAtomValue } from "jotai"; +import { previewModeAtom } from "@/atoms/appAtoms"; export default function RootLayout({ children, }: { children: React.ReactNode; }) { + const { refreshAppIframe } = useRunApp(); + const previewMode = useAtomValue(previewModeAtom); + // Global keyboard listener for refresh events + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + // Check for Ctrl+R (Windows/Linux) or Cmd+R (macOS) + if (event.key === "r" && (event.ctrlKey || event.metaKey)) { + event.preventDefault(); // Prevent default browser refresh + if (previewMode === "preview") { + refreshAppIframe(); // Use our custom refresh function instead + } + } + }; + + // Add event listener to document + document.addEventListener("keydown", handleKeyDown); + + // Cleanup function to remove event listener + return () => { + document.removeEventListener("keydown", handleKeyDown); + }; + }, [refreshAppIframe, previewMode]); + return ( <>