diff --git a/apps/web/src/pages/terminal.tsx b/apps/web/src/pages/terminal.tsx index ab0abdd..cb21217 100644 --- a/apps/web/src/pages/terminal.tsx +++ b/apps/web/src/pages/terminal.tsx @@ -48,8 +48,11 @@ export const TerminalPage: React.FC = () => { const focusInputRef = useRef<(() => void) | null>(null); const [showResetConfirm, setShowResetConfirm] = useState(false); const [showSpecialKeysPanel, setShowSpecialKeysPanel] = useState(false); - const [activeModifier, setActiveModifier] = useState(null); - const { isOpen: isKeyboardOpen, height: keyboardHeight } = useVirtualKeyboard(); + const [activeModifier, setActiveModifier] = useState( + null, + ); + const { isOpen: isKeyboardOpen, height: keyboardHeight } = + useVirtualKeyboard(); const { sessions, @@ -172,6 +175,35 @@ export const TerminalPage: React.FC = () => { setActiveSessionId, ]); + // Keep screen awake while terminal is open + useEffect(() => { + let wakeLock: WakeLockSentinel | null = null; + + const requestWakeLock = async () => { + try { + if ("wakeLock" in navigator) { + wakeLock = await navigator.wakeLock.request("screen"); + } + } catch { + // Wake lock may be denied; silently ignore + } + }; + + void requestWakeLock(); + + const handleVisibilityChange = () => { + if (document.visibilityState === "visible") { + void requestWakeLock(); + } + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + return () => { + document.removeEventListener("visibilitychange", handleVisibilityChange); + wakeLock?.release().catch(() => {}); + }; + }, []); + // Click outside terminal content/header to exit fullscreen const handleFullscreenClick = useCallback( (e: React.MouseEvent) => {