|
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
<title>디지털 굿판</title>
|
|
|
|
|
|
<link rel="manifest" href="/static/manifest.json">
|
|
<meta name="theme-color" content="#000000">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
|
<meta name="apple-mobile-web-app-title" content="디지털 굿판">
|
|
<link rel="apple-touch-icon" href="/static/icons/icon-152x152.png">
|
|
|
|
<script>
|
|
|
|
async function preventSleep() {
|
|
try {
|
|
if ('wakeLock' in navigator) {
|
|
const wakeLock = await navigator.wakeLock.request('screen');
|
|
console.log('화면 켜짐 유지 활성화');
|
|
|
|
|
|
document.addEventListener('visibilitychange', async () => {
|
|
if (document.visibilityState === 'visible') {
|
|
await preventSleep();
|
|
}
|
|
});
|
|
}
|
|
} catch (err) {
|
|
console.log('화면 켜짐 유지 실패:', err);
|
|
}
|
|
}
|
|
|
|
|
|
class AppState {
|
|
static async save(state) {
|
|
try {
|
|
localStorage.setItem('appState', JSON.stringify(state));
|
|
} catch (err) {
|
|
console.error('상태 저장 실패:', err);
|
|
}
|
|
}
|
|
|
|
static async load() {
|
|
try {
|
|
const state = localStorage.getItem('appState');
|
|
return state ? JSON.parse(state) : null;
|
|
} catch (err) {
|
|
console.error('상태 복원 실패:', err);
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
window.addEventListener('load', async () => {
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
try {
|
|
const registration = await navigator.serviceWorker.register('/static/service-worker.js');
|
|
console.log('ServiceWorker 등록 성공:', registration.scope);
|
|
} catch (err) {
|
|
console.log('ServiceWorker 등록 실패:', err);
|
|
}
|
|
}
|
|
|
|
|
|
await preventSleep();
|
|
|
|
|
|
const savedState = await AppState.load();
|
|
if (savedState) {
|
|
|
|
window.gradioApp().querySelector('#component-0').value = savedState;
|
|
}
|
|
});
|
|
|
|
|
|
window.addEventListener('beforeunload', () => {
|
|
const currentState = window.gradioApp().querySelector('#component-0').value;
|
|
AppState.save(currentState);
|
|
});
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="gradio-app"></div>
|
|
</body>
|
|
</html> |