1- import { useParams } from 'react-router' ;
1+ import { useParams , useNavigate } from 'react-router' ;
22import { useEffect , useState , useRef } from 'react' ;
33import getRecipient from '../../api/getRecipient' ;
44import getMessages from '../../api/getMessages' ;
5+ import deleteMessage from '../../api/deleteMessage.js' ;
6+ import deleteRecipient from '../../api/deleteRecipient.js' ;
57import HeaderService from '../../components/recipient/HeaderService/HeaderService' ;
68import Card from '../../components/Card/Card' ;
9+ import Button from '../../components/common/Button' ;
10+ import Modal from '../../components/Modal/Modal.jsx' ;
711import styles from './Recipient.module.scss' ;
812
913export default function Recipient ( ) {
@@ -13,7 +17,9 @@ export default function Recipient() {
1317 const [ offset , setOffset ] = useState ( 0 ) ;
1418 const [ loading , setLoading ] = useState ( false ) ;
1519 const [ hasNextMessage , setHasNextMessage ] = useState ( false ) ;
20+ const [ selectedCardId , setSelectedCardId ] = useState ( null ) ;
1621 const observerRef = useRef ( ) ;
22+ const navigate = useNavigate ( ) ;
1723
1824 useEffect ( ( ) => {
1925 const fetchRecipient = async ( ) => {
@@ -71,6 +77,42 @@ export default function Recipient() {
7177 setOffset ( ( prev ) => prev + limit ) ;
7278 } ;
7379
80+ async function handleDeleteMessage ( id ) {
81+ try {
82+ await deleteMessage ( id ) ;
83+ setMessages ( ( prevMessages ) =>
84+ prevMessages . filter ( ( msg ) => msg . id !== id ) ,
85+ ) ;
86+ } catch ( error ) {
87+ console . error ( '삭제 실패:' , error ) ;
88+ }
89+ }
90+
91+ async function handleDeleteRecipient ( id ) {
92+ try {
93+ const firstConfirm = confirm ( '정말 이 페이지를 삭제하시겠어요?' ) ;
94+ if ( ! firstConfirm ) return ;
95+ const secondConfirm = confirm (
96+ '정말 정말 삭제하시겠어요? 되돌릴 수 없어요!' ,
97+ ) ;
98+ if ( ! secondConfirm ) return ;
99+ await deleteRecipient ( id ) ;
100+ navigate ( '/' ) ;
101+ } catch ( error ) {
102+ console . error ( '삭제 실패:' , error ) ;
103+ }
104+ }
105+
106+ function handleOpenModal ( id ) {
107+ setSelectedCardId ( id ) ;
108+ }
109+
110+ function handleCloseModal ( ) {
111+ setSelectedCardId ( null ) ;
112+ }
113+
114+ const selectedCard = messages . find ( ( card ) => card . id === selectedCardId ) ;
115+
74116 if ( ! postData || messages . length < 0 ) return < div > Loading...</ div > ;
75117
76118 return (
@@ -84,20 +126,47 @@ export default function Recipient() {
84126 : { }
85127 }
86128 >
129+ < div className = { styles [ 'button-container' ] } >
130+ < Button
131+ className = { styles [ 'delete-button' ] }
132+ type = "delete"
133+ onClick = { ( ) => handleDeleteRecipient ( id ) }
134+ >
135+ 삭제하기
136+ </ Button >
137+ </ div >
87138 < div className = { styles [ 'card-container' ] } >
88139 < Card recipientId = { id } empty = { true } />
89140 { messages . map ( ( msg ) => (
90141 < Card
91142 key = { msg . id }
143+ id = { msg . id }
92144 image = { msg . profileImageURL }
93145 sender = { msg . sender }
94146 relationship = { msg . relationship }
95147 createdAt = { msg . createdAt . slice ( 0 , 10 ) . split ( '-' ) . join ( '.' ) }
148+ onDelete = { handleDeleteMessage }
149+ onClick = { ( ) => handleOpenModal ( msg . id ) }
96150 font = { msg . font }
97151 >
98152 { msg . content }
99153 </ Card >
100154 ) ) }
155+ { selectedCardId && (
156+ < Modal
157+ key = { selectedCard . id }
158+ image = { selectedCard . profileImageURL }
159+ sender = { selectedCard . sender }
160+ relationship = { selectedCard . relationship }
161+ createdAt = { selectedCard . createdAt
162+ . slice ( 0 , 10 )
163+ . split ( '-' )
164+ . join ( '.' ) }
165+ onClose = { handleCloseModal }
166+ >
167+ { selectedCard . content }
168+ </ Modal >
169+ ) }
101170 </ div >
102171 { hasNextMessage && < div ref = { observerRef } className = "load" > </ div > }
103172 </ div >
0 commit comments