Skip to content

Commit ba5c56e

Browse files
authored
Feat: 개발 QA 1차(정민 | 삭제하기 모달 추가) (#121)
1 parent 9327b0a commit ba5c56e

File tree

2 files changed

+84
-13
lines changed

2 files changed

+84
-13
lines changed

apps/client/src/pages/myBookmark/MyBookmark.tsx

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Badge, Card } from '@pinback/design-system/ui';
1+
import { Badge, Card, PopupContainer } from '@pinback/design-system/ui';
22
import { useState } from 'react';
33
import {
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">

apps/client/src/pages/remind/Remind.tsx

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useState } from 'react';
2-
import { Badge, Card } from '@pinback/design-system/ui';
2+
import { Badge, Card, PopupContainer } from '@pinback/design-system/ui';
33
import CardEditModal from '@shared/components/cardEditModal/CardEditModal';
44
import OptionsMenuPortal from '@shared/components/sidebar/OptionsMenuPortal';
55
import { useAnchoredMenu } from '@shared/hooks/useAnchoredMenu';
@@ -20,6 +20,9 @@ import NoRemindArticles from './components/noRemindArticles/NoRemindArticles';
2020
const Remind = () => {
2121
const [isEditOpen, setIsEditOpen] = useState(false);
2222
const [activeBadge, setActiveBadge] = useState<'read' | 'notRead'>('notRead');
23+
const [isDeleteOpen, setIsDeleteOpen] = useState(false);
24+
const [deleteTargetId, setDeleteTargetId] = useState<number | null>(null);
25+
2326
const formattedDate = formatLocalDateTime();
2427

2528
const queryClient = useQueryClient();
@@ -50,6 +53,10 @@ const Remind = () => {
5053
deleteArticle(id, {
5154
onSuccess: () => {
5255
queryClient.invalidateQueries({ queryKey: ['remindArticles'] });
56+
queryClient.invalidateQueries({ queryKey: ['arcons'] });
57+
setIsDeleteOpen(false);
58+
setDeleteTargetId(null);
59+
closeMenu();
5360
close();
5461
},
5562
onError: (error) => {
@@ -143,11 +150,41 @@ const Remind = () => {
143150
closeMenu();
144151
}}
145152
onDelete={(articleId) => {
146-
handleDeleteArticle(articleId);
153+
setDeleteTargetId(articleId);
154+
setIsDeleteOpen(true);
155+
closeMenu();
147156
}}
148157
onClose={closeMenu}
149158
/>
150159

160+
{isDeleteOpen && (
161+
<div className="fixed inset-0" aria-modal="true" role="dialog">
162+
<div
163+
className="absolute inset-0"
164+
onClick={() => setIsDeleteOpen(false)}
165+
/>
166+
<div className="absolute inset-0 z-[100] flex items-center justify-center p-4">
167+
<PopupContainer
168+
isOpen
169+
type="subtext"
170+
title="정말 삭제하시겠어요?"
171+
subtext="저장된 내용이 모두 사라지게 돼요."
172+
left="취소"
173+
right="삭제"
174+
onLeftClick={() => setIsDeleteOpen(false)}
175+
onRightClick={() => {
176+
if (deleteTargetId != null) {
177+
handleDeleteArticle(deleteTargetId);
178+
} else {
179+
setIsDeleteOpen(false);
180+
}
181+
}}
182+
onClose={() => setIsDeleteOpen(false)}
183+
/>
184+
</div>
185+
</div>
186+
)}
187+
151188
{isEditOpen && (
152189
<div className="fixed inset-0 z-[1000]" aria-modal="true" role="dialog">
153190
<div

0 commit comments

Comments
 (0)