// Thin wrapper around the Screen Wake Lock API. Held by the diashow page so a phone // driving a projector doesn't sleep. No-op on unsupported browsers (Firefox, older // Safari). // // Wake locks die when the document goes hidden; the page re-acquires on visible to // keep the screen on across short interruptions. interface SentinelLike { release: () => Promise; } let sentinel: SentinelLike | null = null; let visibilityHandler: (() => void) | null = null; export async function acquireWakeLock(): Promise { const wakeLock = (navigator as Navigator & { wakeLock?: { request: (t: string) => Promise } }).wakeLock; if (!wakeLock) return; try { sentinel = await wakeLock.request('screen'); } catch { // User denied, or already released — nothing useful to do. sentinel = null; } // Re-acquire when the page becomes visible again (the OS releases the lock // while the tab is hidden). if (!visibilityHandler) { visibilityHandler = async () => { if (document.visibilityState === 'visible' && sentinel === null) { try { sentinel = await wakeLock.request('screen'); } catch { sentinel = null; } } }; document.addEventListener('visibilitychange', visibilityHandler); } } export async function releaseWakeLock(): Promise { if (sentinel) { try { await sentinel.release(); } catch { // ignore — release after release is fine } sentinel = null; } if (visibilityHandler) { document.removeEventListener('visibilitychange', visibilityHandler); visibilityHandler = null; } }