@@ -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 ) {
0 commit comments