Resume: exiting a match keeps it alive instead of destroying it
CI/CD / CI - API (dotnet build + engine sim) (push) Failing after 1m40s
CI/CD / CI - Web (tsc + next build) (push) Failing after 1m19s
CI/CD / Deploy - local stack (db + server + web) (push) Has been skipped

Leaving the table (back button, browser/hardware back) no longer resets the
game — it minimizes it and stays resumable:
- game-store: add `paused` + minimize()/resume(). Single-player (AI) matches
  pause their local timers so nothing happens while away; live (server-run)
  matches keep streaming via the still-active subscription (the .NET GameRoom
  already runs the match to completion and re-broadcasts state on reconnect).
- GameScreen: an unmount effect minimizes any in-progress match no matter how
  you leave; only a finished match (reward dismissed) tears down.
- ResumeGameBar: floating "return to game" pill shown from any screen while a
  match is alive, or while a finished match still has an unseen reward.
- page.tsx: after a full reload, re-enter live mode (minimized) when the server
  re-broadcasts state, and notify when a match you left finishes while away.

Verified: tsc + next build clean; web image rebuilt and serving on :1500.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-04 20:58:05 +03:30
parent a1c2cc0889
commit d66208e39e
5 changed files with 144 additions and 2 deletions
+10
View File
@@ -29,6 +29,11 @@ const fa: Dict = {
"home.lang": "English",
"home.onlineCount": "{n} نفر آنلاین",
"resume.title": "بازی در جریان",
"resume.cta": "بازگشت به بازی",
"resume.matchEnded": "بازی به پایان رسید",
"resume.matchEndedBody": "نتیجه و جایزه را ببینید",
"seat.you": "شما",
"team.us": "ما",
"team.them": "حریف",
@@ -270,6 +275,11 @@ const en: Dict = {
"home.lang": "فارسی",
"home.onlineCount": "{n} players online",
"resume.title": "Game in progress",
"resume.cta": "Return to game",
"resume.matchEnded": "Match ended",
"resume.matchEndedBody": "See the result and reward",
"seat.you": "You",
"team.us": "Us",
"team.them": "Them",