Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
011f955
chore: tastack query devtool 설치
Yejiin21 May 14, 2025
52965fe
remove: 사용하지 않은 타입 파일 삭제
Yejiin21 May 14, 2025
12bc2c9
refact: hook 폴더로 이동 및 any 타입 구체적으로 명시
Yejiin21 May 14, 2025
00f93f4
rename: entities 파일 API 관련 파일 명시적으로 변경
Yejiin21 May 14, 2025
d0394bc
rename: 이벤트와 호스트 대시보드 각 기능에 맞게 파일 분리
Yejiin21 May 14, 2025
9200b37
rename: store 관련 파일 폴더로 묶기
Yejiin21 May 14, 2025
f0ee3aa
rename: 파일명 명시적으로 수정
Yejiin21 May 14, 2025
76a863c
remove: 사용하지 않는 파일 삭제
Yejiin21 May 14, 2025
5d25ede
rename: 파일 import 재설정
Yejiin21 May 14, 2025
50f775a
rename: features 폴더에 event 도메인끼리 묶기
Yejiin21 May 14, 2025
3776163
rename: 티켓 관련 기능에 맞는 파일 정리
Yejiin21 May 14, 2025
db328ee
rename: 이벤트 페이지 관련 파일 정리
Yejiin21 May 14, 2025
d32a98d
rename: 대시보드 위젯 ui 폴더 도메인별로 묶어 정리
Yejiin21 May 14, 2025
bda63a3
fix: 파일 import 에러 해결
Yejiin21 May 14, 2025
48ab74c
fix: 파일 import 에러 해결
Yejiin21 May 14, 2025
020e14e
rename: 컴포넌트명 오타 수정
Yejiin21 May 14, 2025
9670f0d
refact: 사용하지 않는 변수 제거
Yejiin21 May 14, 2025
4b4a3c2
refac: useEffect 의존성 수정
Yejiin21 May 14, 2025
2dfe627
refac: 컴포넌트명 수정
Yejiin21 May 14, 2025
37cf104
refac: 중복된 이메일 필드 삭제
Yejiin21 May 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"@hello-pangea/dnd": "^18.0.1",
"@hookform/resolvers": "^4.1.3",
"@tanstack/react-query": "^5.61.3",
"@tanstack/react-query-devtools": "^5.75.7",
"@tanstack/react-query-devtools": "^5.76.1",
"autoprefixer": "^10.4.20",
"axios": "^1.8.1",
"date-fns": "^4.1.0",
Expand Down
4 changes: 2 additions & 2 deletions src/app/routes/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Layout from '../Layout';
import AgreementPage from '../../pages/join/AgreementPage';
import InfoInputPage from '../../pages/join/InfoInputPage';
import MainPage from '../../pages/home/ui/MainPage';
import FunnelPage from '../../pages/event-manage/ui/FunnelPage';
import FunnelPage from '../../pages/event/ui/create-event/FunnelPage';
import AllEventsPage from '../../pages/event/ui/AllEventsPage';
import MyTicketPage from '../../pages/menu/ui/MyTicketPage';
import SearchPage from '../../pages/search/ui/SearchPage';
Expand Down Expand Up @@ -97,4 +97,4 @@ const router = createBrowserRouter(
}))
);

export default router;
export default router;
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { axiosClient } from '../../../shared/types/api/http-client';
import { EventDetailRequest } from '../model/event';
import { EventDetailRequest } from '../model/eventDetail';
import { CategoryType, TagType } from '../../../shared/types/baseEventType';
import { ApiResponse } from '../../../shared/types/api/apiResponse';
import { EventItem, PaginationParams } from '../model/event';
import { EventItem, PaginationParams } from '../model/eventDetail';

