59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
// file: Web/game-snake-poc/frontend/ts/lifecycle.ts
|
|
// version: 1
|
|
|
|
import type { SnakeWebSession } from "./game";
|
|
import { webDebug, webInfo } from "./logging";
|
|
|
|
export interface SnakeLifecycleBinding {
|
|
dispose(): void;
|
|
}
|
|
|
|
export function bindBrowserLifecycle(session: SnakeWebSession, stage: HTMLElement): SnakeLifecycleBinding {
|
|
const resizeObserver = new ResizeObserver(() => {
|
|
session.refreshDeviceClass();
|
|
session.renderNow();
|
|
});
|
|
|
|
function synchronizeVisibility(): void {
|
|
if (document.visibilityState === "hidden") {
|
|
session.pause();
|
|
webDebug("snake-web-lifecycle", "visibility_hidden");
|
|
return;
|
|
}
|
|
session.resume();
|
|
session.renderNow();
|
|
webDebug("snake-web-lifecycle", "visibility_visible");
|
|
}
|
|
|
|
function pageHide(event: PageTransitionEvent): void {
|
|
if (event.persisted) {
|
|
session.pause();
|
|
} else {
|
|
session.dispose();
|
|
}
|
|
webInfo("snake-web-lifecycle", "page_hide", { persisted: event.persisted });
|
|
}
|
|
|
|
function pageShow(event: PageTransitionEvent): void {
|
|
session.resume();
|
|
session.renderNow();
|
|
webInfo("snake-web-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();
|
|
},
|
|
};
|
|
}
|