Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
72f60e4
refactor: ButtonIcon 서브컴포넌트 제거 ->prop으로 관리할수 있게 변경
seongihun Dec 31, 2025
4935d50
refactor: ButtonIcon 서브컴포넌트 제거 ->prop으로 관리할수 있게 변경
seongihun Dec 31, 2025
453d635
refactor: ref가 prop으로 자동전달 componentPropsWithRef 사용
seongihun Dec 31, 2025
a22c112
🎨 Style: reservation-view SVG 아이콘 추가
Greensod-96 Jan 1, 2026
9543318
🎨 Style: MyInfo 페이지 p-6 패딩 제거
Greensod-96 Jan 1, 2026
e7b1e7f
✨ Feat: ReservationView 구현
Greensod-96 Jan 1, 2026
629c8b3
Merge branch 'develop' into feat/reservation-view
Greensod-96 Jan 1, 2026
93ce5f6
♻️ Refactor: InputField 공통 컴포넌트 구조 정리 및 스타일 통합
Greensod-96 Jan 1, 2026
2bb347b
♻️ Refactor: PasswordInput 컴포넌트 구조 단순화 및 스타일 통합
Greensod-96 Jan 1, 2026
cd9be8a
♻️ Refactor: SearchInput 컴포넌트 구조 단순화 및 스타일 통합
Greensod-96 Jan 1, 2026
55b14fd
♻️ Refactor: Input 컴포넌트 스타일 통합 및 기본 UI 개선
Greensod-96 Jan 1, 2026
d8608da
♻️ Refactor: InputField 구조 단순화 및 children 기반 렌더링 개선
Greensod-96 Jan 1, 2026
19a6003
♻️ Refactor: PasswordInput 스타일 단순화 및 Input 책임 분리
Greensod-96 Jan 1, 2026
2acbb69
♻️ Refactor: SearchInput 스타일 단순화 및 공통 Input 활용
Greensod-96 Jan 1, 2026
1794f38
♻️ Refactor: Input 컴포넌트에 forwardRef 적용
Greensod-96 Jan 1, 2026
4d9aa6a
♻️ Refactor: InputField에 label 연결 및 접근성 개선
Greensod-96 Jan 1, 2026
6ad6326
사이드바 반응형 구현
seongihun Jan 2, 2026
18eebb0
♻️ Refactor: Input 컴포넌트에서 forwardRef 제거
Greensod-96 Jan 2, 2026
35e9641
♻️ Refactor: InputField에서 inputProps 제거 및 props 구조 단순화
Greensod-96 Jan 2, 2026
1699df1
♻️ Refactor: PasswordInput 컴포넌트 구조 개선 및 접근성 보완
Greensod-96 Jan 2, 2026
7ea8180
♻️ Refactor: SearchInput props 구조 개선
Greensod-96 Jan 2, 2026
5a66ca6
🎨 Style: PasswordInput 아이콘 이미지 alt 속성 제거
Greensod-96 Jan 3, 2026
d8dbaf6
Merge pull request #20 from 5team-gn/feat/reservation-view
Greensod-96 Jan 3, 2026
a18a794
Merge pull request #21 from 5team-gn/refactor/input-components
Greensod-96 Jan 3, 2026
2f1e732
refactor: ButtonIcon 서브컴포넌트 제거 ->prop으로 관리할수 있게 변경
seongihun Dec 31, 2025
b94af9f
refactor: ButtonIcon 서브컴포넌트 제거 ->prop으로 관리할수 있게 변경
seongihun Dec 31, 2025
6950cc1
refactor: ref가 prop으로 자동전달 componentPropsWithRef 사용
seongihun Dec 31, 2025
57bf37c
refactor: 리뷰반영수정
seongihun Jan 3, 2026
38cfe5d
Merge branch 'feat/Button' of https://github.com/5team-gn/GlobalNomad…
seongihun Jan 3, 2026
32a410d
Merge pull request #19 from 5team-gn/feat/Button
seongihun Jan 3, 2026
e5e9470
사용법 마크다운 문서로 정리
seongihun Jan 3, 2026
f51596a
Merge pull request #23 from 5team-gn/feat/Button
seongihun Jan 3, 2026
a220ced
page.tsx 수정
seongihun Jan 3, 2026
498e8a5
재수정
seongihun Jan 3, 2026
5b6167f
사이드바 반응형 구현
seongihun Jan 2, 2026
fac05b3
리뷰반영 주석 제거
seongihun Jan 3, 2026
48f7cc3
리뷰반영 수정
seongihun Jan 3, 2026
9e44b5b
Merge branch 'feat/MyInfo' of https://github.com/5team-gn/GlobalNomad…
seongihun Jan 3, 2026
23e69a1
브랜치 동기화
baejm Dec 30, 2025
79fa067
상세 작업중1 브랜치전환용
baejm Dec 24, 2025
c05d453
달력작업중
baejm Dec 25, 2025
7167da4
모바일/태블릿 하나로
baejm Dec 25, 2025
ed13745
모바일/태블릿/pc 하나로
baejm Dec 25, 2025
08365e8
모바일/태블릿/pc 하나로2
baejm Dec 26, 2025
f8b814b
레이아웃 완성
baejm Dec 26, 2025
d56717c
ui 작업중
baejm Dec 26, 2025
bea79aa
달력 라이브러리로 교체
baejm Dec 28, 2025
21ce3a0
ui완성
baejm Dec 29, 2025
ac6fba9
불필요 파일제거
baejm Dec 30, 2025
18660b0
디테일 페이지 ui 1차
baejm Jan 2, 2026
c873f62
주석 및 파일정리
baejm Jan 3, 2026
569b429
충돌해결
baejm Jan 3, 2026
1800280
주석 및 폴더정리
baejm Jan 3, 2026
be71aea
ui및 타입추가
baejm Jan 5, 2026
6f6e370
⚙️ Chore: axios, react-hot-toast 라이브러리 설치
Greensod-96 Jan 5, 2026
845aa6f
🎨 Style: 파비콘 추가
Greensod-96 Jan 5, 2026
919eddd
✨ Feat: 전역 레이아웃에 react-hot-toast Toaster 추가
Greensod-96 Jan 5, 2026
826eae5
♻️ Refactor: ReservationView UI 구조 및 로직 분리
Greensod-96 Jan 5, 2026
a4cd7a3
✨ Feat: 예약 취소 모달 CancelContent 컴포넌트 구현
Greensod-96 Jan 5, 2026
f265a35
✨ Feat: ReservationCard 컴포넌트 구현
Greensod-96 Jan 5, 2026
e7e1472
✨ Feat: ReservationEmpty 컴포넌트 구현
Greensod-96 Jan 5, 2026
1e614b4
✨ Feat: ReservationFilter 컴포넌트 구현
Greensod-96 Jan 5, 2026
0011bd7
✨ Feat: ReservationList 컴포넌트 구현
Greensod-96 Jan 5, 2026
c975314
♻️ Refactor: 예약 상태 라벨 및 스타일 상수 분리
Greensod-96 Jan 5, 2026
2f94d3a
✨ Feat: 후기 작성 모달 ReviewContent 컴포넌트 구현
Greensod-96 Jan 5, 2026
344edd9
♻️ Refactor: 예약 취소 및 후기 작성 액션 로직 hook 분리
Greensod-96 Jan 5, 2026
abca0d3
✨ Feat: 예약 목록 관리를 위한 useReservationList 훅 구현
Greensod-96 Jan 5, 2026
52e6cf7
✨ Feat: 예약 모달 상태 관리를 위한 useReservationModal 훅 구현
Greensod-96 Jan 5, 2026
a0aad37
✨ Feat: 예약 관련 API 모듈 및 axios 클라이언트 구성
Greensod-96 Jan 5, 2026
fbe3d3a
🧪 Test: 예약 목록 UI 테스트용 mock 데이터 추가
Greensod-96 Jan 5, 2026
1145376
🎨 Style: 예약 상태 및 예약 타입 정의 추가
Greensod-96 Jan 5, 2026
98f018f
🎨 Style: 예약 카드 이미지 리소스 추가
Greensod-96 Jan 5, 2026
68810fa
♻️ Refactor: 후기 작성 여부 관리를 위해 Reservation 타입 확장
Greensod-96 Jan 5, 2026
483c3d2
♻️ Refactor: ReservationList 불필요한 filter props 제거
Greensod-96 Jan 5, 2026
3975590
✨ Feat: 후기 작성 완료된 예약에 후기 버튼 미노출 처리
Greensod-96 Jan 5, 2026
124e142
♻️ Refactor: ReservationEmpty에서 상태 라벨 매핑 상수화
Greensod-96 Jan 5, 2026
1e273b9
♻️ Refactor: ReservationList 역할 단순화 및 책임 분리
Greensod-96 Jan 5, 2026
8559a8c
♻️ Refactor: useReservationList 비동기 로딩 구조 정리
Greensod-96 Jan 5, 2026
ee1281f
♻️ Refactor: completed 예약에 reviewWritten mock 케이스 추가
Greensod-96 Jan 5, 2026
7c5dd79
🎨 Style: CancelContent 색상 var 값 제거 및 tailwind 컬러로 변경
Greensod-96 Jan 5, 2026
0ca2fbe
🎨 Style: ReservationCard 색상 var 제거 및 tailwind 컬러로 변경
Greensod-96 Jan 5, 2026
f292073
🎨 Style: ReservationEmpty 색상 var 제거 및 tailwind 컬러로 변경
Greensod-96 Jan 5, 2026
64e60fb
🎨 Style: 예약 취소 모달 버튼 hover/active 스타일 개선
Greensod-96 Jan 5, 2026
497ac9f
Merge pull request #25 from 5team-gn/refactor/reservation-view
Greensod-96 Jan 6, 2026
d4f72cc
ai 코드리뷰 적용
baejm Jan 6, 2026
8493147
Merge branch 'develop' into feature/activities-detail
baejm Jan 6, 2026
26e3eef
Merge pull request #24 from 5team-gn/feature/activities-detail
baejm Jan 6, 2026
8e05434
♻️ Refactor: ReservationView 필터 안전 처리 및 렌더링 로직 단순화
Greensod-96 Jan 6, 2026
d07733e
✨ Feat: 로그인 상태 판단용 useAuth 훅 구현
Greensod-96 Jan 6, 2026
4b86544
✨ Feat: 예약 취소 및 후기 작성 API를 useReservationActions에 연동
Greensod-96 Jan 6, 2026
da0506e
✨ Feat: 예약 목록 조회 API를 useReservationList에 연동
Greensod-96 Jan 6, 2026
1b3db40
✨ Feat: 인증 헤더 및 인터셉터가 포함된 Axios client 설정
Greensod-96 Jan 6, 2026
aa22c22
♻️ Refactor: reservationApi 인증 처리 및 mock 제어 로직 정리
Greensod-96 Jan 6, 2026
043ecec
♻️ Refactor: ReservationView에서 불필요한 safeFilter 제거
Greensod-96 Jan 6, 2026
63c0825
♻️ Refactor: axios client에서 테스트 토큰 제거 및 인증 헤더 처리 정리
Greensod-96 Jan 6, 2026
e3efa8f
Merge pull request #27 from 5team-gn/feat/reservation-api
Greensod-96 Jan 6, 2026
5ef17de
사이드바 반응형 구현
seongihun Jan 2, 2026
2765b02
리뷰반영 주석 제거
seongihun Jan 3, 2026
12129b1
리뷰반영 수정
seongihun Jan 3, 2026
607bd6c
사이드바 반응형 구현
seongihun Jan 2, 2026
bd9a3a2
Merge branch 'feat/MyInfo' of https://github.com/5team-gn/GlobalNomad…
seongihun Jan 7, 2026
54edc8a
입력 컴포넌트 경로 수정: common에서 input으로 변경
seongihun Jan 7, 2026
f202b5b
예약 상태 뷰 컴포넌트 추가: 예약 목록 필터링 및 날짜 선택 기능 구현
seongihun Jan 7, 2026
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: 2 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
}
55 changes: 55 additions & 0 deletions Mocks/ReservationView.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import type { Reservation } from "../types/reservationview.types";

