"use client"; import { useEffect } from "react"; type WakeLockSentinelLike = { release: () => Promise; addEventListener: (type: string, listener: () => void) => void; }; type NavigatorWithWakeLock = Navigator & { wakeLock?: { request: (type: "screen") => Promise }; }; /** * Keeps the screen awake while a study session or guide is open * (feature-detected; silently does nothing where unsupported or denied). * Re-acquires when the tab becomes visible again, releases on leave. */ export function useWakeLock(active = true): void { useEffect(() => { if (!active || typeof navigator === "undefined") return; const wakeLock = (navigator as NavigatorWithWakeLock).wakeLock; if (!wakeLock) return; let sentinel: WakeLockSentinelLike | null = null; let disposed = false; const acquire = async () => { try { sentinel = await wakeLock.request("screen"); sentinel.addEventListener("release", () => { sentinel = null; }); } catch { /* denied or not allowed without a gesture — fine */ } }; const onVisibility = () => { if (document.visibilityState === "visible" && !sentinel && !disposed) void acquire(); }; void acquire(); document.addEventListener("visibilitychange", onVisibility); return () => { disposed = true; document.removeEventListener("visibilitychange", onVisibility); void sentinel?.release().catch(() => {}); }; }, [active]); }