Skip to content

Commit 2797719

Browse files
authored
Merge pull request #309 from Soohyuniii/bugfix--open-chat-message-type
Bugfix : open chat message type
2 parents bc32b40 + d33b09b commit 2797719

File tree

2 files changed

+71
-81
lines changed

2 files changed

+71
-81
lines changed

src/pages/Chat.tsx

Lines changed: 70 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ const Chat = () => {
6262
const [isOpen, setIsOpen] = useState(false);
6363
const [isConnected, setIsConnected] = useState(false);
6464
const bottomRef = useRef<HTMLDivElement>(null);
65-
const nicknameRef = useRef<string>(nickname);
6665
const wsCleanupRef = useRef<{
6766
messageCleanup?: () => void;
6867
connectionCleanup?: () => void;
@@ -75,92 +74,83 @@ const Chat = () => {
7574

7675
const isTopicChat = mode === "topicChat";
7776

78-
// nickname이 변경되면 ref 업데이트
79-
useEffect(() => {
80-
nicknameRef.current = nickname;
81-
}, [nickname]);
82-
83-
const handleWebSocketMessage = useCallback((wsMessage: WebSocketMessage) => {
84-
console.log("WebSocket 메시지 수신 처리:", wsMessage);
77+
const handleWebSocketMessage = useCallback(
78+
(wsMessage: WebSocketMessage) => {
79+
console.log("📨 WebSocket 메시지 수신 처리:", wsMessage);
8580

86-
if (wsMessage.type === "ERROR") {
8781
// 에러 메시지 처리
88-
const errorMessage: Message = {
89-
role: "assistant",
90-
content: wsMessage.message,
91-
messageType: "system"
92-
};
82+
if (wsMessage.type === "ERROR") {
83+
const errorMessage: Message = {
84+
role: "assistant",
85+
content: wsMessage.message,
86+
messageType: "system"
87+
};
88+
setMessages((prev) => {
89+
const last = prev[prev.length - 1];
90+
if (
91+
last?.messageType === "system" &&
92+
last.content === wsMessage.message
93+
) {
94+
return prev;
95+
}
96+
return [...prev, errorMessage];
97+
});
98+
}
9399

94-
// 중복 시스템 메시지 방지
95-
setMessages((prev) => {
96-
const lastMessage = prev[prev.length - 1];
97-
if (
98-
lastMessage?.messageType === "system" &&
99-
lastMessage.content === wsMessage.message
100-
) {
101-
return prev;
102-
}
103-
return [...prev, errorMessage];
104-
});
105-
} else if (wsMessage.type === "NOTICE") {
106-
// 시스템 알림 메시지 처리 (입장/퇴장)
107-
const systemMessage: Message = {
108-
role: "assistant",
109-
content: wsMessage.message,
110-
messageType: "system"
111-
};
100+
// 입장/퇴장 알림 (NOTICE)
101+
else if (wsMessage.type === "NOTICE" && wsMessage.message) {
102+
const noticeMessage: Message = {
103+
role: "assistant",
104+
content: wsMessage.message,
105+
messageType: "system"
106+
};
107+
setMessages((prev) => {
108+
const last = prev[prev.length - 1];
109+
if (
110+
last?.messageType === "system" &&
111+
last.content === wsMessage.message
112+
) {
113+
return prev;
114+
}
115+
return [...prev, noticeMessage];
116+
});
117+
}
112118

113-
// 중복 시스템 메시지 방지
114-
setMessages((prev) => {
115-
const lastMessage = prev[prev.length - 1];
116-
if (
117-
lastMessage?.messageType === "system" &&
118-
lastMessage.content === wsMessage.message
119-
) {
120-
return prev;
119+
// 일반 채팅 메시지 (MESSAGE)
120+
else if (
121+
wsMessage.type === "MESSAGE" &&
122+
wsMessage.nickname &&
123+
wsMessage.message
124+
) {
125+
// 자신이 보낸 메시지는 이미 화면에 추가했으므로 무시
126+
if (wsMessage.nickname === nickname) {
127+
return;
121128
}
122-
return [...prev, systemMessage];
123-
});
124-
} else if (
125-
wsMessage.type === null &&
126-
wsMessage.nickname &&
127-
wsMessage.message
128-
) {
129-
// ref를 사용해서 최신 nickname 참조
130-
const currentNickname = nicknameRef.current;
131-
console.log("메시지 비교:", {
132-
received: wsMessage.nickname,
133-
current: currentNickname,
134-
isOwn: wsMessage.nickname === currentNickname
135-
});
136-
137-
// 자신이 보낸 메시지는 이미 화면에 추가했으므로 무시
138-
if (wsMessage.nickname === currentNickname) {
139-
console.log("자신의 메시지 스킵");
140-
return;
129+
130+
console.log(
131+
"💬 다른 사용자 메시지 추가:",
132+
wsMessage.nickname,
133+
wsMessage.message
134+
);
135+
136+
const newMessage: Message = {
137+
role: "assistant",
138+
content: wsMessage.message,
139+
nickname: wsMessage.nickname,
140+
mbti: wsMessage.mbti || undefined,
141+
messageType: "text"
142+
};
143+
144+
setMessages((prev) => [...prev, newMessage]);
141145
}
142146

143-
// 다른 사용자의 메시지만 화면에 추가
144-
console.log(
145-
"다른 사용자 메시지 추가:",
146-
wsMessage.nickname,
147-
wsMessage.message
148-
);
149-
const newMessage: Message = {
150-
role: "assistant",
151-
content: wsMessage.message,
152-
nickname: wsMessage.nickname,
153-
mbti: wsMessage.mbti || undefined,
154-
messageType: "text"
155-
};
156-
setMessages((prev) => {
157-
console.log("메시지 추가 전:", prev.length);
158-
const newMessages = [...prev, newMessage];
159-
console.log("메시지 추가 후:", newMessages.length);
160-
return newMessages;
161-
});
162-
}
163-
}, []); // dependency 없음 - ref를 사용하므로
147+
// 예상치 못한 메시지 형식 로그
148+
else {
149+
console.warn("알 수 없는 WebSocket 메시지:", wsMessage);
150+
}
151+
},
152+
[nickname]
153+
);
164154

165155
useEffect(() => {
166156
if (!isTopicChat) {

src/types/openChat.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export interface WebSocketRequestMessage {
3636

3737
// 웹소켓 응답 메시지 형태
3838
export interface WebSocketMessage {
39-
type: "ERROR" | "NOTICE" | null;
39+
type: "ERROR" | "NOTICE" | "MESSAGE" | null;
4040
mbti: string | null;
4141
nickname: string | null;
4242
message: string;

0 commit comments

Comments
 (0)