// TODO: API 연동 시 삭제
export const RESERVATION_MOCK_LIST: Reservation[] = [
{
id: 1,
title: "함께 배우는 플로잉 댄스",
date: "2023.02.14 · 11:00 - 12:30",
price: 10000,
people: 1,
status: "pending",
},
{
id: 2,
title: "내 강아지 인생 사진 찍어주기",
date: "2023.02.11 · 13:00 - 14:00",
price: 35000,
people: 1,
status: "canceled",
},
{
id: 3,
title: "이색 액티비티 체험",
date: "2023.01.10 · 10:00 - 12:00",
price: 60000,
people: 3,
status: "declined",
},
{
id: 4,
title: "별과 함께하는 북촌 체험",
date: "2023.01.14 · 15:00 - 16:00",
price: 40000,
people: 2,
status: "completed",
reviewWritten: true,
},
{
id: 5,
title: "요리 클래스 체험",
date: "2023.09.20 · 09:00 - 10:30",
price: 25000,
people: 1,
status: "completed",
reviewWritten: false,
},
{
id: 6,
title: "여행 클래스 체험",
date: "2023.11.20 · 09:00 - 10:30",
price: 37000,
people: 1,
status: "confirmed",
},
];
92 changes: 92 additions & 0 deletions Mocks/detail/activity-reviews.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import type { ReviewResponse } from "@/types/reviews/review.types";

