From 4777429053279f8a714ee5326410b809900e05c4 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Thu, 29 May 2025 23:47:41 +0900 Subject: [PATCH 01/19] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20API=20=EB=B3=B4?= =?UTF-8?q?=EC=95=88=20=EC=9C=84=ED=97=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/join/api/user.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/features/join/api/user.ts b/src/features/join/api/user.ts index 9ebaa02a..17c50515 100644 --- a/src/features/join/api/user.ts +++ b/src/features/join/api/user.ts @@ -2,15 +2,11 @@ import { axiosClient } from '../../../shared/types/api/http-client'; import { UserInfoRequest, UserInfoResponse } from '../model/userInformation'; export const readUser = async (): Promise => { - const response = await axiosClient.get<{ result: UserInfoResponse }>('/users', { - headers: { skipAuth: true }, - }); + const response = await axiosClient.get<{ result: UserInfoResponse }>('/users'); return response.data.result; }; export const updateUser = async (data: UserInfoRequest): Promise => { - const response = await axiosClient.put('/users', data, { - headers: { skipAuth: true }, - }); + const response = await axiosClient.put('/users', data); return response.data; }; From 82a33224361872ade6d60712a6c52af6a1c1a64c Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Fri, 30 May 2025 00:50:01 +0900 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20UI=20=EA=B0=80=EB=A6=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/EventDetailsPage.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index 9ce83b91..d63ad863 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -18,11 +18,13 @@ import KakaoMap from '../../../shared/ui/KakaoMap'; import { useCreateBookmark, useDeleteBookmark } from '../../../features/bookmark/hook/useBookmarkHook'; import { formatDate, formatTime } from '../../../shared/lib/date'; import { useEventDetail } from '../../../entities/event/hook/useEventHook'; +import useAuthStore from '../../../app/provider/authStore'; const EventDetailsPage = () => { const navigate = useNavigate(); const [title, setTitle] = useState(''); const [isModalOpen, setIsModalOpen] = useState(false); + const isLoggedIn = useAuthStore(state => state.isLoggedIn); const { data: event } = useEventDetail(); const handleShareClick = (title: string) => { @@ -81,10 +83,12 @@ const EventDetailsPage = () => { iconPath={공유하기 버튼} onClick={() => handleShareClick(event.result.title)} /> - } - onClick={handleLikeClick} - /> + {isLoggedIn && ( + } + onClick={handleLikeClick} + /> + )}
From 114bac5422900d706513383c79e4dc64d0a05f7b Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Fri, 30 May 2025 00:53:28 +0900 Subject: [PATCH 03/19] =?UTF-8?q?=EB=8F=8B=EB=B3=B4=EA=B8=B0=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=ED=81=B4=EB=A6=AD=EC=8B=9C=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/EventDetailsPage.tsx | 4 +++- src/pages/menu/ui/MenuPage.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index d63ad863..16e286dd 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -63,7 +63,9 @@ const EventDetailsPage = () => { leftButtonClick={() => navigate(-1)} leftButtonLabel="<" centerContent="같이가요" - rightContent={검색} + rightContent={ + 검색 navigate('/search')} /> + } /> {event ? ( <> diff --git a/src/pages/menu/ui/MenuPage.tsx b/src/pages/menu/ui/MenuPage.tsx index d0337a20..770ea081 100644 --- a/src/pages/menu/ui/MenuPage.tsx +++ b/src/pages/menu/ui/MenuPage.tsx @@ -20,7 +20,7 @@ const MenuPage = () => { centerContent="카테고리" rightContent={ } /> From 88ab663289adc64196af809c2d9034fc67b7fd13 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Fri, 30 May 2025 01:02:14 +0900 Subject: [PATCH 04/19] =?UTF-8?q?feat:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=B2=A8=EB=B6=80=20API=20data=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/EventDetailsPage.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index 16e286dd..72f582dc 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -8,7 +8,7 @@ import share from '../../../../public/assets/event-manage/details/Share.svg'; import like from '../../../../public/assets/event-manage/details/Like.svg'; import liked from '../../../../public/assets/event-manage/details/ClickedLike.svg'; import TicketInfo from '../../../widgets/event/ui/TicketInfo'; -import link from '../../../../public/assets/event-manage/details/Link.svg'; +import linkIcon from '../../../../public/assets/event-manage/details/Link.svg'; import ShareEventModal from '../../../features/event/ui/ShareEventModal'; import participantsImg from '../../../../public/assets/event-manage/details/People.svg'; import dateImg from '../../../../public/assets/event-manage/details/Date.svg'; @@ -135,8 +135,15 @@ const EventDetailsPage = () => {

관련 링크

- 링크 이모지 - 공식 웹사이트 + {event.result.referenceLinks.map((link: { title: string; url: string }, index: number) => ( +
+ 링크 이모지 + {link.title} + + {link.url} + +
+ ))}
From 80f76df1adc6b3749d570a7cbce6bac31b43cfa4 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Fri, 30 May 2025 01:18:06 +0900 Subject: [PATCH 05/19] =?UTF-8?q?fix:=20=EC=A3=BC=EC=86=8C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=83=81=EC=84=B8=EC=A3=BC=EC=86=8C=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=ED=8F=AC=ED=95=A8=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/EventDetailsPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index 72f582dc..6c499f0a 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -107,7 +107,9 @@ const EventDetailsPage = () => {
위치 이미지 - {event.result.address} + + {event.result.address} {event.result.detailAddress} +
Date: Fri, 30 May 2025 01:18:33 +0900 Subject: [PATCH 06/19] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B9=B4=EB=93=9C=20=ED=81=B4=EB=A6=AD=EC=8B=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/EventList.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/features/event/ui/EventList.tsx b/src/features/event/ui/EventList.tsx index 740c61b8..7c52d1ac 100644 --- a/src/features/event/ui/EventList.tsx +++ b/src/features/event/ui/EventList.tsx @@ -3,6 +3,8 @@ import { useInfiniteScroll } from '../../../shared/hooks/useInfiniteScroll'; import { getAllEventsInfinite, getCategoryEventsInfinite } from '../../../entities/event/api/event'; import EventCard from '../../../shared/ui/EventCard'; import { BaseEvent, CategoryType, TagType } from '../../../shared/types/baseEventType'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { useNavigate } from 'react-router-dom'; interface EventListProps extends BaseEvent { id: number; @@ -16,6 +18,8 @@ interface EventListComponentProps { } const EventList = ({ category, tag }: EventListComponentProps) => { + const navigate = useNavigate(); + const { data, fetchNextPage, hasNextPage, isFetching } = useInfiniteScroll({ queryKey: ['events', 'infinite', category ?? '', tag ?? ''], queryFn: params => { @@ -66,7 +70,11 @@ const EventList = ({ category, tag }: EventListComponentProps) => { page.items.map((event: EventListProps, eventIndex) => { const isLastElement = pageIndex === data.pages.length - 1 && eventIndex === page.items.length - 1; return ( -
+
navigate(`/event-details/${event.id}`)} + > Date: Fri, 30 May 2025 01:53:08 +0900 Subject: [PATCH 07/19] =?UTF-8?q?fix:=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=95=EB=B3=B4=20=EC=95=88?= =?UTF-8?q?=EB=B3=B4=EC=9D=B4=EA=B2=8C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/EventList.tsx | 51 ++++++++++++--------- src/features/home/ui/EventSliderSection.tsx | 22 ++++++--- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/features/event/ui/EventList.tsx b/src/features/event/ui/EventList.tsx index 7c52d1ac..10ba2b5c 100644 --- a/src/features/event/ui/EventList.tsx +++ b/src/features/event/ui/EventList.tsx @@ -67,27 +67,36 @@ const EventList = ({ category, tag }: EventListComponentProps) => { ) : (
{data?.pages.map((page, pageIndex) => - page.items.map((event: EventListProps, eventIndex) => { - const isLastElement = pageIndex === data.pages.length - 1 && eventIndex === page.items.length - 1; - return ( -
navigate(`/event-details/${event.id}`)} - > - -
- ); - }) + page.items + .filter(event => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + + const endDate = new Date((event as EventListProps).endDate ?? event.startDate); + + return endDate >= today; + }) + .map((event: EventListProps, eventIndex) => { + const isLastElement = pageIndex === data.pages.length - 1 && eventIndex === page.items.length - 1; + return ( +
navigate(`/event-details/${event.id}`)} + > + +
+ ); + }) )}
)} diff --git a/src/features/home/ui/EventSliderSection.tsx b/src/features/home/ui/EventSliderSection.tsx index ecc53a90..04b4c19d 100644 --- a/src/features/home/ui/EventSliderSection.tsx +++ b/src/features/home/ui/EventSliderSection.tsx @@ -16,8 +16,6 @@ const EventSliderSection = ({ title, events }: EventSliderSectionProps) => { const maxCardsToShow = 2; const navigate = useNavigate(); - console.log(events); - type SetStartIndex = Dispatch>; const handleNext = (setStartIndex: SetStartIndex, currentIndex: number, eventsLength: number): void => { @@ -28,21 +26,31 @@ const EventSliderSection = ({ title, events }: EventSliderSectionProps) => { setStartIndex((currentIndex - 1 + eventsLength) % eventsLength); }; + const now = new Date(); + now.setHours(0, 0, 0, 0); + + const filteredEvents = events.filter(event => { + const endDate = new Date(event.endDate); + endDate.setHours(0, 0, 0, 0); + return endDate >= now; + }); + const eventsToShow = - events.length > 0 - ? events + filteredEvents.length > 0 + ? filteredEvents .slice(startIndex, startIndex + maxCardsToShow) .concat( - startIndex + maxCardsToShow > events.length - ? events.slice(0, (startIndex + maxCardsToShow) % events.length) + startIndex + maxCardsToShow > filteredEvents.length + ? filteredEvents.slice(0, (startIndex + maxCardsToShow) % filteredEvents.length) : [] ) : []; + return (

{title}

- {events.length === 0 ? ( + {filteredEvents.length === 0 ? (
표시할 이벤트가 없습니다.
) : ( eventsToShow.map((event: EventItem) => ( From 680ae561f88a4de7c8365bd858149bc36465e69b Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 09:25:34 +0900 Subject: [PATCH 08/19] =?UTF-8?q?refac:=20=EA=B3=B5=EA=B0=9C=20API?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A1=9C=EC=A7=81=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/event/api/event.ts | 10 +++++----- src/features/join/api/user.ts | 8 ++++++-- src/shared/types/api/http-client.ts | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/entities/event/api/event.ts b/src/entities/event/api/event.ts index 30a333c1..be86163f 100644 --- a/src/entities/event/api/event.ts +++ b/src/entities/event/api/event.ts @@ -7,7 +7,7 @@ import { EventItem, PaginationParams } from '../model/eventDetail'; export const eventDetail = async (dto: EventDetailRequest) => { const response = await axiosClient.get(`/events/${dto.eventId}`, { params: { userId: dto.userId }, - headers: { skipAuth: true }, + headers: { isPublicApi: true }, }); return response.data; }; @@ -25,7 +25,7 @@ export const getAllEventsInfinite = async ({ params.append('size', size.toString()); const response = await axiosClient.get>(`/events?${params.toString()}`, { - headers: { skipAuth: true }, + headers: { isPublicApi: true }, }); const items = response.data.result ?? []; @@ -49,7 +49,7 @@ export const getCategoryEventsInfinite = async ({ params.append('size', size.toString()); const response = await axiosClient.get>(`/events/categories?${params.toString()}`, { - headers: { skipAuth: true }, + headers: { isPublicApi: true }, }); const items = response.data.result ?? []; @@ -63,7 +63,7 @@ export const getCategoryEventsInfinite = async ({ // 태그별 이벤트 목록 조회 (최신, 인기, 마감 / 기본 정보) export const getEventByTag = async (tag: TagType, { page, size }: PaginationParams): Promise => { const response = await axiosClient.get<{ result: EventItem[] }>(`/events?tags=${tag}&page=${page}&size=${size}`, { - headers: { skipAuth: true }, + headers: { isPublicApi: true }, }); return response.data.result || []; }; @@ -76,7 +76,7 @@ export const getEventByCategory = async ( const response = await axiosClient.get( `/events/category?category=${category}&page=${page}&size=${size}`, { - headers: { skipAuth: true }, + headers: { isPublicApi: true }, } ); return response.data; diff --git a/src/features/join/api/user.ts b/src/features/join/api/user.ts index 17c50515..ba992d3e 100644 --- a/src/features/join/api/user.ts +++ b/src/features/join/api/user.ts @@ -2,11 +2,15 @@ import { axiosClient } from '../../../shared/types/api/http-client'; import { UserInfoRequest, UserInfoResponse } from '../model/userInformation'; export const readUser = async (): Promise => { - const response = await axiosClient.get<{ result: UserInfoResponse }>('/users'); + const response = await axiosClient.get<{ result: UserInfoResponse }>('/users', { + headers: { isPublicApi: true }, + }); return response.data.result; }; export const updateUser = async (data: UserInfoRequest): Promise => { - const response = await axiosClient.put('/users', data); + const response = await axiosClient.put('/users', data, { + headers: { isPublicApi: true }, + }); return response.data; }; diff --git a/src/shared/types/api/http-client.ts b/src/shared/types/api/http-client.ts index 02d2e885..72b9dc7c 100644 --- a/src/shared/types/api/http-client.ts +++ b/src/shared/types/api/http-client.ts @@ -14,7 +14,7 @@ export const axiosClient = axios.create({ axiosClient.interceptors.request.use( config => { - if (config.headers?.skipAuth) { + if (config.headers?.isPublicApi) { return config; } From 499036303a4fdf98c088fb2a30836964016d9d5a Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 09:29:03 +0900 Subject: [PATCH 09/19] =?UTF-8?q?fix:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=ED=95=9C=EA=B0=9C=EC=9D=BC=EB=95=8C?= =?UTF-8?q?=EB=8F=84=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/home/ui/EventSliderSection.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/features/home/ui/EventSliderSection.tsx b/src/features/home/ui/EventSliderSection.tsx index 04b4c19d..2214f987 100644 --- a/src/features/home/ui/EventSliderSection.tsx +++ b/src/features/home/ui/EventSliderSection.tsx @@ -70,6 +70,22 @@ const EventSliderSection = ({ title, events }: EventSliderSectionProps) => {
)) )} + {eventsToShow.length === 1 && ( + + )}
{startIndex !== 0 && ( Date: Sat, 31 May 2025 09:31:49 +0900 Subject: [PATCH 10/19] =?UTF-8?q?fix:=20=EC=98=A8=EB=9D=BC=EC=9D=B8?= =?UTF-8?q?=EC=9D=BC=EB=95=8C=EB=8A=94=20=EC=A3=BC=EC=86=8C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=95=88=EB=B3=B4=EC=9D=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/event/ui/EventDetailsPage.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pages/event/ui/EventDetailsPage.tsx b/src/pages/event/ui/EventDetailsPage.tsx index 6c499f0a..cafe5920 100644 --- a/src/pages/event/ui/EventDetailsPage.tsx +++ b/src/pages/event/ui/EventDetailsPage.tsx @@ -105,12 +105,14 @@ const EventDetailsPage = () => { {formatTime(event.result.startDate)} ~ {formatTime(event.result.endDate)}
-
- 위치 이미지 - - {event.result.address} {event.result.detailAddress} - -
+ {event.result.address && ( +
+ 위치 이미지 + + {event.result.address} {event.result.detailAddress} + +
+ )}
Date: Sat, 31 May 2025 11:58:04 +0900 Subject: [PATCH 11/19] =?UTF-8?q?refac:=20=EC=A0=84=ED=99=94=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B0=9C=EC=88=98=20=EC=97=90=EB=9F=AC=20=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/lib/formValidation.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/shared/lib/formValidation.ts b/src/shared/lib/formValidation.ts index 962a567a..b356962d 100644 --- a/src/shared/lib/formValidation.ts +++ b/src/shared/lib/formValidation.ts @@ -9,8 +9,10 @@ export const formSchema = z.object({ .regex(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/, '올바른 이메일 형식이어야 합니다.'), phone: z .string() - .regex(/^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$/, '연락처는 -을 포함한 형식이어야 합니다.') - .min(1, '전화번호를 입력해주세요.'), + .regex(/^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$/, '연락처는 하이픈(-)을 포함한 형식이어야 합니다.') + .refine(val => val.length === 13, { + message: '연락처는 하이픈(-) 포함 13자 형식(예: 010-1234-5678)이어야 합니다.', + }), }); export const organizerFormSchema = formSchema.pick({ email: true, phone: true }); export const eventTitleSchema = z.object({ From 31c8d3c7eed7c1e4ffaaf376894be409982abf8d Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 12:59:45 +0900 Subject: [PATCH 12/19] =?UTF-8?q?fix:=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=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 | 22 ++++++++++++---------- src/pages/dashboard/ui/EventInfoPage.tsx | 6 +++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index ea398ee5..127544d7 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -27,10 +27,12 @@ const EventDatePicker = ({ isLabel = false, }: DatePickerProps) => { const [startDate, setStartDate] = useState( - eventState?.startDate ? new Date(eventState.startDate) : new Date() + eventState?.startDate ? new Date(eventState.startDate) : initialStartDate ? new Date(initialStartDate) : null ); - const [endDate, setEndDate] = useState(eventState?.endDate ? new Date(eventState.endDate) : new Date()); + const [endDate, setEndDate] = useState( + eventState?.endDate ? new Date(eventState.endDate) : initialEndDate ? new Date(initialEndDate) : null + ); const [startTime, setStartTime] = useState('06:00'); const [endTime, setEndTime] = useState('23:00'); @@ -39,18 +41,18 @@ const EventDatePicker = ({ const end = eventState?.endDate || initialEndDate; if (start && !startDate) { - const startDate = new Date(start); - setStartDate(startDate); - const hours = startDate.getHours().toString().padStart(2, '0'); - const minutes = startDate.getMinutes().toString().padStart(2, '0'); + const startDateObj = new Date(start); + setStartDate(prev => prev ?? startDateObj); + const hours = startDateObj.getHours().toString().padStart(2, '0'); + const minutes = startDateObj.getMinutes().toString().padStart(2, '0'); setStartTime(`${hours}:${minutes}`); } if (end && !endDate) { - const endDate = new Date(end); - setEndDate(endDate); - const hours = endDate.getHours().toString().padStart(2, '0'); - const minutes = endDate.getMinutes().toString().padStart(2, '0'); + const endDateObj = new Date(end); + setEndDate(prev => prev ?? endDateObj); + const hours = endDateObj.getHours().toString().padStart(2, '0'); + const minutes = endDateObj.getMinutes().toString().padStart(2, '0'); setEndTime(`${hours}:${minutes}`); } }, [eventState, initialStartDate, initialEndDate]); diff --git a/src/pages/dashboard/ui/EventInfoPage.tsx b/src/pages/dashboard/ui/EventInfoPage.tsx index 6db8f9de..ffaf4686 100644 --- a/src/pages/dashboard/ui/EventInfoPage.tsx +++ b/src/pages/dashboard/ui/EventInfoPage.tsx @@ -3,7 +3,6 @@ import ChoiceChip from '../../../../design-system/ui/ChoiceChip'; import DefaultTextField from '../../../../design-system/ui/textFields/DefaultTextField'; import EventDatePicker from '../../../features/event/ui/DatePicker'; import DashboardLayout from '../../../shared/ui/backgrounds/DashboardLayout'; -import { useNavigate } from 'react-router-dom'; import Button from '../../../../design-system/ui/Button'; import { useUpdateEventHook } from '../../../features/dashboard/hook/useEventHook'; import { OnlineType } from '../../../shared/types/baseEventType'; @@ -11,9 +10,10 @@ import { AddressSearch } from '../../../shared/ui/AddressSearch'; import KakaoMap from '../../../shared/ui/KakaoMap'; import { UpdateEventRequest } from '../../../features/dashboard/model/event'; import { useEventDetail } from '../../../entities/event/hook/useEventHook'; +import { useQueryClient } from '@tanstack/react-query'; const EventInfoPage = () => { - const navigate = useNavigate(); + const queryClient = useQueryClient(); const [selectedOption, setSelectedOption] = useState(''); const { data } = useEventDetail(); const { mutate } = useUpdateEventHook(); @@ -60,7 +60,7 @@ const EventInfoPage = () => { mutate(requestData, { onSuccess: () => { alert('이벤트 정보가 저장되었습니다.'); - navigate(`/dashboard/${data?.result.id}`); + queryClient.invalidateQueries({ queryKey: ['eventDetail', data.result.id] }); }, onError: error => { console.error('Error details:', error); From 5607cf4abcb5923a6e7ae21ab7af7a161bef5310 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 13:25:47 +0900 Subject: [PATCH 13/19] =?UTF-8?q?design:=20=EC=A3=BC=EB=AC=B8=EB=B2=88?= =?UTF-8?q?=ED=98=B8,=20=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EA=B8=80=EC=94=A8=20=EC=9C=84=EC=B9=98=20=ED=97=A4=EB=8D=94?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/dashboard/ui/ParicipantCard.tsx | 28 +++++++++---------- .../dashboard/ui/PariticipantsList.tsx | 8 ++---- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/features/dashboard/ui/ParicipantCard.tsx b/src/features/dashboard/ui/ParicipantCard.tsx index 03a030a9..3f493dae 100644 --- a/src/features/dashboard/ui/ParicipantCard.tsx +++ b/src/features/dashboard/ui/ParicipantCard.tsx @@ -12,38 +12,36 @@ interface ParticipantCardProps { } const ParticipantCard = ({ participant, onCheckClick }: ParticipantCardProps) => { - const { mutate: approveParticipant } = useApproveParticipants(participant.orderId); return (
-
-

{participant.orderId}

+
+

{participant.orderId}

이름: {participant.participant}

이메일 주소: {participant.email}

휴대폰 번호: {participant.phoneNumber}

-
구매 일자: {formatDate(participant.purchaseDate)} {formatTime(participant.purchaseDate)}
+
+ 구매 일자: {formatDate(participant.purchaseDate)} {formatTime(participant.purchaseDate)} +

티켓 이름: {participant.ticketName}

- { - - } - {participant.checkedIn ?

완료

:

미완료

} + {} + {participant.checkedIn ? ( +

완료

+ ) : ( +

미완료

+ )} {participant.approved ? ( -

승인됨

+

승인됨

) : participant.ticketType === 'FIRST_COME' ? ( -

승인됨

+

승인됨

) : ( user.orders) - .find(order => order.orderId === selectedOrderId); + const order = data.result.flatMap(user => user.orders).find(order => order.orderId === selectedOrderId); if (!order) { alert('응답 데이터가 없습니다.'); @@ -68,7 +66,7 @@ const ParticipantsList = ({ listType, selectedFilter = [], participants }: Parti
-
+

주문 번호

참여자 정보

From ea3f2f54995af04cb641c19d4e0fa500679a2002 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 13:29:41 +0900 Subject: [PATCH 14/19] =?UTF-8?q?design:=20=EC=9D=91=EB=8B=B5=20=EC=9A=94?= =?UTF-8?q?=EC=95=BD=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B0=A8=ED=8A=B8=20?= =?UTF-8?q?=EC=98=81=EC=97=AD=20=EB=B0=B0=EA=B2=BD=EC=83=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/dashboard/ui/MultiplePieCharts.tsx | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/features/dashboard/ui/MultiplePieCharts.tsx b/src/features/dashboard/ui/MultiplePieCharts.tsx index 0d752ffc..55bb64f8 100644 --- a/src/features/dashboard/ui/MultiplePieCharts.tsx +++ b/src/features/dashboard/ui/MultiplePieCharts.tsx @@ -1,5 +1,5 @@ import { PieChart, Pie, Cell, Legend, ResponsiveContainer } from 'recharts'; -import { TicketOption, TicketOptionAnswer} from '../../ticket/model/ticketInformation'; +import { TicketOption, TicketOptionAnswer } from '../../ticket/model/ticketInformation'; const COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40']; @@ -23,7 +23,7 @@ const MultiplePieCharts = ({ responses }: MultiplePieChartsProps) => { } return ( -
+
{responses.map((option, index) => { const data = aggregateAnswers(option.ticketOptionAnswers); @@ -32,16 +32,7 @@ const MultiplePieCharts = ({ responses }: MultiplePieChartsProps) => {

{option.optionName}

- + {data.map((_, i) => ( ))} From 572b01e6a830beed9fd23420c04b746256d4c878 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sat, 31 May 2025 13:42:37 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refac:=20=EC=9A=94=EC=95=BD=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A7=88=EB=AC=B8=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/ui/MultiplePieCharts.tsx | 2 +- src/features/dashboard/ui/ResponsesList.tsx | 113 ++++++++---------- 2 files changed, 48 insertions(+), 67 deletions(-) diff --git a/src/features/dashboard/ui/MultiplePieCharts.tsx b/src/features/dashboard/ui/MultiplePieCharts.tsx index 55bb64f8..dc7b9a44 100644 --- a/src/features/dashboard/ui/MultiplePieCharts.tsx +++ b/src/features/dashboard/ui/MultiplePieCharts.tsx @@ -23,7 +23,7 @@ const MultiplePieCharts = ({ responses }: MultiplePieChartsProps) => { } return ( -
+
{responses.map((option, index) => { const data = aggregateAnswers(option.ticketOptionAnswers); diff --git a/src/features/dashboard/ui/ResponsesList.tsx b/src/features/dashboard/ui/ResponsesList.tsx index 92cd7b08..efb651b2 100644 --- a/src/features/dashboard/ui/ResponsesList.tsx +++ b/src/features/dashboard/ui/ResponsesList.tsx @@ -14,85 +14,66 @@ interface ResponsesListProps { const ResponsesList = ({ listType, ticketOptionResponses, ticketId }: ResponsesListProps) => { const { data, isLoading, error } = usePersonalTicketOptionAnswers(ticketId); - const { - currentIndex, - setCurrentIndex, - } = useResponseStore(); + const { currentIndex, setCurrentIndex } = useResponseStore(); useEffect(() => { setCurrentIndex(() => 0); }, [listType, setCurrentIndex]); - const renderTextResponses = (responses: TicketOption[]) => { - const textResponses = responses.filter((res) => res.optionType === 'TEXT'); - if (textResponses.length === 0) return null; - - return ( - <> - {textResponses.map((textResponse, idx) => ( -
-
-

{textResponse.optionName}

-

응답 {textResponse.ticketOptionAnswers.length}개

-
- - {textResponse.ticketOptionAnswers.length === 0 ? ( -

응답이 없습니다.

- ) : ( -
- {textResponse.ticketOptionAnswers.map((answer) => ( -
-

{answer.answer}

-
- ))} -
- )} -
- ))} - - ); - }; - const renderList = () => { switch (listType) { - case 'summary': - { - const filteredResponses = ticketOptionResponses.filter( - (option) => option.optionType !== 'TEXT' - ); - return ( - <> -
-
- + case 'summary': { + return ( +
+ {ticketOptionResponses.map(option => { + if (option.optionType === 'TEXT') { + return ( +
+
+

{option.optionName}

+

응답 {option.ticketOptionAnswers.length}개

+
+ {option.ticketOptionAnswers.length === 0 ? ( +

응답이 없습니다.

+ ) : ( +
+ {option.ticketOptionAnswers.map(answer => ( +
+ {answer.answer} +
+ ))} +
+ )} +
+ ); + } + return ( +
+
+ +
-
- {renderTextResponses(ticketOptionResponses)} - - ); - } + ); + })} +
+ ); + } + + case 'individual': { + if (isLoading) return

로딩 중...

; + if (error || !data?.result) return

데이터를 불러오지 못했습니다.

; + const allOrders = data.result.flatMap(user => user.orders); + return ( + + ); + } - case 'individual': - { - if (isLoading) return

로딩 중...

; - if (error || !data?.result) return

데이터를 불러오지 못했습니다.

; - const allOrders = data.result.flatMap(user => user.orders); - return ( - - ); - } default: return null; } }; + return
{renderList()}
; }; -export default ResponsesList; +export default ResponsesList; From d37f51b7152f1f55e54c8f2c0ec408b853ff176a Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:08:48 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refac:=20=EC=98=B5=EC=85=98=20=EC=98=81?= =?UTF-8?q?=EC=97=AD=EC=97=90=EC=84=9C=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=98=B5=EC=85=98=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=AA=A8=EB=91=90=20=EC=82=AD=EC=A0=9C=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticket/hooks/useTicketOptionDnD.ts | 26 +++++++++++++------ .../ticket/hooks/useTicketOptionHook.ts | 5 ++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/features/ticket/hooks/useTicketOptionDnD.ts b/src/features/ticket/hooks/useTicketOptionDnD.ts index fe27ee28..3f5e68af 100644 --- a/src/features/ticket/hooks/useTicketOptionDnD.ts +++ b/src/features/ticket/hooks/useTicketOptionDnD.ts @@ -1,9 +1,14 @@ import { DropResult } from '@hello-pangea/dnd'; -import { useAttachTicketOptionMutation, useDetachTicketOptionMutation } from './useTicketOptionHook'; +import { + useAttachTicketOptionMutation, + useDeleteTicketOptionMutation, + useDetachTicketOptionMutation, +} from './useTicketOptionHook'; export const useTicketOptionDnD = () => { const { mutate: attachOption } = useAttachTicketOptionMutation(); const { mutate: detachOption } = useDetachTicketOptionMutation(); + const { mutate: deleteOption } = useDeleteTicketOptionMutation(); const onDragEnd = (result: DropResult) => { const { source, destination } = result; @@ -24,13 +29,10 @@ export const useTicketOptionDnD = () => { if (source.droppableId === 'options' && destination.droppableId.startsWith('ticket-')) { const ticketId = parseInt(destination.droppableId.replace('ticket-', ''), 10); const ticketOptionId = parseInt(result.draggableId, 10); - + if (isNaN(ticketId) || isNaN(ticketOptionId)) { - console.error('Invalid ID parsing:', { ticketId, ticketOptionId }); - return; + attachOption({ ticketId, ticketOptionId }); } - - attachOption({ ticketId, ticketOptionId }); return; } @@ -40,12 +42,20 @@ export const useTicketOptionDnD = () => { const ticketOptionIdStr = result.draggableId.split('-').pop(); const ticketOptionId = ticketOptionIdStr ? parseInt(ticketOptionIdStr, 10) : undefined; - if (ticketId && ticketOptionId != undefined) { + if (ticketId && ticketOptionId !== undefined) { detachOption({ ticketId, ticketOptionId }); } return; } - }; + // 옵션 영역에서 자체 옵션 삭제 (모든 티켓에서 제거) + if (source.droppableId === 'options' && destination.droppableId === 'delete') { + const ticketOptionId = parseInt(result.draggableId, 10); + if (!isNaN(ticketOptionId)) { + deleteOption(ticketOptionId); + } + return; + } + }; return { onDragEnd }; }; diff --git a/src/features/ticket/hooks/useTicketOptionHook.ts b/src/features/ticket/hooks/useTicketOptionHook.ts index 23389189..579dc769 100644 --- a/src/features/ticket/hooks/useTicketOptionHook.ts +++ b/src/features/ticket/hooks/useTicketOptionHook.ts @@ -25,7 +25,6 @@ import { detachTicketOption, } from '../api/ticketOption'; - // 티켓 옵션 조회 export const useTicketOptions = (ticketId: number) => { return useQuery<{ isSuccess: boolean; result: TicketOptionResponse[] }>({ @@ -76,7 +75,7 @@ export const usePersonalTicketOptionAnswers = (ticketId: number | null) => { }); }; -// 티켓 옵션 생성 훅 +// 티켓 옵션 생성 훅 export const useCreateTicketOptionMutation = () => { const { id } = useParams(); const navigate = useNavigate(); @@ -125,7 +124,7 @@ export const useDeleteTicketOptionMutation = () => { // 티켓 옵션 목록과 상세 정보 쿼리 리패칭 queryClient.invalidateQueries({ queryKey: ['ticketOptions', id] }); queryClient.invalidateQueries({ queryKey: ['ticketOptionDetail', ticketOptionId] }); - console.log('티켓 옵션이 성공적으로 삭제되었습니다.'); + queryClient.invalidateQueries({ queryKey: ['attachedTicketOptions'] }); }, onError: () => { alert('티켓 옵션 삭제에 실패했습니다. 다시 시도해주세요.'); From cdc6b45ee2e873935a342caf557d669fbbb945bb Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:26:54 +0900 Subject: [PATCH 17/19] =?UTF-8?q?feat:=20=EC=98=B5=EC=85=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=A0=9C=ED=95=9C=EC=A1=B0=EA=B1=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/ticket/hooks/useTicketOptionHook.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/features/ticket/hooks/useTicketOptionHook.ts b/src/features/ticket/hooks/useTicketOptionHook.ts index 579dc769..d70b5143 100644 --- a/src/features/ticket/hooks/useTicketOptionHook.ts +++ b/src/features/ticket/hooks/useTicketOptionHook.ts @@ -126,8 +126,14 @@ export const useDeleteTicketOptionMutation = () => { queryClient.invalidateQueries({ queryKey: ['ticketOptionDetail', ticketOptionId] }); queryClient.invalidateQueries({ queryKey: ['attachedTicketOptions'] }); }, - onError: () => { - alert('티켓 옵션 삭제에 실패했습니다. 다시 시도해주세요.'); + onError: error => { + const errorCode = error.message; + + if (errorCode === '이미 응답된 티켓 옵션입니다.') { + alert('한 명 이상의 유저가 응답한 옵션은 삭제할 수 없습니다.'); + } else { + alert('티켓 옵션 삭제에 실패했습니다. 다시 시도해주세요.'); + } }, }); }; From 63513a71bcc88f46e752d5838be47c29d0feb4c0 Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:30:26 +0900 Subject: [PATCH 18/19] =?UTF-8?q?fix:=20=EB=82=A0=EC=A7=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=92=8B=20=EC=B4=88=EA=B8=B0=EA=B0=92=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/DatePicker.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/event/ui/DatePicker.tsx b/src/features/event/ui/DatePicker.tsx index 127544d7..8ebded2c 100644 --- a/src/features/event/ui/DatePicker.tsx +++ b/src/features/event/ui/DatePicker.tsx @@ -27,11 +27,11 @@ const EventDatePicker = ({ isLabel = false, }: DatePickerProps) => { const [startDate, setStartDate] = useState( - eventState?.startDate ? new Date(eventState.startDate) : initialStartDate ? new Date(initialStartDate) : null + 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) : null + eventState?.endDate ? new Date(eventState.endDate) : initialEndDate ? new Date(initialEndDate) : new Date() ); const [startTime, setStartTime] = useState('06:00'); const [endTime, setEndTime] = useState('23:00'); From 7065b44c6a688ce5701e4ddd0c489ac1c1d3398d Mon Sep 17 00:00:00 2001 From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com> Date: Sun, 1 Jun 2025 00:51:58 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refact:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9E=84=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/event/ui/EventList.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/features/event/ui/EventList.tsx b/src/features/event/ui/EventList.tsx index 10ba2b5c..7a965d3d 100644 --- a/src/features/event/ui/EventList.tsx +++ b/src/features/event/ui/EventList.tsx @@ -3,7 +3,6 @@ import { useInfiniteScroll } from '../../../shared/hooks/useInfiniteScroll'; import { getAllEventsInfinite, getCategoryEventsInfinite } from '../../../entities/event/api/event'; import EventCard from '../../../shared/ui/EventCard'; import { BaseEvent, CategoryType, TagType } from '../../../shared/types/baseEventType'; -import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { useNavigate } from 'react-router-dom'; interface EventListProps extends BaseEvent {