Skip to content

Commit b805ba6

Browse files
authored
Merge pull request #156 from CampingOn/fix/#155-camp-calendar
Fix/#155 캘린더 새로고침 해결, 반려동물 반입 추가
2 parents 6a49ab9 + f52c976 commit b805ba6

File tree

5 files changed

+138
-60
lines changed

5 files changed

+138
-60
lines changed

src/components/camp/CampDatePicker.js

+51-19
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,62 @@ import DatePicker from "react-datepicker";
33
import { ko } from "date-fns/locale";
44
import "react-datepicker/dist/react-datepicker.css";
55
import "../../style/camp-date-picker.css";
6+
import DisabledByDefaultIcon from '@mui/icons-material/DisabledByDefault';
67

78
const CampDatePicker = ({ checkin, checkout, handleDateChange }) => {
89
const today = new Date(); // 오늘 날짜 기준
910

11+
const clearDates = () => {
12+
handleDateChange([null, null]); // 입실일과 퇴실일 초기화
13+
};
14+
15+
const handleDateSelection = (dates) => {
16+
const [start, end] = dates || [null, null];
17+
const today = new Date(); // 오늘 날짜
18+
today.setHours(0, 0, 0, 0); // 시간 제거하여 날짜만 비교
19+
20+
if (start) {
21+
const isTodaySelected = start.getTime() === today.getTime(); // 입실일이 오늘인지 확인
22+
if (isTodaySelected && end) {
23+
// 당일을 입실일로 선택한 경우 퇴실일 무효화
24+
handleDateChange([start, null]);
25+
return;
26+
}
27+
}
28+
29+
handleDateChange(dates); // 유효한 날짜만 반영
30+
};
31+
1032
return (
11-
<DatePicker
12-
locale={ko} // 한글 로케일 적용
13-
selected={checkin}
14-
onChange={(dates) => {
15-
const [start, end] = dates || [null, null];
16-
if (start && end) {
17-
const dayDifference = (end - start) / (1000 * 60 * 60 * 24); // 날짜 차이 계산
18-
if (dayDifference < 1) {
19-
return dayDifference >= 1;
20-
}
21-
}
22-
handleDateChange(dates); // 유효한 날짜만 반영
23-
}}
24-
startDate={checkin}
25-
endDate={checkout}
26-
selectsRange
27-
inline
28-
minDate={today} // 오늘 이후 날짜만 선택 가능
29-
/>
33+
<div className="camp-date-picker-container">
34+
<div className="datepicker-wrapper">
35+
<DatePicker
36+
locale={ko} // 한글 로케일 적용
37+
selected={checkin}
38+
onChange={handleDateSelection} // 선택 처리
39+
startDate={checkin}
40+
endDate={checkout}
41+
selectsRange
42+
inline
43+
minDate={today} // 오늘 이후 날짜만 선택 가능
44+
/>
45+
{/* 캘린더 입실일 초기화 버튼 (DisabledByDefaultIcon 사용) */}
46+
{(checkin && !checkout) && (
47+
<DisabledByDefaultIcon
48+
className="clear-dates-icon"
49+
onClick={clearDates} // 초기화 이벤트 핸들러
50+
style={{
51+
color: "black", // 아이콘 색상
52+
cursor: "pointer", // 클릭 가능
53+
position: "absolute", // 위치 조정
54+
top: "73px", // 적절한 위치 설정
55+
right: "1px", // 적절한 위치 설정
56+
fontSize: "35px", // 아이콘 크기
57+
}}
58+
/>
59+
)}
60+
</div>
61+
</div>
3062
);
3163
};
3264

