From e6a0d6d14200c4f0b756319e77cf4e97462eee74 Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 01:23:30 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refact:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=B0=8F=20=ED=8B=B0=EC=BC=93=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C,=20=EC=8B=9C=EA=B0=84=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=20=EB=A1=9C=EC=BB=AC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/DatePicker.tsx | 18 +++++++++++++----- src/features/ticket/ui/TicketDatePicker.tsx | 6 +++--- src/shared/lib/date.ts | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index f2540174..435f48b0 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker'; import { ko } from 'date-fns/locale'; import 'react-datepicker/dist/react-datepicker.css'; import { FunnelState } from '../model/FunnelContext'; -import { formatISO } from '../../../shared/lib/date'; +import { formatDateToKst } from '../../../shared/lib/date'; interface DatePickerProps { className?: string; @@ -27,11 +27,19 @@ const EventDatePicker = ({ isLabel = false, }: DatePickerProps) => { const [startDate, setStartDate] = useState( - eventState?.startDate ? new Date(eventState.startDate) : initialStartDate ? new Date(initialStartDate) : new Date() + eventState?.startDate + ? new Date(eventState.startDate) + : initialStartDate + ? new Date(initialStartDate) + : new Date() ); const [endDate, setEndDate] = useState( - eventState?.endDate ? new Date(eventState.endDate) : initialEndDate ? new Date(initialEndDate) : new Date() + eventState?.endDate + ? new Date(eventState.endDate) + : initialEndDate + ? new Date(initialEndDate) + : new Date() ); const [startTime, setStartTime] = useState('06:00'); const [endTime, setEndTime] = useState('23:00'); @@ -73,8 +81,8 @@ const EventDatePicker = ({ useEffect(() => { if (startDate && endDate) { - const startISO = formatISO(startDate, startTime); - const endISO = formatISO(endDate, endTime); + const startISO = formatDateToKst(startDate, startTime); + const endISO = formatDateToKst(endDate, endTime); if (setEventState) { setEventState(prev => ({ diff --git a/src/features/ticket/ui/TicketDatePicker.tsx b/src/features/ticket/ui/TicketDatePicker.tsx index a630e14a..4ff91878 100644 --- a/src/features/ticket/ui/TicketDatePicker.tsx +++ b/src/features/ticket/ui/TicketDatePicker.tsx @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker'; import { ko } from 'date-fns/locale'; import 'react-datepicker/dist/react-datepicker.css'; import { TicketState } from '../model/TicketContext'; -import { formatISO } from '../../../shared/lib/date'; +import { formatDateToKst } from '../../../shared/lib/date'; interface DatePickerProps { className?: string; @@ -44,8 +44,8 @@ const TicketDatePicker = ({ const timeOptions = generateTimeOptions(); useEffect(() => { - const newStartDate = startDate ? formatISO(startDate, startTime) : ''; - const newEndDate = endDate ? formatISO(endDate, endTime) : ''; + const newStartDate = startDate ? formatDateToKst(startDate, startTime) : ''; + const newEndDate = endDate ? formatDateToKst(endDate, endTime) : ''; if (setTicketState) { setTicketState(prev => ({ diff --git a/src/shared/lib/date.ts b/src/shared/lib/date.ts index b54f1bd2..72ee4661 100644 --- a/src/shared/lib/date.ts +++ b/src/shared/lib/date.ts @@ -21,6 +21,21 @@ export const formatISO = (date: Date, time: string): string => { const kstDate = new Date(newDate.getTime() + 9 * 60 * 60 * 1000); // UTC+9 return kstDate.toISOString(); }; + +export const formatDateToKst = (date: Date, time: string): string => { + const [hours, minutes] = time.split(':').map(Number); + const newDate = new Date(date); + newDate.setHours(hours, minutes, 0, 0); + + const year = newDate.getFullYear(); + const month = String(newDate.getMonth() + 1).padStart(2, '0'); + const day = String(newDate.getDate()).padStart(2, '0'); + const hour = String(newDate.getHours()).padStart(2, '0'); + const minute = String(newDate.getMinutes()).padStart(2, '0'); + + return `${year}-${month}-${day}T${hour}:${minute}:00`; +}; + export const formatUtcToKst = (utcString: string): string => { const utcDate = new Date(utcString); @@ -35,4 +50,3 @@ export const formatUtcToKst = (utcString: string): string => { return `${year}년 ${month}월 ${day}일 ${hours}:${minutes}`; }; - From 4d520c91e72394efc0792851ef2717f68892446c Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 02:29:47 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=EC=98=88=EC=95=BD=20=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=91=9C=EC=A4=80=20=EB=A1=9C=EC=BB=AC=20=ED=91=9C?= =?UTF-8?q?=EC=A4=80=20=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=B3=80=EC=88=98=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/dashboard/hook/useEmailHook.ts | 2 +- .../dashboard/model/store/EmailStore.tsx | 2 +- src/features/event/ui/DatePicker.tsx | 6 +++--- src/features/event/ui/TimePicker.tsx | 17 +++++++++++------ src/features/ticket/ui/TicketDatePicker.tsx | 6 +++--- src/shared/lib/date.ts | 2 +- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/features/dashboard/hook/useEmailHook.ts b/src/features/dashboard/hook/useEmailHook.ts index f8d807ba..ade397c3 100644 --- a/src/features/dashboard/hook/useEmailHook.ts +++ b/src/features/dashboard/hook/useEmailHook.ts @@ -34,7 +34,7 @@ export const useSendEmail = () => { navigate(`/dashboard/${id}/mailBox`); }, onError: () => { - alert('메일 전송에 실패했습니다. 다시 시도해 주세요.'); + alert(`메일 전송에 실패했습니다. 다시 시도해 주세요.`); }, }); }; diff --git a/src/features/dashboard/model/store/EmailStore.tsx b/src/features/dashboard/model/store/EmailStore.tsx index b279d8ca..cd496191 100644 --- a/src/features/dashboard/model/store/EmailStore.tsx +++ b/src/features/dashboard/model/store/EmailStore.tsx @@ -5,7 +5,7 @@ interface EmailState { title: string; content: string; recipients: string[]; - reservationDate: string; // 2025-05-01T14:00:00.000Z + reservationDate: string; // 2025-05-01T14:00:00 targetType: 'ALL' | 'TICKET'; ticketId: number; setReservationEmailId: (reservationEmailId: number) => void; diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index 435f48b0..bea225aa 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker'; import { ko } from 'date-fns/locale'; import 'react-datepicker/dist/react-datepicker.css'; import { FunnelState } from '../model/FunnelContext'; -import { formatDateToKst } from '../../../shared/lib/date'; +import { formatDateLocalString } from '../../../shared/lib/date'; interface DatePickerProps { className?: string; @@ -81,8 +81,8 @@ const EventDatePicker = ({ useEffect(() => { if (startDate && endDate) { - const startISO = formatDateToKst(startDate, startTime); - const endISO = formatDateToKst(endDate, endTime); + const startISO = formatDateLocalString(startDate, startTime); + const endISO = formatDateLocalString(endDate, endTime); if (setEventState) { setEventState(prev => ({ diff --git a/src/features/event/ui/TimePicker.tsx b/src/features/event/ui/TimePicker.tsx index 0ea080c7..42f3b02d 100644 --- a/src/features/event/ui/TimePicker.tsx +++ b/src/features/event/ui/TimePicker.tsx @@ -36,13 +36,18 @@ const TimePicker = ({ value, onChange }: TimePickerProps) => { useEffect(() => { if (selectedDate) { const formattedDate = new Date(selectedDate); - formattedDate.setHours(parseInt(selectedHour, 10)); - formattedDate.setMinutes(parseInt(selectedMinute, 10)); - formattedDate.setSeconds(0); - formattedDate.setMilliseconds(0); + formattedDate.setHours(Number(selectedHour), Number(selectedMinute), 0, 0); - const isoString = formattedDate.toISOString(); // 2025-05-01T14:00:00.000Z - onChange(isoString); + const year = formattedDate.getFullYear(); + const month = String(formattedDate.getMonth() + 1).padStart(2, '0'); + const day = String(formattedDate.getDate()).padStart(2, '0'); + const hour = String(formattedDate.getHours()).padStart(2, '0'); + const minute = String(formattedDate.getMinutes()).padStart(2, '0'); + + const localString = `${year}-${month}-${day}T${hour}:${minute}:00`; + + onChange(localString); + console.log(localString); } }, [selectedDate, selectedHour, selectedMinute]); diff --git a/src/features/ticket/ui/TicketDatePicker.tsx b/src/features/ticket/ui/TicketDatePicker.tsx index 4ff91878..858d6000 100644 --- a/src/features/ticket/ui/TicketDatePicker.tsx +++ b/src/features/ticket/ui/TicketDatePicker.tsx @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker'; import { ko } from 'date-fns/locale'; import 'react-datepicker/dist/react-datepicker.css'; import { TicketState } from '../model/TicketContext'; -import { formatDateToKst } from '../../../shared/lib/date'; +import { formatDateLocalString } from '../../../shared/lib/date'; interface DatePickerProps { className?: string; @@ -44,8 +44,8 @@ const TicketDatePicker = ({ const timeOptions = generateTimeOptions(); useEffect(() => { - const newStartDate = startDate ? formatDateToKst(startDate, startTime) : ''; - const newEndDate = endDate ? formatDateToKst(endDate, endTime) : ''; + const newStartDate = startDate ? formatDateLocalString(startDate, startTime) : ''; + const newEndDate = endDate ? formatDateLocalString(endDate, endTime) : ''; if (setTicketState) { setTicketState(prev => ({ diff --git a/src/shared/lib/date.ts b/src/shared/lib/date.ts index 72ee4661..ebd5c8ee 100644 --- a/src/shared/lib/date.ts +++ b/src/shared/lib/date.ts @@ -22,7 +22,7 @@ export const formatISO = (date: Date, time: string): string => { return kstDate.toISOString(); }; -export const formatDateToKst = (date: Date, time: string): string => { +export const formatDateLocalString = (date: Date, time: string): string => { const [hours, minutes] = time.split(':').map(Number); const newDate = new Date(date); newDate.setHours(hours, minutes, 0, 0); From 180e08d9dcc29ed21f0a372a8ab145c6412de9d6 Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 03:20:29 +0900 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EA=B0=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EC=99=80=20=EC=84=A4=EB=AA=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/create-event/EventInfoPage.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/event/ui/create-event/EventInfoPage.tsx b/src/pages/event/ui/create-event/EventInfoPage.tsx index af5c17ef..73c16675 100644 --- a/src/pages/event/ui/create-event/EventInfoPage.tsx +++ b/src/pages/event/ui/create-event/EventInfoPage.tsx @@ -28,12 +28,18 @@ const EventInfoPage = ({ onValidationChange }: EventInfoPageProps) => { return (
- +
); From 16122a56ff5155aef5fb75f72b4499e359fbfd14 Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 09:06:47 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refact:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=ED=9B=84=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/FileUpload.tsx | 2 +- src/pages/dashboard/ui/EventInfoPage.tsx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/features/event/ui/FileUpload.tsx b/src/features/event/ui/FileUpload.tsx index 3d926e97..b075ef1c 100644 --- a/src/features/event/ui/FileUpload.tsx +++ b/src/features/event/ui/FileUpload.tsx @@ -36,7 +36,7 @@ const FileUpload = ({ return (

배너 사진 첨부

-

1MB 이하의 jpeg, png 파일만 등록할 수 있습니다.

+

4MB 이하의 jpeg, png 파일만 등록할 수 있습니다.

{ const queryClient = useQueryClient(); const [selectedOption, setSelectedOption] = useState(''); const { data } = useEventDetail(); const { mutate } = useUpdateEventHook(); + const navigate = useNavigate(); const handleSelect = (option: string) => { setSelectedOption(option); @@ -62,6 +64,7 @@ const EventInfoPage = () => { onSuccess: () => { alert('이벤트 정보가 저장되었습니다.'); queryClient.invalidateQueries({ queryKey: ['eventDetail', data.result.id] }); + navigate(`/dashboard/${data?.result.id}`); }, onError: error => { console.error('Error details:', error); From 227eeee2d6f6e0b3c04cbfcb63c8ec3b50dc1503 Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 18:49:44 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=EC=8B=9C=EA=B0=84=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EA=B0=92=20=ED=8C=8C=EC=8B=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/DatePicker.tsx | 49 +++++++++++++++++++++------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index bea225aa..cd39617f 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -16,6 +16,14 @@ interface DatePickerProps { isLabel?: boolean; } +function extractTimeFromDateString(dateString?: string, defaultTime = '06:00') { + if (!dateString) return defaultTime; + const date = new Date(dateString); + const hours = date.getHours().toString().padStart(2, '0'); + const minutes = date.getMinutes().toString().padStart(2, '0'); + return `${hours}:${minutes}`; +} + const EventDatePicker = ({ className, eventState, @@ -27,22 +35,30 @@ const EventDatePicker = ({ isLabel = false, }: DatePickerProps) => { const [startDate, setStartDate] = useState( - eventState?.startDate - ? new Date(eventState.startDate) - : initialStartDate - ? new Date(initialStartDate) - : new Date() + eventState?.startDate + ? new Date(eventState.startDate) + : initialStartDate + ? new Date(initialStartDate) + : new Date() ); const [endDate, setEndDate] = useState( - eventState?.endDate - ? new Date(eventState.endDate) - : initialEndDate - ? new Date(initialEndDate) - : new Date() + eventState?.endDate + ? new Date(eventState.endDate) + : initialEndDate + ? new Date(initialEndDate) + : new Date() + ); + + console.log('startDate', startDate); + console.log('endDate', endDate); + + const [startTime, setStartTime] = useState( + extractTimeFromDateString(eventState?.startDate || initialStartDate, '06:00') + ); + const [endTime, setEndTime] = useState( + extractTimeFromDateString(eventState?.endDate || initialEndDate, '23:00') ); - const [startTime, setStartTime] = useState('06:00'); - const [endTime, setEndTime] = useState('23:00'); useEffect(() => { const start = eventState?.startDate || initialStartDate; @@ -65,6 +81,15 @@ const EventDatePicker = ({ } }, [eventState, initialStartDate, initialEndDate]); + useEffect(() => { + if (eventState?.startDate) { + setStartTime(extractTimeFromDateString(eventState.startDate, '06:00')); + } + if (eventState?.endDate) { + setEndTime(extractTimeFromDateString(eventState.endDate, '23:00')); + } + }, [eventState?.startDate, eventState?.endDate]); + const generateTimeOptions = () => { const options = []; for (let i = 0; i < 24; i++) { From 44726c7d76fc0551f1f2bb9d88522ce591d530df Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 19:35:28 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=EB=82=A0=EC=A7=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/DatePicker.tsx | 25 +++++++++++-------------- src/shared/lib/date.ts | 8 ++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index cd39617f..ef37c313 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker'; import { ko } from 'date-fns/locale'; import 'react-datepicker/dist/react-datepicker.css'; import { FunnelState } from '../model/FunnelContext'; -import { formatDateLocalString } from '../../../shared/lib/date'; +import { formatDateLocalString, extractTimeFromDateString } from '../../../shared/lib/date'; interface DatePickerProps { className?: string; @@ -16,14 +16,6 @@ interface DatePickerProps { isLabel?: boolean; } -function extractTimeFromDateString(dateString?: string, defaultTime = '06:00') { - if (!dateString) return defaultTime; - const date = new Date(dateString); - const hours = date.getHours().toString().padStart(2, '0'); - const minutes = date.getMinutes().toString().padStart(2, '0'); - return `${hours}:${minutes}`; -} - const EventDatePicker = ({ className, eventState, @@ -82,13 +74,18 @@ const EventDatePicker = ({ }, [eventState, initialStartDate, initialEndDate]); useEffect(() => { - if (eventState?.startDate) { - setStartTime(extractTimeFromDateString(eventState.startDate, '06:00')); + if (eventState?.startDate || initialStartDate) { + const date = new Date(eventState?.startDate || initialStartDate!); + setStartDate(date); + setStartTime(extractTimeFromDateString(eventState?.startDate || initialStartDate, '06:00')); } - if (eventState?.endDate) { - setEndTime(extractTimeFromDateString(eventState.endDate, '23:00')); + if (eventState?.endDate || initialEndDate) { + const date = new Date(eventState?.endDate || initialEndDate!); + setEndDate(date); + setEndTime(extractTimeFromDateString(eventState?.endDate || initialEndDate, '23:00')); } - }, [eventState?.startDate, eventState?.endDate]); + }, [eventState?.startDate, eventState?.endDate, initialStartDate, initialEndDate]); + const generateTimeOptions = () => { const options = []; diff --git a/src/shared/lib/date.ts b/src/shared/lib/date.ts index ebd5c8ee..a47ce7d2 100644 --- a/src/shared/lib/date.ts +++ b/src/shared/lib/date.ts @@ -22,6 +22,14 @@ export const formatISO = (date: Date, time: string): string => { return kstDate.toISOString(); }; +export const extractTimeFromDateString = (dateString?: string, defaultTime = '06:00') => { + if (!dateString) return defaultTime; + const date = new Date(dateString); + const hours = date.getHours().toString().padStart(2, '0'); + const minutes = date.getMinutes().toString().padStart(2, '0'); + return `${hours}:${minutes}`; +} + export const formatDateLocalString = (date: Date, time: string): string => { const [hours, minutes] = time.split(':').map(Number); const newDate = new Date(date); From 9893864a38553b26f9e1ff8e4eeba4c6443b07cb Mon Sep 17 00:00:00 2001 From: JaeHunKang Date: Sun, 6 Jul 2025 20:09:54 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refact:=20=EA=B5=AC=EB=A7=A4=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=9E=88=EB=8A=94=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=A9=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/join/LogoutPage.tsx | 3 ++- src/shared/ui/EventCard.tsx | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pages/join/LogoutPage.tsx b/src/pages/join/LogoutPage.tsx index de7d5371..403409d7 100644 --- a/src/pages/join/LogoutPage.tsx +++ b/src/pages/join/LogoutPage.tsx @@ -22,7 +22,8 @@ const LogoutPage = () => { 'code' in error && ( (error as { code?: string }).code === 'TOKEN4001' || - (error as { code?: string }).code === 'TOKEN4004') + (error as { code?: string }).code === 'TOKEN4004' + ) ) { // 토큰 만료로 인한 자동 로그아웃이므로 조용히 처리 console.log('토큰 만료로 인한 자동 로그아웃', error); diff --git a/src/shared/ui/EventCard.tsx b/src/shared/ui/EventCard.tsx index ee39e4a1..33f9885b 100644 --- a/src/shared/ui/EventCard.tsx +++ b/src/shared/ui/EventCard.tsx @@ -133,8 +133,17 @@ const EventCard = ({ onDeleteSuccess?.(id); setIsModalOpen(false); }, - onError: () => { - alert('이벤트 삭제에 실패했습니다.'); + onError: (error: unknown) => { + if ( + typeof error === 'object' && + error !== null && + 'code' in error && + ( + error as { code? : string}).code === "EVENT4002" + ) { + console.log('참여자로 인한 이벤트 삭제 실패'); + alert('구매자가 있는 이벤트는 삭제가 불가합니다.'); + } setIsModalOpen(false); }, });