diff --git a/backend/controller/gameController.ts b/backend/controller/gameController.ts index 8e073e3..d4d2184 100644 --- a/backend/controller/gameController.ts +++ b/backend/controller/gameController.ts @@ -18,13 +18,16 @@ import { pickRandom } from "../../shared/utils"; import { addGems } from "../repositories/gemsRepository"; import { getCollection } from "../repositories/collectionRepository"; +const safeGameState = (gameState: ServerGame) => { + return gameState.finished ? gameState : serverToClientGame(gameState); +}; + export const gameController = createController({ getGameState: createEndpoint(z.string(), async (uuid, ctx) => { const game = await getGame(ctx.db, uuid); const parsed = parseGameState(game.gameState); const gameState = await serverGame.parseAsync(parsed); - if (game.finished) return gameState; - return serverToClientGame(gameState); + return safeGameState(gameState); }), createGame: createEndpoint(z.null(), async (_, { user, db }) => { if (!user) throw new UnauthorizedError("Unauthorized"); @@ -63,6 +66,7 @@ export const gameController = createController({ emit({ type: "updateGame", game: dbGame.uuid, + gameState: safeGameState(serverGame), }); if (ts === 0 && serverGame.finished !== 0) { emit({ @@ -96,6 +100,7 @@ export const gameController = createController({ emit({ type: "updateGame", game: dbGame.uuid, + gameState: safeGameState(serverGame), }); if (ts === 0 && serverGame.finished !== 0) { emit({ @@ -128,6 +133,7 @@ export const gameController = createController({ emit({ type: "updateGame", game: dbGame.uuid, + gameState: safeGameState(serverGame), }); }, ), @@ -143,6 +149,7 @@ export const gameController = createController({ emit({ type: "updateGame", game: dbGame.uuid, + gameState: safeGameState(serverGame), }); if (ts === 0 && serverGame.finished !== 0) { emit({ diff --git a/shared/events.ts b/shared/events.ts index 68361ad..83d0dfa 100644 --- a/shared/events.ts +++ b/shared/events.ts @@ -1,4 +1,5 @@ import type { Rarity } from "../shared/lootboxes"; +import { ClientGame, ServerGame } from "./gameType"; export type EventType = "new" | "finished" | "updateGame" | "updateStage"; export type Events = @@ -15,6 +16,7 @@ export type Events = | { type: "updateGame"; game: string; + gameState: ServerGame | ClientGame; } | { type: "updateStage"; diff --git a/src/wsClient.ts b/src/wsClient.ts index 7678e02..7d7c21b 100644 --- a/src/wsClient.ts +++ b/src/wsClient.ts @@ -64,9 +64,10 @@ const createWSClient = () => { addMessageListener((event: MessageEvent) => { const data = JSON.parse(event.data) as Events; if (data.type === "updateGame") { - queryClient.refetchQueries({ - queryKey: ["game.getGameState", data.game], - }); + queryClient.setQueryData( + ["game.getGameState", data.game], + data.gameState, + ); } if (data.type === "loss") { queryClient.invalidateQueries({