export const mockActivityReviewsResponse: ReviewResponse = {
averageRating: 4.3,
totalCount: 6,
reviews: [
{
id: 101,
user: {
profileImageUrl: "https://picsum.photos/seed/user101/80/80",
nickname: "댄스초보",
id: 9001,
},
activityId: 777,
rating: 5,
content:
"처음인데도 동작을 단계별로 잘 풀어주셔서 부담이 없었어요. 분위기도 좋아서 시간 금방 갔습니다!",
createdAt: "2025-12-10T12:20:00.000Z",
updatedAt: "2025-12-10T12:20:00.000Z",
},
{
id: 102,
user: {
profileImageUrl: "https://picsum.photos/seed/user102/80/80",
nickname: "퇴근후한시간",
id: 9002,
},
activityId: 777,
rating: 4,
content:
"리듬감 없는 편인데도 따라가기 쉬웠어요. 마지막에 짧게 루틴 맞춰보는 게 재미있었습니다.",
createdAt: "2025-12-11T09:05:00.000Z",
updatedAt: "2025-12-11T09:05:00.000Z",
},
{
id: 103,
user: {
profileImageUrl: "https://picsum.photos/seed/user103/80/80",
nickname: "주말취미러",
id: 9003,
},
activityId: 777,
rating: 5,
content:
"음악 선곡이 좋고, 자세 교정도 꼼꼼합니다. 사진/영상 찍을 시간도 주셔서 만족!",
createdAt: "2025-12-12T15:40:00.000Z",
updatedAt: "2025-12-12T15:40:00.000Z",
},
{
id: 104,
user: {
profileImageUrl: "https://picsum.photos/seed/user104/80/80",
nickname: "몸치탈출",
id: 9004,
},
activityId: 777,
rating: 3,
content:
"난이도는 무난했는데 제가 체력이 부족해서 중간에 숨 찼네요. 그래도 친절해서 좋았습니다.",
createdAt: "2025-12-13T18:12:00.000Z",
updatedAt: "2025-12-13T18:12:00.000Z",
},
{
id: 105,
user: {
profileImageUrl: "https://picsum.photos/seed/user105/80/80",
nickname: "스트릿감성",
id: 9005,
},
activityId: 777,
rating: 4,
content:
"공간이 깔끔하고 미러/음향도 괜찮아요. 다음에는 다른 장르 클래스도 듣고 싶습니다.",
createdAt: "2025-12-15T06:30:00.000Z",
updatedAt: "2025-12-15T06:30:00.000Z",
},
{
id: 106,
user: {
profileImageUrl: "https://picsum.photos/seed/user106/80/80",
nickname: "리뷰요정",
id: 9006,
},
activityId: 777,
rating: 5,
content:
"설명→연습→피드백 흐름이 좋아요. 초보자 기준으로 포인트를 딱딱 집어줘서 확실히 배우는 느낌!",
createdAt: "2025-12-18T10:01:00.000Z",
updatedAt: "2025-12-18T10:01:00.000Z",
},
],
};
39 changes: 39 additions & 0 deletions Mocks/detail/activityDetail.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
export const mockActivityDetail = {
id: 7,
userId: 21,
title: "함께 배우면 즐거운 스트릿댄스",
description: "둠칫 둠칫 두둠칫",
category: "투어",
price: 10000,
address: "서울특별시 강남구 테헤란로 427",
bannerImageUrl: "/mock/mock1.png",
subImages: [
{
id: 1,
imageUrl: "/mock/mock2.png",
},
{
id: 2,
imageUrl: "/mock/mock3.png",
},
{
id: 3,
imageUrl: "/mock/mock4.png",
},
{
id: 4,
imageUrl: "/mock/mock5.png",
},
],
schedules: [
{ id: 1, date: "2026-01-01", startTime: "12:00", endTime: "13:00" },
{ id: 2, date: "2026-01-05", startTime: "12:00", endTime: "13:00" },
],
subImageUrls: [
"https://sprint-fe-project.s3.ap-northeast-2.amazonaws.com/globalnomad/activity_registration_image/b.png",
],
reviewCount: 5,
rating: 4.74,
createdAt: "2026-01-10T21:28:50.589Z",
updatedAt: "2026-01-10T21:28:50.589Z",
} as const;
19 changes: 19 additions & 0 deletions Mocks/detail/availableSchedule.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { AvailableScheduleItem } from "@/types/reservation/types";

