Skip to content

Commit 918144e

Browse files
authored
Merge pull request #308 from MBTips/dev
Phase 2 Prod 배포 4차
2 parents 5e6336b + bc32b40 commit 918144e

File tree

1 file changed

+83
-64
lines changed

1 file changed

+83
-64
lines changed

src/pages/Chat.tsx

Lines changed: 83 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ 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);
6566
const wsCleanupRef = useRef<{
6667
messageCleanup?: () => void;
6768
connectionCleanup?: () => void;
@@ -74,74 +75,92 @@ const Chat = () => {
7475

7576
const isTopicChat = mode === "topicChat";
7677

77-
const handleWebSocketMessage = useCallback(
78-
(wsMessage: WebSocketMessage) => {
79-
if (wsMessage.type === "ERROR") {
80-
// 에러 메시지 처리
81-
const errorMessage: Message = {
82-
role: "assistant",
83-
content: wsMessage.message,
84-
messageType: "system"
85-
};
86-
87-
// 중복 시스템 메시지 방지
88-
setMessages((prev) => {
89-
const lastMessage = prev[prev.length - 1];
90-
if (
91-
lastMessage?.messageType === "system" &&
92-
lastMessage.content === wsMessage.message
93-
) {
94-
return prev;
95-
}
96-
return [...prev, errorMessage];
97-
});
98-
} else if (wsMessage.type === "NOTICE") {
99-
// 시스템 알림 메시지 처리 (입장/퇴장)
100-
const systemMessage: Message = {
101-
role: "assistant",
102-
content: wsMessage.message,
103-
messageType: "system"
104-
};
78+
// nickname이 변경되면 ref 업데이트
79+
useEffect(() => {
80+
nicknameRef.current = nickname;
81+
}, [nickname]);
82+
83+
const handleWebSocketMessage = useCallback((wsMessage: WebSocketMessage) => {
84+
console.log("WebSocket 메시지 수신 처리:", wsMessage);
85+
86+
if (wsMessage.type === "ERROR") {
87+
// 에러 메시지 처리
88+
const errorMessage: Message = {
89+
role: "assistant",
90+
content: wsMessage.message,
91+
messageType: "system"
92+
};
10593

106-
// 중복 시스템 메시지 방지
107-
setMessages((prev) => {
108-
const lastMessage = prev[prev.length - 1];
109-
if (
110-
lastMessage?.messageType === "system" &&
111-
lastMessage.content === wsMessage.message
112-
) {
113-
return prev;
114-
}
115-
return [...prev, systemMessage];
116-
});
117-
} else if (
118-
wsMessage.type === null &&
119-
wsMessage.nickname &&
120-
wsMessage.message
121-
) {
122-
// 자신이 보낸 메시지는 이미 화면에 추가했으므로 무시
123-
if (wsMessage.nickname === nickname) {
124-
return;
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;
125102
}
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+
};
126112

127-
// 다른 사용자의 메시지만 화면에 추가
128-
console.log(
129-
"다른 사용자 메시지 추가:",
130-
wsMessage.nickname,
131-
wsMessage.message
132-
);
133-
const newMessage: Message = {
134-
role: "assistant",
135-
content: wsMessage.message,
136-
nickname: wsMessage.nickname,
137-
mbti: wsMessage.mbti || undefined,
138-
messageType: "text"
139-
};
140-
setMessages((prev) => [...prev, newMessage]);
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;
121+
}
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;
141141
}
142-
},
143-
[nickname]
144-
);
142+
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를 사용하므로
145164

146165
useEffect(() => {
147166
if (!isTopicChat) {

0 commit comments

Comments
 (0)