diff --git a/apps/client/src/hooks/useAppFlow.ts b/apps/client/src/hooks/useAppFlow.ts index a891fc9..b68228b 100644 --- a/apps/client/src/hooks/useAppFlow.ts +++ b/apps/client/src/hooks/useAppFlow.ts @@ -15,12 +15,26 @@ const [myId, setMyId] = useState(null); useEffect(() => { - socketManager.common.onConnect((id) => setMyId(id)); - socketManager.lobby.onRoomUpdate((updatedRoom) => { + const handleConnect = (id: string) => { + setMyId(id); + }; + const handleRoomUpdate = (updatedRoom: roomTypes.Room) => { setRoom(updatedRoom); setScenePhase(appConsts.ScenePhase.LOBBY); - }); - socketManager.game.onGameStart(() => setScenePhase(appConsts.ScenePhase.PLAYING)); + }; + const handleGameStart = () => { + setScenePhase(appConsts.ScenePhase.PLAYING); + }; + + socketManager.common.onConnect(handleConnect); + socketManager.lobby.onRoomUpdate(handleRoomUpdate); + socketManager.game.onGameStart(handleGameStart); + + return () => { + socketManager.common.offConnect(handleConnect); + socketManager.lobby.offRoomUpdate(handleRoomUpdate); + socketManager.game.offGameStart(handleGameStart); + }; }, []); return { scenePhase, room, myId }; diff --git a/apps/client/src/network/handlers/CommonHandler.ts b/apps/client/src/network/handlers/CommonHandler.ts index d76fe24..0c6d10b 100644 --- a/apps/client/src/network/handlers/CommonHandler.ts +++ b/apps/client/src/network/handlers/CommonHandler.ts @@ -3,18 +3,31 @@ type CommonHandler = { onConnect: (callback: (id: string) => void) => void; + offConnect: (callback: (id: string) => void) => void; }; export const createCommonHandler = (socket: Socket): CommonHandler => { + const connectListenerMap = new Map<(id: string) => void, () => void>(); + return { onConnect: (callback: (id: string) => void) => { if (socket.connected) { callback(socket.id || ""); } - socket.on(protocol.SocketEvents.CONNECT, () => { + const listener = () => { callback(socket.id || ""); - }); + }; + + connectListenerMap.set(callback, listener); + socket.on(protocol.SocketEvents.CONNECT, listener); + }, + offConnect: (callback: (id: string) => void) => { + const listener = connectListenerMap.get(callback); + if (!listener) return; + + socket.off(protocol.SocketEvents.CONNECT, listener); + connectListenerMap.delete(callback); } }; }; diff --git a/apps/client/src/network/handlers/LobbyHandler.ts b/apps/client/src/network/handlers/LobbyHandler.ts index 863ab5b..b315f6c 100644 --- a/apps/client/src/network/handlers/LobbyHandler.ts +++ b/apps/client/src/network/handlers/LobbyHandler.ts @@ -4,6 +4,7 @@ type LobbyHandler = { onRoomUpdate: (callback: (room: roomTypes.Room) => void) => void; + offRoomUpdate: (callback: (room: roomTypes.Room) => void) => void; startGame: () => void; }; @@ -12,6 +13,9 @@ onRoomUpdate: (callback: (room: roomTypes.Room) => void) => { socket.on(protocol.SocketEvents.ROOM_UPDATE, callback); }, + offRoomUpdate: (callback: (room: roomTypes.Room) => void) => { + socket.off(protocol.SocketEvents.ROOM_UPDATE, callback); + }, startGame: () => { socket.emit(protocol.SocketEvents.START_GAME); }