71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
(() => {
|
|
'use strict';
|
|
|
|
const button = document.querySelector('#wakeLockBtn');
|
|
if (!button) return;
|
|
|
|
let wakeLock = null;
|
|
let wanted = false;
|
|
|
|
function supported() {
|
|
return 'wakeLock' in navigator;
|
|
}
|
|
|
|
function active() {
|
|
return wakeLock !== null && wakeLock.released === false;
|
|
}
|
|
|
|
function render() {
|
|
const isActive = active();
|
|
button.disabled = !supported();
|
|
button.classList.toggle('wake-active', isActive);
|
|
button.textContent = 'WakeLock';
|
|
button.title = supported() ? '화면 꺼짐 방지' : '현재 브라우저에서 WakeLock을 지원하지 않습니다.';
|
|
}
|
|
|
|
async function requestWakeLock() {
|
|
if (!supported()) {
|
|
render();
|
|
return;
|
|
}
|
|
|
|
wakeLock = await navigator.wakeLock.request('screen');
|
|
wakeLock.addEventListener('release', () => {
|
|
wakeLock = null;
|
|
render();
|
|
});
|
|
render();
|
|
}
|
|
|
|
async function releaseWakeLock() {
|
|
wanted = false;
|
|
if (wakeLock) {
|
|
await wakeLock.release();
|
|
}
|
|
wakeLock = null;
|
|
render();
|
|
}
|
|
|
|
button.addEventListener('click', () => {
|
|
const job = active() ? releaseWakeLock() : (async () => {
|
|
wanted = true;
|
|
await requestWakeLock();
|
|
})();
|
|
|
|
job.catch(error => {
|
|
wanted = false;
|
|
wakeLock = null;
|
|
alert(error.message || 'WakeLock failed');
|
|
render();
|
|
});
|
|
});
|
|
|
|
document.addEventListener('visibilitychange', () => {
|
|
if (document.visibilityState === 'visible' && wanted && !active()) {
|
|
requestWakeLock().catch(() => render());
|
|
}
|
|
});
|
|
|
|
render();
|
|
})();
|