// file: crates/apps/game-snake-poc-tauri/frontend/ts/lifecycle.ts // version: 1 import type { SnakeTauriSession } from "./game"; import { frontendInfo } from "./logging"; export interface SnakeTauriLifecycleBinding { dispose(): void; } export function bindTauriLifecycle(session: SnakeTauriSession, stage: HTMLElement): SnakeTauriLifecycleBinding { const resizeObserver = new ResizeObserver(() => { session.refreshDeviceClass(); session.renderNow(); }); function synchronizeVisibility(): void { if (document.visibilityState === "hidden") { session.pause(); frontendInfo("Snake Tauri lifecycle: visibility hidden"); return; } session.resume(); session.refreshDeviceClass(); session.renderNow(); frontendInfo("Snake Tauri lifecycle: visibility visible"); } function pageHide(event: PageTransitionEvent): void { if (event.persisted) { session.pause(); } else { session.dispose(); } frontendInfo(`Snake Tauri lifecycle: page hide persisted=${event.persisted}`); } function pageShow(event: PageTransitionEvent): void { session.resume(); session.refreshDeviceClass(); session.renderNow(); frontendInfo(`Snake Tauri lifecycle: page show persisted=${event.persisted}`); } resizeObserver.observe(stage); document.addEventListener("visibilitychange", synchronizeVisibility); window.addEventListener("pagehide", pageHide); window.addEventListener("pageshow", pageShow); synchronizeVisibility(); return { dispose(): void { resizeObserver.disconnect(); document.removeEventListener("visibilitychange", synchronizeVisibility); window.removeEventListener("pagehide", pageHide); window.removeEventListener("pageshow", pageShow); session.dispose(); }, }; }