@@ -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