fix(web): prevent stopGame from being called on non-game page transitions

Only stop the game when navigating away from the game page (/) to avoid
WASM runtime errors when navigating between /leaderboard and /download.
Add error handling to gracefully handle crashes during page transitions.
This commit is contained in:
2025-12-29 14:53:42 -06:00
parent 21078b7ada
commit e017a87e12
2 changed files with 31 additions and 21 deletions
+5 -2
View File
@@ -23,7 +23,11 @@ function restartGame() {
const win = getPacmanWindow(); const win = getPacmanWindow();
const module = win.Module; const module = win.Module;
if (module?._restart_game) { if (!module?._restart_game) {
console.warn("Game restart function not available (WASM may not be initialized)");
return;
}
const canvas = document.getElementById("canvas") as HTMLCanvasElement | null; const canvas = document.getElementById("canvas") as HTMLCanvasElement | null;
if (!canvas) { if (!canvas) {
console.error("Canvas element not found during game restart"); console.error("Canvas element not found during game restart");
@@ -42,4 +46,3 @@ function restartGame() {
console.error("Failed to restart game:", error); console.error("Failed to restart game:", error);
} }
} }
}
+8 -1
View File
@@ -10,11 +10,18 @@ export const onPageTransitionStart: OnPageTransitionStartAsync = async (pageCont
setPendingNavigation(pageContext.urlPathname); setPendingNavigation(pageContext.urlPathname);
document.querySelector("body")?.classList.add("page-is-transitioning"); document.querySelector("body")?.classList.add("page-is-transitioning");
// Stop the game loop when navigating away from the game page // Only stop the game when navigating AWAY FROM the game page
// Don't stop when navigating between other pages (e.g., /leaderboard <-> /download)
if (window.location.pathname === "/") {
const win = getPacmanWindow(); const win = getPacmanWindow();
if (win.Module?._stop_game) { if (win.Module?._stop_game) {
try {
console.log("Stopping game loop for page transition"); console.log("Stopping game loop for page transition");
win.Module._stop_game(); win.Module._stop_game();
} catch (error) {
console.warn("Failed to stop game (game may have already crashed):", error);
}
}
} }
// Wait for fade-out animation to complete before page content changes // Wait for fade-out animation to complete before page content changes