@@ -49,11 +49,6 @@ export default function BottomSheet({
4949 const isLoadingRef = useRef ( false ) ;
5050 const reRender = useReRenderer ( ) ;
5151
52- // 현재 시간 가져오기 (현재 시간 이후로만 입력 가능하도록 하기 위함)
53- const now = new Date ( ) ;
54- const currentHour = now . getHours ( ) ;
55- const currentMinute = now . getMinutes ( ) ;
56-
5752 const maxQuantity = item ?. count || 0 ;
5853
5954 // 모달이 열릴 때마다 입력값 초기화
@@ -92,49 +87,81 @@ export default function BottomSheet({
9287 setErrors ( ( prevErrors ) => ( { ...prevErrors , quantity : errorMsg } ) ) ;
9388 } ;
9489
95- // 시간 입력 시 검증
96- const handleHourChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
97- const { value } = e . target ;
98- setHour ( value ) ;
90+ // 통합 시간 검증 함수
91+ const validateTime = ( hourStr : string , minuteStr : string ) : string => {
92+ const numHour = parseInt ( hourStr , 10 ) ;
93+ const numMinute = parseInt ( minuteStr , 10 ) ;
9994
100- const numHour = parseInt ( value , 10 ) ;
101- let errorMsg = '' ;
95+ if ( Number . isNaN ( numHour ) || Number . isNaN ( numMinute ) ) {
96+ return '올바른 시간을 입력해주세요.' ;
97+ }
10298
103- if ( Number . isNaN ( numHour ) ) {
104- errorMsg = '올바른 시간을 입력해주세요.' ;
105- } else if ( numHour < 10 || numHour >= 17 ) {
106- errorMsg = '대여 가능 시간은 10:00 ~ 17:00입니다.' ; // 10시 ~ 17시 사이가 아닐 경우
107- } else if ( numHour < currentHour ) {
108- errorMsg = '대여는 현재 시간 이후로만 가능합니다.' ; // 현재 시간보다 이전이면 무조건 오류
109- } else if (
110- numHour === currentHour &&
111- parseInt ( minute || '0' , 10 ) <= currentMinute
112- ) {
113- errorMsg = '대여는 현재 시간 이후로만 가능합니다.' ; // 현재 시각과 같다면, 분이 현재 분보다 커야 함
99+ const now = new Date ( ) ;
100+ const inputTime = new Date (
101+ now . getFullYear ( ) ,
102+ now . getMonth ( ) ,
103+ now . getDate ( ) ,
104+ numHour ,
105+ numMinute ,
106+ ) ;
107+ const openTime = new Date (
108+ now . getFullYear ( ) ,
109+ now . getMonth ( ) ,
110+ now . getDate ( ) ,
111+ 10 ,
112+ 0 ,
113+ ) ;
114+ const closeTime = new Date (
115+ now . getFullYear ( ) ,
116+ now . getMonth ( ) ,
117+ now . getDate ( ) ,
118+ 17 ,
119+ 0 ,
120+ ) ;
121+
122+ // 운영시간: 10:00 ~ 17:00
123+ if ( inputTime < openTime || inputTime > closeTime ) {
124+ return '대여 가능한 시간은 10:00 ~ 17:00입니다.' ;
125+ }
126+
127+ // 입력 시간이 현재 시간보다 이후인지 체크
128+ if ( inputTime <= now ) {
129+ return '대여는 현재 시간 이후로만 가능합니다.' ;
130+ }
131+
132+ // 현재 시각을 기준으로 5분 후 체크 (현재 시간이 16:55 이전일 때만 적용)
133+ const threshold = new Date (
134+ now . getFullYear ( ) ,
135+ now . getMonth ( ) ,
136+ now . getDate ( ) ,
137+ 16 ,
138+ 55 ,
139+ ) ;
140+ if ( now < threshold ) {
141+ const fiveMinutesLater = new Date ( now . getTime ( ) + 5 * 60 * 1000 ) ;
142+ if ( inputTime < fiveMinutesLater ) {
143+ return '대여는 현재 시간으로부터 5분 후에 가능합니다.' ;
144+ }
114145 }
115146
147+ return '' ;
148+ } ;
149+
150+ // 시간 입력 시 검증 (시)
151+ const handleHourChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
152+ const { value } = e . target ;
153+ setHour ( value ) ;
154+
155+ const errorMsg = validateTime ( value , minute ) ;
116156 setErrors ( ( prevErrors ) => ( { ...prevErrors , time : errorMsg } ) ) ;
117157 } ;
118158
119- // 분 입력 시 검증
159+ // 시간 입력 시 검증 (분)
120160 const handleMinuteChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
121161 const { value } = e . target ;
122162 setMinute ( value ) ;
123163
124- const numHour = parseInt ( hour , 10 ) ;
125- const numMinute = parseInt ( value , 10 ) ;
126- let errorMsg = '' ;
127-
128- if ( Number . isNaN ( numHour ) || Number . isNaN ( numMinute ) ) {
129- errorMsg = '올바른 시간을 입력해주세요.' ;
130- } else if ( numHour < 10 || numHour >= 17 ) {
131- errorMsg = '대여 가능 시간은 10:00 ~ 17:00입니다.' ;
132- } else if ( numHour < currentHour ) {
133- errorMsg = '대여는 현재 시간 이후로만 가능합니다.' ;
134- } else if ( numHour === currentHour && numMinute <= currentMinute ) {
135- errorMsg = '대여는 현재 시간 이후로만 가능합니다.' ;
136- }
137-
164+ const errorMsg = validateTime ( hour , value ) ;
138165 setErrors ( ( prevErrors ) => ( { ...prevErrors , time : errorMsg } ) ) ;
139166 } ;
140167
0 commit comments