diff --git a/apps/client/src/hooks/useAppFlow.ts b/apps/client/src/hooks/useAppFlow.ts index 2bcc332..ed9d840 100644 --- a/apps/client/src/hooks/useAppFlow.ts +++ b/apps/client/src/hooks/useAppFlow.ts @@ -30,6 +30,10 @@ }; const requestJoin = (payload: roomTypes.JoinRoomPayload) => { + if (isJoining) { + return; + } + clearJoinTimeout(); setJoinErrorMessage(null); setIsJoining(true); diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index 7d7fbbf..dcb5b46 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -44,32 +44,37 @@ }); // 参加拒否時は理由を通知する - if (joinResult.status === "full") { - socket.leave(roomId); - roomPublisher.publishJoinRejected({ - roomId, - reason: "full", - }); - logEvent("Network", { - event: "JOIN_ROOM", - result: "rejected_room_full", - roomId, - socketId: socket.id, - }); - return; - } + switch (joinResult.status) { + case "full": + socket.leave(roomId); + roomPublisher.publishJoinRejected({ + roomId, + reason: "full", + }); + logEvent("Network", { + event: "JOIN_ROOM", + result: "rejected_room_full", + roomId, + socketId: socket.id, + }); + return; - if (joinResult.status === "duplicate") { - roomPublisher.publishJoinRejected({ - roomId, - reason: "duplicate", - }); - logEvent("Network", { - event: "JOIN_ROOM", - result: "rejected_duplicate", - roomId, - socketId: socket.id, - }); + case "duplicate": + roomPublisher.publishJoinRejected({ + roomId, + reason: "duplicate", + }); + logEvent("Network", { + event: "JOIN_ROOM", + result: "rejected_duplicate", + roomId, + socketId: socket.id, + }); + return; + + case "joined": + default: + return; } }); };