src/components/common/OperationPolicy.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ const OperationPolicy = ({
66
title = '운영정책',
77
showDefaultPolicies = true,
88
outdoorFacility,
9-
industries
9+
industries,
10+
animalAdmission
1011
}) => {
1112
const policyData = [];
1213

@@ -28,6 +29,12 @@ const OperationPolicy = ({
2829
policyData.push({ label: '업종', value: industriesValue });
2930
}
3031

32+
if (animalAdmission) {
33+
policyData.push({ label: '반려동물 반입', value: animalAdmission });
34+
}
35+
36+
policyData.push(...additionalPolicies);
37+
3138
policyData.push(...additionalPolicies);
3239

3340
return (
@@ -48,7 +55,7 @@ const OperationPolicy = ({
4855
<List sx={{ p: 0 }}>
4956
{policyData.map((item, index) => (
5057
item.value && (
51-
<ListItem
58+
<ListItem
5259
key={index}
5360
sx={{
5461
display: 'flex',

src/pages/camp/CampDetail.js

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from "react";
1+
import React, { useState } from "react";
22
import { useParams } from "react-router-dom";
33
import { useCampDetail } from "../../hooks/useCampDetail";
44
import useAvailableCampSites from "../../hooks/useAvailableCampSites";
@@ -60,7 +60,7 @@ function CampDetail() {
6060
const handleModalOpen = () => setOpenModal(true);
6161
const handleModalClose = () => setOpenModal(false);
6262

63-
if (loading) return <div>로딩 중...</div>;
63+
6464
if (error) return <div>에러 발생: {error}</div>;
6565
if (detailError) return <div>에러 발생: {detailError}</div>;
6666
if (!campDetails) return <div>캠핑장 정보를 찾을 수 없습니다.</div>;
@@ -78,9 +78,9 @@ function CampDetail() {
7878
{/* images가 빈 배열일 경우 랜덤 썸네일로 채우기 */}
7979
{(!images || images.length === 0) ? (
8080
<div className="main-image" style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', width: '100%', marginBottom: '20px'}}>
81-
<img
81+
<img
8282
src={getRandomThumbnail("")}
83-
alt="랜덤 썸네일"
83+
alt="랜덤 썸네일"
8484
style={{ objectFit: 'cover', width: '100%', height: '100%' }}
8585
/>
8686
</div>
@@ -93,6 +93,7 @@ function CampDetail() {
9393
<OperationPolicy
9494
industries={campDetails.indutys || []}
9595
outdoorFacility={campDetails.outdoorFacility || "부대시설 정보 없음"}
96+
animalAdmission={campDetails.animalAdmission}
9697
/>
9798
<MapSection
9899
latitude={campAddr?.latitude}
@@ -110,18 +111,19 @@ function CampDetail() {
110111
/>
111112
<div className="date-info">
112113
<div className="date-box">
113-
<span className="label">입실</span>
114-
<span className="date">{checkin ? checkin.toLocaleDateString("ko-KR") : "날짜를 선택하세요"}</span>
114+
<span className="label">입실일</span>
115+
<span className="date">{checkin ? checkin.toLocaleDateString("ko-KR") : "날짜를 선택하기"}</span>
115116
</div>
116117
<div className="date-box">
117-
<span className="label">퇴실</span>
118-
<span className="date">{checkout ? checkout.toLocaleDateString("ko-KR") : "날짜를 선택하세요"}</span>
118+
<span className="label">퇴실일</span>
119+
<span className="date">{checkout ? checkout.toLocaleDateString("ko-KR") : "날짜를 선택하기"}</span>
119120
</div>
120121
</div>
121122
</div>
122123

123124
<div className="camp-site-list-available">
124125
<h2>예약 가능한 캠핑지 목록</h2>
126+
{/*if (loading) return <div>로딩 중...</div>;*/}
125127
{availableSites && availableSites.length > 0 ? (
126128
availableSites.map((site, index) => (
127129
<CampSiteCard
@@ -142,7 +144,7 @@ function CampDetail() {
142144
open={modalOpen}
143145
onClose={() => setModalOpen(false)}
144146
title="당일 예약 안내"
145-
message="※ 당일 예약�� 전화로만 가능합니다."
147+
message="※ 당일 예약은 전화로만 가능합니다."
146148
/>
147149
</div>
148150
</div>

src/style/camp-date-picker.css

+66-20
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,89 @@
1+
/* 달력 컨테이너 스타일 */
2+
.camp-date-picker-container {
3+
margin: 0; /* 컨테이너 간격 제거 */
4+
display: flex;
5+
flex-direction: column; /* 세로 정렬 */
6+
align-items: center; /* 내부 요소 가운데 정렬 */
7+
gap: 0; /* 간격 제거 */
8+
position: relative; /* 위치 지정 */
9+
}
10+
11+
/* 달력 스타일 */
12+
.datepicker-wrapper {
13+
position: relative;
14+
width: auto;
15+
margin: 0; /* 달력과 텍스트 박스 간격 제거 */
16+
}
17+
18+
/* 달력 박스 스타일 */
119
.react-datepicker {
2-
transform: scale(1.5); /* 크기 확대 */
20+
transform: scale(1); /* 크기 확대 (1.5에서 1.8로 증가) */
321
transform-origin: top center; /* 확대 기준점을 중앙으로 설정 */
422
margin-bottom: 0; /* 달력과 아래 텍스트의 간격 제거 */
523
width: auto; /* 자동 크기 */
6-
text-align: center; /* 달력 텍스트 가운데 정렬 */
24+
text-align: center; /* 텍스트 가운데 정렬 */
725
}
826

927
/* 텍스트 크기 조정 */
1028
.react-datepicker__day,
11-
.react-datepicker__day-name,
29+
.react-datepicker__day-name {
30+
font-size: 1.5rem; /* 글자 크기 */
31+
text-align: center; /* 가운데 정렬 */
32+
letter-spacing: 1px; /* 글자 간격 */
33+
}
1234
.react-datepicker__current-month {
13-
font-size: 1.2rem; /* 텍스트 크기 확대 */
35+
font-size: 1.5rem; /* 텍스트 크기 확대 */
1436
text-align: center; /* 텍스트를 가운데 정렬 */
1537
}
1638

1739
/* 날짜 선택 영역 패딩 및 크기 조정 */
1840
.react-datepicker__month {
19-
padding: 20px; /* 패딩 설정 */
20-
max-width: 600px; /* 최대 가로 길이 설정 */
41+
padding: 25px; /* 내부 패딩 증가 */
42+
max-width: 700px; /* 최대 가로 길이 증가 */
2143
display: flex; /* 플렉스 박스 활성화 */
2244
flex-direction: column; /* 세로 정렬 */
2345
align-items: center; /* 항목을 가운데 정렬 */
24-
}
25-
26-
/* 컨테이너 스타일 */
27-
.camp-date-picker-container {
28-
margin-top: 20px;
29-
display: flex;
30-
flex-direction: column; /* 세로 정렬 */
31-
align-items: center; /* 내부 요소 가운데 정렬 */
32-
gap: 10px; /* 간격 추가 */
46+
justify-content: space-between; /* 주차 간격 조정 */
3347
}
3448

3549
/* 달력 아래 텍스트 박스 스타일 */
3650
.date-info {
3751
display: flex;
3852
justify-content: center; /* 중앙 정렬 */
39-
gap: 20px; /* 입실/퇴실 간격 */
40-
margin-top: 132px; /* 달력과 텍스트 박스 간격 축소 */
41-
padding: 10px; /* 내부 여백 */
53+
gap: 30px; /* 입실/퇴실 간격 */
54+
padding: 10px; /* 내부 여백 증가 */
4255
background-color: #ffd672; /* 배경 색상 */
43-
border: 1.5px solid #c3c3c3;
56+
border: 1.5px solid #c3c3c3; /* 테두리 */
4457
border-radius: 8px; /* 모서리 둥글게 */
4558
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 그림자 효과 */
46-
width: 424px; /* 고정된 가로 크기 */
59+
width: 430px; /* 가로 크기 증가 */
4760
height: auto; /* 높이는 내용에 따라 자동으로 조정 */
61+
margin: -7px; /* 텍스트 박스 간격 제거 */
62+
margin-bottom: 100px;
63+
position: relative; /* 기본 위치에 유지 */
4864
}
4965

66+
/* 날짜 칸 스타일 */
67+
.react-datepicker__day {
68+
width: 3rem; /* 날짜 칸 너비 증가 */
69+
height: 3rem; /* 날짜 칸 높이 증가 */
70+
line-height: 3rem; /* 텍스트 중앙 정렬 */
71+
font-size: 1.5rem; /* 날짜 텍스트 크기 증가 */
72+
text-align: center;
73+
}
74+
75+
76+
/* 날짜 선택 영역 패딩 및 크기 조정 */
77+
.react-datepicker__month {
78+
padding: 20px; /* 내부 패딩 */
79+
max-width: 600px; /* 최대 가로 길이 */
80+
display: flex;
81+
flex-direction: column;
82+
align-items: center;
83+
justify-content: space-between; /* 주차 간격 조정 */
84+
}
85+
86+
5087
/* 개별 텍스트 박스 스타일 */
5188
.date-box {
5289
display: flex;
@@ -81,4 +118,13 @@
81118
font-size: 16px;
82119
color: #222;
83120
font-weight: bold;
121+
}
122+
123+
/* 캘린더 날짜 취소 버튼 */
124+
.datepicker-wrapper {
125+
position: relative;
126+
}
127+
128+
.react-datepicker__day--outside-month {
129+
visibility: hidden; /* 다음 달 날짜 숨김 */
84130
}

src/style/camp-detail.css

+1-10
Original file line numberDiff line numberDiff line change
@@ -215,16 +215,6 @@
215215
flex: 1; /* 동일한 비율로 공간을 차지 */
216216
}
217217

218-
219-
220-
/*.location-info {*/
221-
/* padding: 5px;*/
222-
/* box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);*/
223-
/* border-radius: 8px;*/
224-
/* border: 1px solid #ccc;*/
225-
/* background-color: #ffffff;*/
226-
/*}*/
227-
228218
.location-info-title {
229219
font-size: 1.5rem;
230220
font-weight: bold;
@@ -237,6 +227,7 @@
237227
border-radius: 8px;
238228
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
239229
overflow: hidden;
230+
margin-bottom: 60px; /* 지도 아래에 간격 추가 */
240231
}
241232

242233
#map {

0 commit comments

Comments
 (0)