61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
// 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();
|
|
},
|
|
};
|
|
}
|