From ced62af6ea726da486c55a387b6429e5573ff295 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Tue, 7 Apr 2026 22:00:15 +0700 Subject: [PATCH] fix: use Phaser shutdown event for listener cleanup Phaser's game.destroy() calls shutdown() on scenes, not destroy(). The old destroy() override was never called, causing stale event listeners to persist and throw errors in React StrictMode. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/phaser/scenes/GameScene.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/phaser/scenes/GameScene.ts b/src/phaser/scenes/GameScene.ts index 09fd878..cd88471 100644 --- a/src/phaser/scenes/GameScene.ts +++ b/src/phaser/scenes/GameScene.ts @@ -41,6 +41,15 @@ export class GameScene extends Phaser.Scene { this.shuffleHandler = () => this.handleShuffle(); this.stateManager.on("hint", this.hintHandler); this.stateManager.on("shuffle", this.shuffleHandler); + + // Clean up listeners on scene shutdown (called by game.destroy) + this.events.on("shutdown", () => { + if (this.timerEvent) { + this.timerEvent.destroy(); + } + this.stateManager.off("hint", this.hintHandler); + this.stateManager.off("shuffle", this.shuffleHandler); + }); } private renderBoard(): void { @@ -313,9 +322,10 @@ export class GameScene extends Phaser.Scene { this.renderBoard(); } - destroy(): void { + shutdown(): void { if (this.timerEvent) { this.timerEvent.destroy(); + this.timerEvent = null; } if (this.stateManager) { this.stateManager.off("hint", this.hintHandler);