diff --git a/webapp/app.tsx b/webapp/app.tsx index 5863641..c6cb573 100644 --- a/webapp/app.tsx +++ b/webapp/app.tsx @@ -5,7 +5,6 @@ import { meetingIdAtom } from './store/atom' export default function WOOM() { const [meetingId] = useAtom(meetingIdAtom) - return (
diff --git a/webapp/components/use/wakeLock.ts b/webapp/components/use/wakeLock.ts new file mode 100644 index 0000000..3db0aba --- /dev/null +++ b/webapp/components/use/wakeLock.ts @@ -0,0 +1,38 @@ +export default class WakeLock { + private lock: WakeLockSentinel | null + private onRelease: () => void + + constructor(handleRelease?: () => void) { + this.lock = null + this.onRelease = handleRelease ?? (() => {}) + } + + private handleVisibilityChange = () => { + if (this.lock !== null && document.visibilityState === 'visible') { + this.request() + } + } + + public request = async () => { + if (this.lock == null) { + document.addEventListener('visibilitychange', this.handleVisibilityChange) + } + try { + this.lock = await navigator.wakeLock.request('screen') + this.lock.addEventListener('release', this.onRelease) + } catch (err) { + console.error('Failed to request wake lock:', err) + } + } + + public release = async () => { + try { + await this.lock?.release() + } catch (err) { + console.error('Failed to release wake lock:', err) + } finally { + this.lock = null + document.removeEventListener('visibilitychange', this.handleVisibilityChange) + } + } +} diff --git a/webapp/pages/meeting.tsx b/webapp/pages/meeting.tsx index 50bf1e2..828fa09 100644 --- a/webapp/pages/meeting.tsx +++ b/webapp/pages/meeting.tsx @@ -2,9 +2,20 @@ import { useAtom } from 'jotai' import { meetingJoinedAtom } from '../store/atom' import Layout from '../components/layout' import Prepare from '../components/prepare' +import { useEffect } from 'react' +import WakeLock from '../components/use/wakeLock' export default function Meeting(props: { meetingId: string }) { const [meetingJoined] = useAtom(meetingJoinedAtom) + useEffect(() => { + const lock = new WakeLock() + if (meetingJoined) { + lock.request() + } + return () => { + lock.release() + } + }, [meetingJoined]) return (
{meetingJoined