1- import { Badge , Card } from '@pinback/design-system/ui' ;
1+ import { Badge , Card , PopupContainer } from '@pinback/design-system/ui' ;
22import { useState } from 'react' ;
33import {
44 useGetBookmarkArticles ,
@@ -25,6 +25,9 @@ const MyBookmark = () => {
2525 const [ activeBadge , setActiveBadge ] = useState < 'all' | 'notRead' > ( 'all' ) ;
2626 const [ isEditOpen , setIsEditOpen ] = useState ( false ) ;
2727
28+ const [ isDeleteOpen , setIsDeleteOpen ] = useState ( false ) ;
29+ const [ deleteTargetId , setDeleteTargetId ] = useState < number | null > ( null ) ;
30+
2831 const [ searchParams ] = useSearchParams ( ) ;
2932 const queryClient = useQueryClient ( ) ;
3033 const category = searchParams . get ( 'category' ) ;
@@ -59,17 +62,16 @@ const MyBookmark = () => {
5962 const handleDeleteArticle = ( id : number ) => {
6063 deleteArticle ( id , {
6164 onSuccess : ( ) => {
62- queryClient . invalidateQueries ( {
63- queryKey : [ 'bookmarkReadArticles' ] ,
64- } ) ;
65- queryClient . invalidateQueries ( {
66- queryKey : [ 'bookmarkUnreadArticles' ] ,
67- } ) ;
65+ // TODO: 쿼리키 팩토리 패턴 적용
66+ queryClient . invalidateQueries ( { queryKey : [ 'bookmarkReadArticles' ] } ) ;
67+ queryClient . invalidateQueries ( { queryKey : [ 'bookmarkUnreadArticles' ] } ) ;
6868 queryClient . invalidateQueries ( {
6969 queryKey : [ 'categoryBookmarkArticles' ] ,
7070 } ) ;
71-
72- close ( ) ;
71+ queryClient . invalidateQueries ( { queryKey : [ 'arcons' ] } ) ;
72+ setIsDeleteOpen ( false ) ;
73+ setDeleteTargetId ( null ) ;
74+ closeMenu ( ) ;
7375 } ,
7476 onError : ( error ) => {
7577 console . error ( '아티클 삭제 실패:' , error ) ;
@@ -181,15 +183,47 @@ const MyBookmark = () => {
181183 closeMenu ( ) ;
182184 } }
183185 onDelete = { ( articleId ) => {
184- handleDeleteArticle ( articleId ) ;
186+ setDeleteTargetId ( articleId ) ;
187+ setIsDeleteOpen ( true ) ;
188+ closeMenu ( ) ;
185189 } }
186190 onClose = { closeMenu }
187191 />
188192
193+ { /* 삭제 확인 모달 */ }
194+ { isDeleteOpen && (
195+ < div className = "fixed inset-0" aria-modal = "true" role = "dialog" >
196+ < div
197+ className = "absolute inset-0"
198+ onClick = { ( ) => setIsDeleteOpen ( false ) }
199+ />
200+ < div className = "absolute inset-0 z-[100] flex items-center justify-center p-4" >
201+ < PopupContainer
202+ isOpen
203+ type = "subtext"
204+ title = "정말 삭제하시겠어요?"
205+ subtext = "저장된 내용이 모두 사라지게 돼요."
206+ left = "취소"
207+ right = "삭제"
208+ onLeftClick = { ( ) => setIsDeleteOpen ( false ) }
209+ onRightClick = { ( ) => {
210+ if ( deleteTargetId != null ) {
211+ handleDeleteArticle ( deleteTargetId ) ;
212+ } else {
213+ setIsDeleteOpen ( false ) ;
214+ }
215+ } }
216+ onClose = { ( ) => setIsDeleteOpen ( false ) }
217+ />
218+ </ div >
219+ </ div >
220+ ) }
221+
222+ { /* 편집 모달 */ }
189223 { isEditOpen && (
190224 < div className = "fixed inset-0 z-[1000]" aria-modal = "true" role = "dialog" >
191225 < div
192- className = "absolute inset-0 bg-black/60 backdrop-blur-[2px] "
226+ className = "absolute inset-0 bg-black/60"
193227 onClick = { ( ) => setIsEditOpen ( false ) }
194228 />
195229 < div className = "absolute inset-0 flex items-center justify-center p-4" >
0 commit comments