import { SidebarProvider } from "@/components/ui/sidebar"; import { AppSidebar } from "@/components/app-sidebar"; import { ThemeProvider } from "../contexts/ThemeContext"; import { DeepLinkProvider } from "../contexts/DeepLinkContext"; import { Toaster } from "sonner"; import { TitleBar } from "./TitleBar"; import { useEffect, type ReactNode } from "react"; import { useRunApp } from "@/hooks/useRunApp"; import { useAtomValue } from "jotai"; import { previewModeAtom } from "@/atoms/appAtoms"; import { useSettings } from "@/hooks/useSettings"; import type { ZoomLevel } from "@/lib/schemas"; const DEFAULT_ZOOM_LEVEL: ZoomLevel = "100"; export default function RootLayout({ children }: { children: ReactNode }) { const { refreshAppIframe } = useRunApp(); const previewMode = useAtomValue(previewModeAtom); const { settings } = useSettings(); useEffect(() => { const zoomLevel = settings?.zoomLevel ?? DEFAULT_ZOOM_LEVEL; const zoomFactor = Number(zoomLevel) / 100; const electronApi = ( window as Window & { electron?: { webFrame?: { setZoomFactor: (factor: number) => void; }; }; } ).electron; if (electronApi?.webFrame?.setZoomFactor) { electronApi.webFrame.setZoomFactor(zoomFactor); return () => { electronApi.webFrame?.setZoomFactor(Number(DEFAULT_ZOOM_LEVEL) / 100); }; } return () => {}; }, [settings?.zoomLevel]); // 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 ( <>
{children}
); }