share WebSocket send via Zustand store, prevent duplicate connections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 11:52:05 +01:00
parent 998ac07867
commit 7e1007ebf8
2 changed files with 15 additions and 3 deletions

View File

@@ -30,6 +30,7 @@ export function useWebSocket(roomCode: string) {
reset,
setGameState,
lockPredictions,
setSend,
} = useRoomStore()
const send = useCallback((message: ClientMessage) => {
@@ -38,6 +39,10 @@ export function useWebSocket(roomCode: string) {
}
}, [])
useEffect(() => {
setSend(send)
}, [send, setSend])
useEffect(() => {
const stored = getStoredSession()
const sessionId = stored?.roomCode === roomCode ? stored.sessionId : null
@@ -110,7 +115,7 @@ export function useWebSocket(roomCode: string) {
ws.close()
reset()
}
}, [roomCode, setRoom, setMySessionId, setConnectionStatus, updatePlayerConnected, addPlayer, setAct, reset, setGameState, lockPredictions])
}, [roomCode, setRoom, setMySessionId, setConnectionStatus, updatePlayerConnected, addPlayer, setAct, reset, setGameState, lockPredictions, setSend])
return { send }
}

View File

@@ -1,11 +1,12 @@
import { create } from "zustand"
import type { RoomState, Player, GameState } from "@celebrate-esc/shared"
import type { RoomState, Player, GameState, ClientMessage } from "@celebrate-esc/shared"
interface RoomStore {
room: RoomState | null
mySessionId: string | null
connectionStatus: "disconnected" | "connecting" | "connected"
gameState: GameState | null
send: (message: ClientMessage) => void
setRoom: (room: RoomState) => void
setMySessionId: (sessionId: string) => void
@@ -15,14 +16,18 @@ interface RoomStore {
setAct: (act: RoomState["currentAct"]) => void
setGameState: (gameState: GameState) => void
lockPredictions: () => void
setSend: (send: (message: ClientMessage) => void) => void
reset: () => void
}
const noop = () => {}
export const useRoomStore = create<RoomStore>((set) => ({
room: null,
mySessionId: null,
connectionStatus: "disconnected",
gameState: null,
send: noop,
setRoom: (room) => set({ room }),
setMySessionId: (sessionId) => set({ mySessionId: sessionId }),
@@ -67,5 +72,7 @@ export const useRoomStore = create<RoomStore>((set) => ({
}
}),
reset: () => set({ room: null, mySessionId: null, connectionStatus: "disconnected", gameState: null }),
setSend: (send) => set({ send }),
reset: () => set({ room: null, mySessionId: null, connectionStatus: "disconnected", gameState: null, send: noop }),
}))