From ec58fcb30191a8c2339ddcd14b94e0a08d5be07b 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) --- superpowers/src/phaser/scenes/GameScene.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/superpowers/src/phaser/scenes/GameScene.ts b/superpowers/src/phaser/scenes/GameScene.ts index 09fd878..cd88471 100644 --- a/superpowers/src/phaser/scenes/GameScene.ts +++ b/superpowers/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);