Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
f50abea
🎨 [#226] Style: 1인당 금액을 정보 섹션으로 분리
HarrySeop Aug 3, 2025
37047d7
🎨 [#226] Style: 설명 섹션 UI 통일
HarrySeop Aug 3, 2025
ed90283
🎨 [#226] Style: 정보, 예약 섹션 너비 줄이기
HarrySeop Aug 3, 2025
85a9dde
🎨 [#226] Style: PC 예약 섹션 UI 통일
HarrySeop Aug 3, 2025
038101b
🎨 [#226] Style: 시간 선택 디자인 수정
HarrySeop Aug 3, 2025
5d14453
🎨 [#226] Style: 시간 영역 길어지면 스크롤 생성
HarrySeop Aug 3, 2025
1054913
🎨 [#226] Style: 인원 선택 디자인 수정 및 UI 통일
HarrySeop Aug 3, 2025
0fc5c58
🎨 [#226] Style: 금액 길어져도 줄바꿈 안되도록 변경
HarrySeop Aug 3, 2025
43b893a
🎨 [#226] Style: 드롭다운 위치 변경
HarrySeop Aug 3, 2025
a5fcf62
🎨 [#226] Style: 바텀바 수정 및 UI 통일
HarrySeop Aug 3, 2025
93ab7af
🎨 [#226] Style: 태블릿 바텀시트 수정
HarrySeop Aug 3, 2025
2529589
🎨 [#226] Style: 모바일 바텀시트 수정
HarrySeop Aug 3, 2025
4dbe1d3
🎨 [#226] Style: 구분선 디자인 통일
HarrySeop Aug 4, 2025
de741cd
🎨 [#226] Style: 이미지 부분 테두리 색상 변경
HarrySeop Aug 4, 2025
5c81533
🎨 [#226] Style: 설명 영역 디자인 통일
HarrySeop Aug 4, 2025
7c58038
🎨 [#226] Style: 지도 디자인 수정
HarrySeop Aug 4, 2025
7784acf
🎨 [#226] Style: 리뷰 UI 통일
HarrySeop Aug 4, 2025
36cb25a
🎨 [#226] Style: 예약 상세페이지 스켈레톤 UI 반영
HarrySeop Aug 4, 2025
cc6b259
🎨 [#226] Style: 후기 없는 부분 NoResult 컴포넌트로 수정
HarrySeop Aug 4, 2025
bb13291
🎨 [#225] Style: 리뷰섹션에서 불필요한 Loading 제거
HarrySeop Aug 4, 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
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ interface ActivitiesDescriptionProps {
export default function ActivitiesDescription({ description, className }: ActivitiesDescriptionProps) {
return (
<section className={twMerge(`flex h-fit w-full flex-col justify-start gap-8`, className)}>
<div className='text-2lg font-bold text-gray-950'>체험 설명</div>
<p className='text-lg text-gray-950'>{description}</p>
<div className='section-text'>체험 설명</div>
<p className='body-text'>{description}</p>
</section>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ interface ActivitiesInformationProps {
className?: string;
id?: string;
isAuthor: boolean;
price: number;
}

/**
Expand All @@ -28,6 +29,7 @@ export default function ActivitiesInformation({
address,
className,
isAuthor,
price,
}: ActivitiesInformationProps) {
const navigate = useNavigate();
const { toast } = useToast();
Expand Down Expand Up @@ -60,36 +62,46 @@ export default function ActivitiesInformation({

return (
<>
<section className={twMerge('flex h-fit w-full flex-col items-start gap-8', className)}>
<section
className={twMerge(
'flex h-fit w-full flex-col items-start gap-8 rounded-xl border border-gray-50 p-20',
className,
)}
>
<div className='flex w-full items-center justify-between'>
<p className='text-md text-gray-950'>{category}</p>
<p className='caption-text'>{category}</p>
{isAuthor && (
<Dropdown.Root>
<Dropdown.Trigger className='flex size-24 items-center justify-center' />
<Dropdown.Menu>
<Dropdown.Menu className='-left-95'>
<Dropdown.Item onClick={() => navigate(`/experiences/create/${id}`)}>수정하기</Dropdown.Item>
<Dropdown.Item onClick={() => setIsDeleteOpen(true)}>삭제하기</Dropdown.Item>
</Dropdown.Menu>
</Dropdown.Root>
)}
</div>
<p className='text-2xl font-bold'>{title}</p>
<div className='mt-9 flex items-center gap-6 text-base text-gray-700'>
<p className='title-text'>{title}</p>
<div className='body-text mt-9 flex items-center gap-6'>
<StarIcon filled />
<span>
{rating.toFixed(1)} ({reviewCount})
</span>
</div>
<div className='mt-2 ml-2 flex items-center gap-4 text-base text-gray-700'>
<div className='body-text mt-2 ml-2 flex items-center gap-4'>
<LocationIcon />
<span>{address}</span>
</div>
<div className='body-text mt-2 ml-2 flex items-center gap-4'>
<p className='body-text'>
<span className='font-bold text-gray-950'>₩ {price.toLocaleString()}</span> / 인
</p>
</div>
</section>
<Modal.Root open={isDeleteOpen} onClose={() => setIsDeleteOpen(false)}>
<Modal.Content className='flex max-w-300 flex-col items-center gap-6 text-center md:max-w-350 lg:max-w-400'>
<div className='flex flex-col items-center gap-6 text-center'>
<WarningLogo className='md:size-110 lg:size-150' size={88} />
<p className='text-2lg font-bold'>체험을 삭제하시겠습니까?</p>
<p className='section-text'>체험을 삭제하시겠습니까?</p>
</div>
<Modal.Actions>
<Modal.CancelButton>아니요</Modal.CancelButton>
Expand Down
6 changes: 3 additions & 3 deletions apps/what-today/src/components/activities/ActivitiesMap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ interface ActivitiesMapProps {
*/
export default function ActivitiesMap({ address, className }: ActivitiesMapProps) {
return (
<section className={twMerge(`flex h-511 w-full flex-col justify-start text-xl font-bold`, className)}>
<div className='text-2lg mb-8 text-left font-bold'>오시는 길</div>
<div className='text-md mb-8 text-left font-semibold text-gray-950'>{address}</div>
<section className={twMerge(`section-text flex h-511 w-full flex-col justify-start gap-8`, className)}>
<div>오시는 길</div>
<div className='body-text'>{address}</div>
<div className='h-full w-full overflow-hidden rounded-3xl'>
<KakaoMap address={address} />
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ export default function ActivitiesReview({ review }: ActivitiesReviewProps) {
});

return (
<div className='mb-20 rounded-3xl bg-white px-20 py-20 shadow-[0_2px_12px_rgba(0,0,0,0.1)]'>
<div className='mb-20 rounded-xl border border-gray-50 px-20 py-20'>
<div className='mb-4 flex items-center gap-8'>
<div className='text-lg font-bold text-gray-950'>{user.nickname}</div>
<div className='text-md text-[#A4A1AA]'>{formattedDate}</div>
<div className='body-text font-bold'>{user.nickname}</div>
<div className='caption-text text-gray-400'>{formattedDate}</div>
</div>
<div className='mb-12'>
<RatingStars rating={rating} />
</div>
<p className='text-lg whitespace-pre-wrap text-gray-950'>{content}</p>
<p className='body-text whitespace-pre-wrap'>{content}</p>
</div>
);
}
Expand Down
16 changes: 8 additions & 8 deletions apps/what-today/src/components/activities/ActivityImages.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
return (
<section className={`grid h-400 grid-cols-${subImageCount === 0 ? '1' : '2'} rounded-xl'} gap-8`}>
{/* 왼쪽 메인이미지 */}
<div className='h-full w-full overflow-hidden rounded-xl border border-gray-200'>
<div className='h-full w-full overflow-hidden rounded-xl border border-gray-50'>
<img alt='배너 이미지' className='h-full w-full object-cover' src={bannerImageUrl} onError={handleImageError} />
</div>

Expand All @@ -21,7 +21,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
<div className='h-full w-full'>
{/* 1개일 때: 전체 영역 사용 */}
{subImageCount === 1 && (
<div className='h-full w-full overflow-hidden rounded-xl border border-gray-200'>
<div className='h-full w-full overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지'
className='h-full w-full object-cover object-center'
Expand All @@ -35,15 +35,15 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
{subImageCount === 2 && (
<div className='h-full w-full'>
<div className='grid h-400 w-full grid-rows-[196px_196px] gap-8'>
<div className='overflow-hidden rounded-xl border border-gray-200'>
<div className='overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지 1'
className='h-full w-full object-cover object-center'
src={subImages[0].imageUrl}
onError={handleImageError}
/>
</div>
<div className='overflow-hidden rounded-xl border border-gray-200'>
<div className='overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지 2'
className='h-full w-full object-cover object-center'
Expand All @@ -60,7 +60,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
<div className='h-full w-full'>
<div className='grid h-400 w-full grid-cols-2 grid-rows-[196px_196px] gap-8'>
{/* 이미지 1 */}
<div className='overflow-hidden rounded-xl border border-gray-200'>
<div className='overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지 1'
className='h-full w-full object-cover object-center'
Expand All @@ -70,7 +70,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
</div>

{/* 이미지 2 */}
<div className='overflow-hidden rounded-xl border border-gray-200'>
<div className='overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지 2'
className='h-full w-full object-cover object-center'
Expand All @@ -80,7 +80,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
</div>

{/* 이미지 3 - col-span-2 */}
<div className='col-span-2 overflow-hidden rounded-xl border border-gray-200'>
<div className='col-span-2 overflow-hidden rounded-xl border border-gray-50'>
<img
alt='서브 이미지 3'
className='h-full w-full object-cover object-center'
Expand All @@ -97,7 +97,7 @@ export default function ActivityImages({ bannerImageUrl, subImages }: ActivityIm
<div className='h-full w-full'>
<div className='grid h-400 w-full grid-cols-2 grid-rows-[196px_196px] gap-8'>
{subImages.slice(0, 4).map((img, index) => (
<div key={img.id} className='overflow-hidden rounded-xl border border-gray-200'>
<div key={img.id} className='overflow-hidden rounded-xl border border-gray-50'>
<img
alt={`서브 이미지 ${index + 1}`}
className='h-full w-full object-cover object-center'
Expand Down
2 changes: 1 addition & 1 deletion apps/what-today/src/components/activities/Divider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ interface DividerProps {
}

export default function Divider({ className }: DividerProps) {
return <div className={twMerge('rounded-3xl border-t border-gray-100', className)} />;
return <div className={twMerge('rounded-3xl border-t border-gray-50', className)} />;
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,19 @@ export default function ReservationBottomBar({
else buttonText = '예약하기';

return (
<div className='fixed bottom-0 left-0 z-50 w-full border-t border-[#E6E6E6] bg-white px-48 pt-18 pb-18 shadow-[0_-2px_10px_rgba(0,0,0,0.05)]'>
<div className='fixed bottom-0 left-0 z-50 w-full border-t border-[#E6E6E6] bg-white px-20 pt-18 pb-18 shadow-[0_-2px_10px_rgba(0,0,0,0.05)]'>
<div className='mb-12 flex items-center justify-between'>
<div>
<p className='text-2lg font-bold'>
<p className='body-text font-bold'>
₩ {totalPrice.toLocaleString()}
<span className='text-lg font-normal'> / {reservation?.headCount ?? 1}명</span>
<span className='font-normal'> / {reservation?.headCount ?? 1}명</span>
</p>
{reservation && <p className='mt-4 text-sm text-gray-500'>{formattedDateTime}</p>}
{reservation && <p className='caption-text mt-4 text-gray-400'>{formattedDateTime}</p>}
</div>

<Button
className='text-primary-500 h-fit w-fit p-0 text-lg font-bold underline'
className='text-primary-500 body-text font-bold underline'
size='none'
variant='none'
onClick={onSelectDate}
>
Expand Down
37 changes: 16 additions & 21 deletions apps/what-today/src/components/activities/ReviewSection.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Button, StarIcon } from '@what-today/design-system';
import { NoResult, StarIcon } from '@what-today/design-system';

import { ReviewCardSkeleton } from '@/components/skeletons/activities';
import { useActivityReviews } from '@/hooks/activityDetail';
import useIntersectionObserver from '@/hooks/useIntersectionObserver';
import type { ActivityReview } from '@/schemas/activityReview';
Expand Down Expand Up @@ -38,7 +39,7 @@ export default function ReviewSection({ activityId }: ReviewSectionProps) {
return (
<section className='w-full'>
<div className='mb-8 flex gap-8'>
<h2 className='text-2lg font-bold text-gray-900'>체험 후기</h2>
<h2 className='section-text'>체험 후기</h2>
</div>
<p className='py-8 text-center'>후기를 불러오는 중...</p>
</section>
Expand All @@ -49,7 +50,7 @@ export default function ReviewSection({ activityId }: ReviewSectionProps) {
return (
<section className='w-full'>
<div className='mb-8 flex gap-8'>
<h2 className='text-2lg font-bold text-gray-900'>체험 후기</h2>
<h2 className='section-text'>체험 후기</h2>
</div>
<p className='py-8 text-center text-red-500'>
후기를 불러오는 중 오류가 발생했습니다: {error instanceof Error ? error.message : '알 수 없는 오류'}
Expand All @@ -60,16 +61,16 @@ export default function ReviewSection({ activityId }: ReviewSectionProps) {

return (
<section className='w-full'>
<div className='mb-8 flex gap-8'>
<h2 className='text-2lg font-bold text-gray-900'>체험 후기</h2>
<span className='text-lg font-bold text-[#79747E]'>{totalCount.toLocaleString()}개</span>
<div className='mb-8 flex items-center gap-8'>
<h2 className='section-text'>체험 후기</h2>
<span className='body-text text-gray-400'>{totalCount.toLocaleString()}개</span>
</div>

{totalCount > 0 && (
<div className='mb-34 flex flex-col items-center'>
<div className='text-3xl font-bold text-gray-950'>{averageRating.toFixed(1)}</div>
<div className='text-lg font-bold text-gray-950'>{getSatisfactionText(averageRating)}</div>
<div className='text-md flex items-center gap-2 text-[#79747E]'>
<div className='title-text'>{averageRating.toFixed(1)}</div>
<div className='section-text'>{getSatisfactionText(averageRating)}</div>
<div className='body-text flex items-center gap-4 text-gray-400'>
<StarIcon filled className='size-16' />
<span>{totalCount.toLocaleString()}개 후기</span>
</div>
Expand All @@ -80,25 +81,19 @@ export default function ReviewSection({ activityId }: ReviewSectionProps) {
{allReviews.length > 0 ? (
allReviews.map((review: ActivityReview) => <ActivitiesReview key={review.id} review={review} />)
) : (
<p className='py-8 text-center text-gray-500'>아직 등록된 후기가 없습니다.</p>
<div className='mt-20 flex items-center justify-center'>
<NoResult dataName='후기가' />
</div>
)}
</div>

{/* 무한스크롤 트리거 */}
<div ref={observerRef} className='h-4' />

{/* 더보기 버튼 (옵션) */}
{hasNextPage && (
<div className='flex justify-center'>
<Button className='px-6 py-2' disabled={isFetchingNextPage} variant='outline' onClick={() => fetchNextPage()}>
{isFetchingNextPage ? '로딩 중...' : '더 많은 후기 보기'}
</Button>
</div>
)}

{isFetchingNextPage && (
<div className='py-4 text-center'>
<p className='text-gray-500'>후기를 더 불러오는 중...</p>
<div className='flex flex-col gap-16'>
<ReviewCardSkeleton />
<ReviewCardSkeleton />
</div>
)}
</section>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ interface HeadCountSelectorProps {
export default function HeadCountSelector({ headCount, onIncrease, onDecrease }: HeadCountSelectorProps) {
return (
<div className='flex items-center justify-between'>
<p className='text-lg font-bold text-gray-950'>참여 인원 수</p>
<p className='section-text'>참여 인원 수</p>

<div className='flex items-center gap-23 rounded-3xl border border-[#EEEEEE] px-15'>
<Button className='h-fit w-fit p-0' size='sm' variant='none' onClick={onDecrease}>
<MinusIcon className='size-20' color='#4B4B4B' />
<div className='flex items-center gap-23 rounded-3xl border border-gray-50 px-15'>
<Button size='none' variant='none' onClick={onDecrease}>
<MinusIcon className='size-14' color='var(--color-gray-600)' />
</Button>
<span className='p-8 text-center text-lg font-bold text-gray-950'>{headCount}</span>
<Button className='h-fit w-fit p-0' size='sm' variant='none' onClick={onIncrease}>
<PlusIcon className='size-20' color='#4B4B4B' />
<span className='body-text p-8 text-center font-bold'>{headCount}</span>
<Button size='none' variant='none' onClick={onIncrease}>
<PlusIcon className='size-14' color='var(--color-gray-600)' />
</Button>
</div>
</div>
Expand Down
Loading