Skip to content

Commit c37bf61

Browse files
committed
feat: 티켓 취소 API 연동
1 parent 70648f1 commit c37bf61

File tree

2 files changed

+51
-33
lines changed

2 files changed

+51
-33
lines changed

src/features/ticket/hooks/useOrderHook.ts

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,40 @@ import { OrderTicketRequest } from '../model/orderInformation';
44

55
// 주문 전체 조회
66
export const useTicketOrders = (page: number = 0, size: number = 10) => {
7-
return useQuery({
8-
queryKey: ['ticketOrders', page, size],
9-
queryFn: () => readTicket.getAll(page, size),
10-
});
7+
return useQuery({
8+
queryKey: ['ticketOrders', page, size],
9+
queryFn: () => readTicket.getAll(page, size),
10+
});
1111
};
1212

1313
// 주문 상세 조회
1414
export const useTicketOrderDetail = (orderId: number) => {
15-
return useQuery({
16-
queryKey: ['ticketOrderDetail', orderId],
17-
queryFn: () => readTicket.getDetail(orderId),
18-
enabled: !!orderId
19-
});
15+
return useQuery({
16+
queryKey: ['ticketOrderDetail', orderId],
17+
queryFn: () => readTicket.getDetail(orderId),
18+
enabled: !!orderId,
19+
});
2020
};
2121

2222
// 주문 취소
2323
export const useCancelTicket = () => {
24-
return useMutation({
25-
mutationFn: (orderId: number) => cancelTickets(orderId),
26-
onSuccess: () => {
27-
alert('티켓이 성공적으로 취소되었습니다.');
28-
},
29-
onError: () => {
30-
alert('티켓 취소에 실패하였습니다.');
31-
},
32-
});
24+
return useMutation({
25+
mutationFn: (orderId: number) => cancelTickets(orderId),
26+
onSuccess: () => {
27+
alert('티켓이 성공적으로 취소되었습니다.');
28+
},
29+
onError: () => {
30+
alert('티켓 취소에 실패하였습니다.');
31+
},
32+
});
3333
};
3434

3535
// 티켓 구매
3636
export const useOrderTicket = () => {
37-
return useMutation({
38-
mutationFn: (data: OrderTicketRequest) => orderTickets(data),
39-
onError: () => {
40-
alert("티켓 구매 중 오류가 발생했습니다.");
41-
},
42-
});
43-
};
37+
return useMutation({
38+
mutationFn: (data: OrderTicketRequest) => orderTickets(data),
39+
onError: () => {
40+
alert('티켓 구매 중 오류가 발생했습니다.');
41+
},
42+
});
43+
};

src/pages/menu/ui/MyTicketPage.tsx

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import TicketHostLayout from '../../../shared/ui/backgrounds/TicketHostLayout';
22
import TicketLogo from '../../../../public/assets/menu/TicketLogo.svg';
3-
import { useState } from 'react';
3+
import { useEffect, useState } from 'react';
44
import QrModal from '../../../../design-system/ui/modals/QrModal';
55
import QRbackground from '../../../../design-system/icons/QRbackground.svg';
66
import EventCard from '../../../shared/ui/EventCard';
77
import completedImg from '../../../../public/assets/menu/Completed.svg';
88
import pendingImg from '../../../../public/assets/menu/Pending.svg';
99
import ticketImg from '../../../../public/assets/menu/Ticket.svg';
10-
import { useTicketOrders } from '../../../features/ticket/hooks/useOrderHook';
10+
import { useCancelTicket, useTicketOrders } from '../../../features/ticket/hooks/useOrderHook';
1111
import { OrderTicketResponse } from '../../../features/ticket/model/Order';
1212
import EmailDeleteModal from '../../../widgets/dashboard/ui/email/EmailDeleteModal';
1313
import TertiaryButton from '../../../../design-system/ui/buttons/TertiaryButton';
@@ -18,9 +18,16 @@ const MyTicketPage = () => {
1818
const [isCancelMode, setIsCancelMode] = useState(false);
1919
const [selectedIds, setSelectedIds] = useState<number[]>([]);
2020
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
21+
const [tickets, setTickets] = useState<OrderTicketResponse[]>([]);
2122

2223
const { data, isLoading, isError } = useTicketOrders(0, 10);
23-
const myTickets: OrderTicketResponse[] = data?.result || [];
24+
const { mutate: cancelTicket } = useCancelTicket();
25+
26+
useEffect(() => {
27+
if (data?.result) {
28+
setTickets(data.result);
29+
}
30+
}, [data]);
2431

2532
return (
2633
<TicketHostLayout image={TicketLogo} centerContent="내 티켓" ticketPage={true} isCancelMode={isCancelMode}>
@@ -31,7 +38,17 @@ const MyTicketPage = () => {
3138
type="button"
3239
color="pink"
3340
size="small"
34-
onClick={() => setIsCancelMode(prev => !prev)}
41+
onClick={() => {
42+
if (isCancelMode) {
43+
if (selectedIds.length > 0) {
44+
setIsDeleteModalOpen(true);
45+
} else {
46+
alert('취소할 티켓을 선택해주세요.');
47+
}
48+
} else {
49+
setIsCancelMode(true);
50+
}
51+
}}
3552
/>
3653
</div>
3754
)}
@@ -42,8 +59,8 @@ const MyTicketPage = () => {
4259
<p className="col-span-2 text-center text-sm md:text-base">티켓을 불러오는 중입니다...</p>
4360
) : isError ? (
4461
<p className="col-span-2 text-center text-sm md:text-base text-red-500">티켓을 불러오는데 실패했습니다.</p>
45-
) : myTickets.length > 0 ? (
46-
myTickets.map(ticket => (
62+
) : tickets.length > 0 ? (
63+
tickets.map(ticket => (
4764
<EventCard
4865
key={ticket.id}
4966
id={ticket.id}
@@ -117,11 +134,12 @@ const MyTicketPage = () => {
117134
rejectButtonText="뒤로가기"
118135
onClose={() => setIsDeleteModalOpen(false)}
119136
onClick={() => {
120-
/* cancelOrderTicket(selectedIds).then(() => {
137+
Promise.all(selectedIds.map(id => cancelTicket(id))).then(() => {
138+
setTickets(prev => prev.filter(ticket => !selectedIds.includes(ticket.id)));
121139
setIsDeleteModalOpen(false);
122140
setIsCancelMode(false);
123141
setSelectedIds([]);
124-
}); */
142+
});
125143
}}
126144
/>
127145
)}

0 commit comments

Comments
 (0)