export const eventDetail = async (dto: EventDetailRequest) => {
const response = await axiosClient.get(`/events/${dto.eventId}`, {
Expand All @@ -11,22 +11,6 @@ export const eventDetail = async (dto: EventDetailRequest) => {
return response.data;
};

// 이벤트 검색 (기본 정보)
export const searchEvents = async (
keyword: string,
{ page, size }: PaginationParams
): Promise<ApiResponse<EventItem[]>> => {
const params = new URLSearchParams();

params.append('keyword', keyword);
params.append('page', page.toString());
params.append('size', size.toString());

const response = await axiosClient.get<ApiResponse<EventItem[]>>(`/events/search?${params.toString()}`);

return response.data;
};

// 전체 이벤트 목록 조회 (무한 스크롤)
export const getAllEventsInfinite = async ({
page,
Expand Down
2 changes: 1 addition & 1 deletion src/entities/event/hook/useEventHook.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useQuery } from '@tanstack/react-query';
import { eventDetail } from '../api/event';
import { eventDetail } from '../api/eventDetail';
import { useParams } from 'react-router-dom';
import { useUserInfo } from '../../../features/join/hooks/useUserHook';

Expand Down
4 changes: 2 additions & 2 deletions src/entities/event/hook/useEventListHook.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { EventList } from '../../../features/event-manage/event-list/model/eventList';
import { EventList } from '../../../features/event/event-list/model/eventList';
import { useInfiniteScroll } from '../../../shared/hooks/useInfiniteScroll';
import { getAllEventsInfinite } from '../api/event';
import { getAllEventsInfinite } from '../api/eventDetail';

const useEventList = () => {
const { data, fetchNextPage, hasNextPage, isFetching } = useInfiniteScroll<EventList>({
Expand Down
80 changes: 80 additions & 0 deletions src/features/bookmark/hook/useBookmarkHook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { BookmarkResponse } from '../model/bookmarkInformation';
import { createBookmark, deleteBookmark, readBookmark } from '../api/bookmark';
import { EventDetailResponse } from '../../../entities/event/model/eventDetail';

export const useBookmarks = () => {
return useQuery<BookmarkResponse[]>({
queryKey: ['bookmarks'],
queryFn: readBookmark,
});
};

export const useCreateBookmark = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: createBookmark,
// Optimistic
onMutate: async (eventId: number) => {
await queryClient.cancelQueries({ queryKey: ['eventDetail', eventId] });
const previous = queryClient.getQueryData(['eventDetail', eventId]);

queryClient.setQueryData<EventDetailResponse>(['eventDetail', eventId], old =>
old
? {
...old,
result: {
...old.result,
bookmarked: true,
},
}
: old
);

return { previous };
},
onError: (_err, eventId, context) => {
if (context?.previous) {
queryClient.setQueryData(['eventDetail', eventId], context.previous);
alert('좋아요 등록에 실패했습니다. 잠시후 다시 시도해 주세요.');
}
},
onSettled: (_data, _error, eventId) => {
queryClient.invalidateQueries({ queryKey: ['eventDetail', eventId] });
},
});
};
export const useDeleteBookmark = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (params: { eventId: number; bookmarkId: number }) => deleteBookmark(params.eventId, params.bookmarkId),
// Optimistic
onMutate: async ({ eventId }) => {
await queryClient.cancelQueries({ queryKey: ['eventDetail', eventId] });
const previous = queryClient.getQueryData(['eventDetail', eventId]);

queryClient.setQueryData<EventDetailResponse>(['eventDetail', eventId], old =>
old
? {
...old,
result: {
...old.result,
bookmarked: false,
},
}
: old
);

return { previous };
},
onError: (_err, { eventId }, context) => {
if (context?.previous) {
queryClient.setQueryData(['eventDetail', eventId], context.previous);
alert('좋아요 삭제에 실패했습니다. 잠시후 다시 시도해 주세요.');
}
},
onSettled: (_data, _error, { eventId }) => {
queryClient.invalidateQueries({ queryKey: ['eventDetail', eventId] });
},
});
};
66 changes: 0 additions & 66 deletions src/features/bookmark/model/useBookmarkHook.ts

This file was deleted.

9 changes: 0 additions & 9 deletions src/features/dashboard/api/event.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
import { axiosClient } from '../../../shared/types/api/http-client';
import { UpdateEventRequest } from '../model/event';

export const getHostDashboard = async (eventId: number) => {
const response = await axiosClient.get('/host-channels/dashboard', {
params: {
eventId: eventId,
},
});
return response.data.result;
};

export const updateEventInfo = async (eventId: number, dto: Partial<UpdateEventRequest>) => {
const response = await axiosClient.put(`/events/${eventId}`, dto);
return response.data;
Expand Down
10 changes: 10 additions & 0 deletions src/features/dashboard/api/hostDashboard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { axiosClient } from '../../../shared/types/api/http-client';

export const getHostDashboard = async (eventId: number) => {
const response = await axiosClient.get('/host-channels/dashboard', {
params: {
eventId: eventId,
},
});
return response.data.result;
};
53 changes: 24 additions & 29 deletions src/features/dashboard/api/mail.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,39 @@
import { axiosClient } from '../../../shared/types/api/http-client';
import { EmailRequest, ReadEmailResponse } from '../model/emailInformation';
import { EmailRequest, ReadEmailResponse } from '../model/email';

// 예약 메일 조회
export const readEmail = async (eventId: number, status: 'PENDING' | 'SENT'): Promise<ReadEmailResponse[]> => {
const response = await axiosClient.get<{ result: ReadEmailResponse[] }>(
`/reservation-emails`,
{
params: {
eventId,
status,
},
}
);
return response.data.result;
}
const response = await axiosClient.get<{ result: ReadEmailResponse[] }>(`/reservation-emails`, {
params: {
eventId,
status,
},
});
return response.data.result;
};

// 전체/티켓별 구매자 이메일 조회
export const readPurchaserEmails = async (eventId: number, ticketId?: number): Promise<{email: string[]}> => {
const response = await axiosClient.get('/orders/purchaser-emails',
{
params: {
eventId,
...(ticketId !== undefined && { ticketId }),
},
}
);
return response.data.result;
export const readPurchaserEmails = async (eventId: number, ticketId?: number): Promise<{ email: string[] }> => {
const response = await axiosClient.get('/orders/purchaser-emails', {
params: {
eventId,
...(ticketId !== undefined && { ticketId }),
},
});
return response.data.result;
};

export const sendEmail = async (data: EmailRequest) => {
const response = await axiosClient.post('/reservation-emails', data);
return response.data.result;
const response = await axiosClient.post('/reservation-emails', data);
return response.data.result;
};

export const editEmail = async (reservationEmailId: number, data: EmailRequest) => {
const response = await axiosClient.put(`/reservation-emails/${reservationEmailId}`, data);
return response.data.result;
const response = await axiosClient.put(`/reservation-emails/${reservationEmailId}`, data);
return response.data.result;
};

export const deleteEmail = async (reservationEmailId: number) => {
const response = await axiosClient.delete(`/reservation-emails/${reservationEmailId}`);
return response.data.result;
}
const response = await axiosClient.delete(`/reservation-emails/${reservationEmailId}`);
return response.data.result;
};
Loading