Skip to content

Commit b21c7d8

Browse files
author
jyn
committed
Merge branch 'dev'
2 parents 20917f7 + 2a8d8e5 commit b21c7d8

File tree

56 files changed

+1534
-724
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1534
-724
lines changed

src/app/activities/[id]/page-content.tsx

Lines changed: 16 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,27 @@
1-
'use client';
2-
3-
import { useQuery } from '@tanstack/react-query';
4-
import dynamic from 'next/dynamic';
5-
import { notFound } from 'next/navigation';
6-
import { useEffect } from 'react';
7-
1+
import CleanUp from '@/features/activityId/components/cleanup';
82
import Header from '@/features/activityId/components/header';
93
import AddressWithMap from '@/features/activityId/components/map/address-with-map';
4+
import ReservationModal from '@/features/activityId/components/reservation-modal';
5+
import ReviewsWrapper from '@/features/activityId/components/reviews-wrapper';
106
import SubImages from '@/features/activityId/components/sub-images';
11-
import { getActivityId } from '@/features/activityId/libs/api/getActivityId';
127
import { textStyle } from '@/features/activityId/libs/constants/variants';
13-
import { useCalendarStore } from '@/shared/components/calendar/libs/stores/useCalendarStore';
14-
import LoadingSpinner from '@/shared/components/loading-spinner/loading-spinner';
15-
import { useModalStore } from '@/shared/components/modal/libs/stores/useModalStore';
16-
import { cn } from '@/shared/libs/cn';
17-
const ReservationModal = dynamic(
18-
() => import('@/features/activityId/components/reservation-modal'),
19-
{
20-
ssr: false,
21-
loading: () => <LoadingSpinner />,
22-
},
23-
);
24-
const Reviews = dynamic(
25-
() => import('@/features/activityId/components/reviews'),
26-
{
27-
ssr: false,
28-
loading: () => <LoadingSpinner />,
29-
},
30-
);
31-
32-
const ActivityPageContent = ({ id }: { id: string }) => {
33-
const { closeModal } = useModalStore();
34-
const { setYear, setMonth, resetSelectedDate, resetDate } =
35-
useCalendarStore();
36-
37-
const { data, isLoading, isError } = useQuery({
38-
queryKey: ['activityId', id],
39-
queryFn: () => getActivityId(id),
40-
staleTime: 1000 * 60 * 30,
41-
});
42-
43-
// notfound 페이지로 에러처리
44-
if (isError) {
45-
notFound();
46-
}
47-
48-
// 언마운트 시 클린업
49-
useEffect(() => {
50-
return () => {
51-
// 모달 닫기
52-
closeModal();
53-
// 캘린더 리셋
54-
const today = new Date();
55-
setYear(today.getFullYear());
56-
setMonth(today.getMonth());
57-
resetSelectedDate();
58-
resetDate();
59-
};
60-
}, [closeModal, setMonth, setYear, resetDate, resetSelectedDate]);
61-
62-
if (isLoading || !data) return <LoadingSpinner />;
63-
8+
import { ActivityInfo } from '@/features/activityId/libs/types/activityInfo';
9+
10+
const ActivityPageContent = ({
11+
id,
12+
data,
13+
}: {
14+
id: string;
15+
data: ActivityInfo;
16+
}) => {
6417
return (
6518
<div className="mx-auto w-full justify-center p-[2.4rem] md:px-[4rem] lg:max-w-[120rem] lg:pt-[1.6rem]">
6619
{/* 체험 이미지 */}
6720
<SubImages images={data?.subImages} />
68-
<div className={cn('lg:grid lg:grid-cols-[1fr_41.9rem] lg:gap-[4rem]')}>
21+
<div className={'lg:grid lg:grid-cols-[1fr_41.9rem] lg:gap-[4rem]'}>
6922
<div>
7023
{/* 헤더 영역(분류, 제목, 별점, 주소, 드롭다운) */}
71-
<Header data={data} />
24+
<Header data={data} id={id} />
7225
{/* 체험 설명 */}
7326
<hr className="mt-[2rem] mb-[2rem]" />
7427
<section>
@@ -80,11 +33,12 @@ const ActivityPageContent = ({ id }: { id: string }) => {
8033
<AddressWithMap address={data?.address} />
8134
{/* 체험 후기 */}
8235
<hr className="mb-[2rem] lg:mb-[4rem]" />
83-
<Reviews activityId={Number(id)} />
36+
<ReviewsWrapper activityId={Number(id)} />
8437
</div>
8538
{/* 체험 예약 캘린더 */}
8639
<ReservationModal price={data?.price} activityId={Number(id)} />
8740
</div>
41+
<CleanUp />
8842
</div>
8943
);
9044
};

src/app/activities/[id]/page.tsx

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,39 @@ import {
33
HydrationBoundary,
44
QueryClient,
55
} from '@tanstack/react-query';
6+
import { notFound } from 'next/navigation';
67

78
import ActivityPageContent from '@/app/activities/[id]/page-content';
89
import { getActivityId } from '@/features/activityId/libs/api/getActivityId';
10+
import { ActivityInfo } from '@/features/activityId/libs/types/activityInfo';
911

1012
const Page = async ({ params }: { params: Promise<{ id: string }> }) => {
1113
const { id } = await params;
1214
const queryClient = new QueryClient();
13-
await queryClient.prefetchQuery({
14-
queryKey: ['activityId', id],
15-
queryFn: () => getActivityId(id),
16-
});
15+
let data: ActivityInfo | undefined;
16+
17+
try {
18+
data = queryClient.getQueryData(['activityId', id]);
19+
if (!data) {
20+
data = await queryClient.fetchQuery({
21+
queryKey: ['activityId', id],
22+
queryFn: () => getActivityId(id),
23+
staleTime: 1000 * 60 * 30,
24+
retry: 1,
25+
});
26+
}
27+
} catch (error) {
28+
if (error) notFound();
29+
}
1730

1831
return (
19-
<HydrationBoundary state={dehydrate(queryClient)}>
20-
<ActivityPageContent id={id} />
21-
</HydrationBoundary>
32+
<>
33+
{data && (
34+
<HydrationBoundary state={dehydrate(queryClient)}>
35+
<ActivityPageContent id={id} data={data} />
36+
</HydrationBoundary>
37+
)}
38+
</>
2239
);
2340
};
2441

src/app/my/my-activities/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import Link from 'next/link';
44

55
import { DeleteConfirmModal } from '@/features/my/my-activities/components/delete-confirm-modal';
66
import { MyActivitiesList } from '@/features/my/my-activities/components/my-activities-list';
7+
import { useModalStore } from '@/shared/components';
78

89
const MyActivityPage = () => {
10+
const { modalName } = useModalStore();
911
return (
1012
<>
1113
{/* 페이지 헤더 */}
@@ -35,7 +37,7 @@ const MyActivityPage = () => {
3537
{/* 내 체험 리스트 */}
3638
<MyActivitiesList />
3739
{/* 삭제 확인 모달 */}
38-
<DeleteConfirmModal />
40+
{modalName === 'delete' && <DeleteConfirmModal />}
3941
</>
4042
);
4143
};

src/app/my/reservation/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import BookingList from '@/features/booking-detail/components/booking-list';
33
const ReservationPage = () => {
44
return (
55
<main>
6-
<div className="mb-[2.4rem]">
6+
<div className="mb-[2.4rem] py-[1rem]">
77
<p className="text-[1.8rem] font-bold text-gray-950">예약 내역</p>
88
<span className="text-[1.4rem] font-medium text-gray-500">
99
예약내역 변경 및 취소할 수 있습니다.

0 commit comments

Comments
 (0)