@@ -27,6 +27,9 @@ import Block from '../../../assets/default/block.svg';
2727import dayjs from 'dayjs' ;
2828import 'dayjs/locale/ko' ;
2929import { chatRoomMessagesData } from '../../../apis/chatting/dto' ;
30+ import { postUserBlockApi } from '../../../apis/user' ;
31+ import { PostUserBlockRequest } from '../../../apis/user/dto' ;
32+ import { handleError } from '../../../apis/util/handleError' ;
3033
3134const ChatRoom : React . FC = ( ) => {
3235 const [ extendedMessages , setextendedMessages ] = useState < ExtendedMessageDto [ ] > ( [ ] ) ;
@@ -36,6 +39,7 @@ const ChatRoom: React.FC = () => {
3639 const [ isLeaveModalOpen , setIsLeaveModalOpen ] = useState ( false ) ;
3740 const [ isBlockModalOpen , setIsBlockModalOpen ] = useState ( false ) ;
3841 const [ isStatusModalOpen , setIsStatusModalOpen ] = useState ( false ) ;
42+ const [ modalContent , setModalContent ] = useState ( '' ) ;
3943
4044 const [ isLoading , setIsLoading ] = useState ( true ) ;
4145 const [ isScroll , setIsScroll ] = useState ( false ) ;
@@ -50,6 +54,53 @@ const ChatRoom: React.FC = () => {
5054 const nav = useNavigate ( ) ;
5155 const socket = useSocket ( ) ;
5256
57+ // 프로필 사진 클릭 시 프로필 페이지로 이동
58+ const handleUserClick = useCallback ( ( ) => {
59+ const opponentId = opponentInfo ?. id ? opponentInfo . id : - 1 ;
60+ if ( opponentId === - 1 ) {
61+ setModalContent ( '유저 정보를 찾을 수 없습니다.' ) ;
62+ setIsStatusModalOpen ( true ) ;
63+ } else {
64+ nav ( `/users/${ opponentId } ` ) ;
65+ }
66+ } , [ opponentInfo , nav ] ) ;
67+
68+ // 유저 차단 api
69+ const postUserBlock = async ( ) => {
70+ try {
71+ const data : PostUserBlockRequest = {
72+ fromUserId : userId ,
73+ toUserId : opponentInfo ?. id || - 1 ,
74+ action : 'block' ,
75+ } ;
76+ const response = await postUserBlockApi ( data ) ;
77+
78+ if ( response . isSuccess ) {
79+ setModalContent ( '정상적으로 처리되었습니다.' ) ;
80+ nav ( '/chats' ) ;
81+ }
82+ } catch ( error ) {
83+ const errorMessage = handleError ( error , 'user' ) ;
84+ setModalContent ( errorMessage ) ;
85+ } finally {
86+ setIsBlockModalOpen ( false ) ;
87+ setIsStatusModalOpen ( true ) ;
88+ }
89+ } ;
90+
91+ // 채팅방 나가기 api
92+ const leaveChatRoom = ( ) => {
93+ if ( socket ) {
94+ const data = {
95+ chatRoomId : Number ( chatRoomId ) ,
96+ userId : userId ,
97+ } ;
98+ socket . emit ( 'leaveChatRoom' , data ) ;
99+ nav ( '/chats' , { replace : true } ) ;
100+ }
101+ } ;
102+
103+ // 전체 메시지 조회
53104 const getChatRoomMessages = ( data : chatRoomMessagesData [ ] ) => {
54105 setAllMessages ( data ) ;
55106 if ( data . length > messageLengthRef . current ) {
@@ -58,6 +109,7 @@ const ChatRoom: React.FC = () => {
58109 setIsLoading ( false ) ;
59110 } ;
60111
112+ // 새 메시지 수신
61113 const getNewMessage = ( data : chatRoomMessagesData ) => {
62114 setAllMessages ( ( prevMessages ) => [ ...prevMessages , data ] ) ;
63115 setIsScroll ( ( prev ) => ! prev ) ;
@@ -66,10 +118,10 @@ const ChatRoom: React.FC = () => {
66118 useEffect ( ( ) => {
67119 if ( socket ) {
68120 // 채팅방 입장
69- socket . emit ( 'joinChatRoom' , chatRoomId ) ;
121+ socket . emit ( 'joinChatRoom' , { chatRoomId : Number ( chatRoomId ) } ) ;
70122
71123 // 전체 메시지 조회
72- socket . emit ( 'getChatRoomMessages' , chatRoomId ) ;
124+ socket . emit ( 'getChatRoomMessages' , { chatRoomId : Number ( chatRoomId ) } ) ;
73125 socket . on ( 'chatRoomMessages' , getChatRoomMessages ) ;
74126
75127 // 최근 메시지 조회
@@ -140,7 +192,7 @@ const ChatRoom: React.FC = () => {
140192 isCloseButtonVisible : true ,
141193 button : {
142194 content : '나가기' ,
143- onClick : ( ) => { } ,
195+ onClick : leaveChatRoom ,
144196 } ,
145197 onClose : ( ) => {
146198 setIsLeaveModalOpen ( false ) ;
@@ -152,15 +204,15 @@ const ChatRoom: React.FC = () => {
152204 isCloseButtonVisible : true ,
153205 button : {
154206 content : '차단하기' ,
155- onClick : ( ) => { } ,
207+ onClick : postUserBlock ,
156208 } ,
157209 onClose : ( ) => {
158210 setIsBlockModalOpen ( false ) ;
159211 } ,
160212 } ;
161213
162214 const statusModalProps : ModalProps = {
163- content : '사용자 정보가 없습니다' ,
215+ content : modalContent ,
164216 onClose : ( ) => {
165217 setIsStatusModalOpen ( false ) ;
166218 } ,
@@ -176,16 +228,6 @@ const ChatRoom: React.FC = () => {
176228 } ,
177229 } ;
178230
179- // 프로필 사진 클릭 시 프로필 페이지로 이동
180- const onClickProfile = useCallback ( ( ) => {
181- const opponentId = opponentInfo ?. id ? opponentInfo . id : - 1 ;
182- if ( opponentId === - 1 ) {
183- setIsStatusModalOpen ( true ) ;
184- } else {
185- nav ( `/users/${ opponentId } ` ) ;
186- }
187- } , [ opponentInfo , nav ] ) ;
188-
189231 return (
190232 < OODDFrame >
191233 { isLoading && < Loading /> }
@@ -215,7 +257,7 @@ const ChatRoom: React.FC = () => {
215257 { message . sentMessage ? (
216258 < SentMessage { ...message . sentMessage } />
217259 ) : message . rcvdMessage ? (
218- < RcvdMessage { ...message . rcvdMessage } onClickProfile = { onClickProfile } />
260+ < RcvdMessage { ...message . rcvdMessage } onClickProfile = { handleUserClick } />
219261 ) : null }
220262 </ div >
221263 ) ;
0 commit comments