fix(client): reset shared socket state between games (#9) #34

Merged
Reliodas merged 1 commit from fix/9-reset-client-state into develop 2026-06-24 03:29:06 +00:00
Owner

Closes #9.

L'état Socket.IO est un singleton persistant : roomClosed restait vrai après une fermeture et Object.assign pouvait conserver des propriétés absentes du nouvel état, donc une nouvelle partie dans le même onglet pouvait afficher des données obsolètes.

Changements

  • resetState() construit à partir du facteur unique emptyState().
  • Le handler state remplace l'état (emptyState() + payload) au lieu de le fusionner → aucune propriété résiduelle ; il remet aussi à zéro error/roomClosed/sessionExpired.
  • room:closed et un resume échoué purgent les données obsolètes tout en gardant leur drapeau ; leave() réutilise resetState().

Tests

  • Remplacement complet (clé absente effacée), nettoyage sur room:closed, nouvelle partie propre après fermeture dans le même onglet, reset sur resume échoué.
  • useSocket.ts 96 % ; Vitest 53 ; typecheck + build OK.

Critères d'acceptation

  • État initial unique + fonction de réinitialisation
  • Réinitialiser erreurs, rôle, salle et données des manches au bon moment
  • Éviter les propriétés résiduelles lors du remplacement d'état
  • Tester fermeture → accueil → nouvelle partie

🤖 Generated with Claude Code

Closes #9. L'état Socket.IO est un singleton persistant : `roomClosed` restait vrai après une fermeture et `Object.assign` pouvait conserver des propriétés absentes du nouvel état, donc une nouvelle partie dans le même onglet pouvait afficher des données obsolètes. ## Changements - `resetState()` construit à partir du facteur unique `emptyState()`. - Le handler `state` **remplace** l'état (`emptyState()` + payload) au lieu de le fusionner → aucune propriété résiduelle ; il remet aussi à zéro `error`/`roomClosed`/`sessionExpired`. - `room:closed` et un `resume` échoué purgent les données obsolètes tout en gardant leur drapeau ; `leave()` réutilise `resetState()`. ## Tests - Remplacement complet (clé absente effacée), nettoyage sur `room:closed`, nouvelle partie propre après fermeture dans le même onglet, reset sur `resume` échoué. - `useSocket.ts` 96 % ; Vitest 53 ; typecheck + build OK. ## Critères d'acceptation - [x] État initial unique + fonction de réinitialisation - [x] Réinitialiser erreurs, rôle, salle et données des manches au bon moment - [x] Éviter les propriétés résiduelles lors du remplacement d'état - [x] Tester fermeture → accueil → nouvelle partie 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(client): reset shared socket state between games
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
b9552902cf
The shared socket state is a persistent singleton: room:closed left roomClosed
true and the state was merged with Object.assign, so a new game in the same tab
could show stale data (#9).

- Add resetState() built from the single emptyState() factory.
- The state handler now replaces the state (emptyState + payload) instead of
  merging, so a key absent from a new payload no longer keeps a stale value, and
  it clears the error/roomClosed/sessionExpired flags.
- room:closed and a failed resume now drop the stale game data while keeping
  their status flag; leave() reuses resetState().

Add tests for full replacement, room:closed cleanup, a fresh game after a close,
and reset on a failed resume. Update Implémentation.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 33e2744bfa into develop 2026-06-24 03:29:06 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/le-grand-concours#34
No description provided.