export const MOCK_AVAILABLE_SCHEDULE: AvailableScheduleItem[] = [
{
date: "2026-01-15",
times: [
{ id: 1, startTime: "14:00", endTime: "15:00" },
{ id: 2, startTime: "15:00", endTime: "16:00" },
],
},
{
date: "2026-01-22",
times: [{ id: 3, startTime: "10:00", endTime: "11:30" }],
},
{
date: "2026-02-02",
times: [{ id: 4, startTime: "14:00", endTime: "19:30" }],
},
];
26 changes: 26 additions & 0 deletions Mocks/detail/reservations.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export type CreateReservationBody = {
scheduleId: number;
headCount: number;
};

export const MOCK_CREATE_RESERVATION_BODY: CreateReservationBody = {
scheduleId: 2,
headCount: 10,
};

export const MOCK_RESERVATION_RESPONSE = {
id: 1,
teamId: "team_01",
userId: 1,
activityId: 1,
scheduleId: 2,
status: "pending",
reviewSubmitted: false,
totalPrice: 10000,
headCount: 10,
date: "2025-11-04",
startTime: "15:00",
endTime: "16:00",
createdAt: "2025-12-24T08:38:28.312Z",
updatedAt: "2025-12-24T08:38:28.312Z",
} as const;
25 changes: 25 additions & 0 deletions app/activities/[id]/error.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// app/activities/[id]/error.tsx
"use client";

export default function Error({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<main className="max-w-[1200px] mx-auto px-6 mt-[34px] mb-45">
<p className="text-18-b text-gray-950">문제가 발생했습니다.</p>
<p className="text-14-body-m text-gray-600 mt-2">{error.message}</p>

<button
type="button"
className="mt-6 px-4 py-2 rounded-xl bg-gray-900 text-white"
onClick={() => reset()}
>
다시 시도
</button>
</main>
);
}
Loading