1- import { Dispatch , useState } from 'react' ;
1+ import { ChangeEvent , Dispatch , useState , type SetStateAction } from 'react' ;
22import DatePicker , { registerLocale , setDefaultLocale } from 'react-datepicker' ;
33import { Button , InputText , Txt } from '@quokka/design-system' ;
44import { ko } from 'date-fns/locale' ;
55
66import 'react-datepicker/dist/react-datepicker.css' ;
77import './DateTime.css' ;
88import { useSectionTimeSettingCreate } from '../../hooks/react-query/useSectionTimeSetting' ;
9- import { getFormalDateBy , isPastTime } from '../../functions/date' ;
10- import { SetStateAction } from 'jotai' ;
9+ import {
10+ getFormalDateBy ,
11+ isValidDate ,
12+ isValidTime ,
13+ } from '../../functions/date' ;
1114
1215registerLocale ( 'ko' , ko ) ;
1316setDefaultLocale ( 'ko' ) ;
@@ -28,14 +31,75 @@ const DateTimePicker = ({ date, setDate, title }: SettingTimeProps) => {
2831 const selectedHour = date . getHours ( ) . toString ( ) . padStart ( 2 , '0' ) ;
2932 const selectedMinute = date . getMinutes ( ) . toString ( ) . padStart ( 2 , '0' ) ;
3033
34+ const onHourChange = ( e : ChangeEvent < HTMLInputElement > ) => {
35+ const newHour = e . target . value ;
36+
37+ if ( ! isValidTime ( newHour ) ) {
38+ return alert ( '숫자만 입력 가능합니다.' ) ;
39+ }
40+
41+ if ( Number ( newHour ) > 23 ) {
42+ return alert ( '유효한 시간이 아닙니다.' ) ;
43+ }
44+
45+ if ( newHour !== selectedHour ) {
46+ setDate (
47+ new Date (
48+ selectedYear ,
49+ Number ( selectedMonth ) - 1 ,
50+ Number ( selectedDay ) ,
51+ Number ( newHour ) ,
52+ Number ( selectedMinute ) ,
53+ ) ,
54+ ) ;
55+ }
56+ } ;
57+
58+ const onMinuteChange = ( e : ChangeEvent < HTMLInputElement > ) => {
59+ const newMinute = e . target . value ;
60+
61+ if ( ! isValidTime ( newMinute ) ) {
62+ return alert ( '숫자만 입력 가능합니다.' ) ;
63+ }
64+
65+ if ( Number ( newMinute ) > 59 ) {
66+ return alert ( '유효한 시간이 아닙니다.' ) ;
67+ }
68+
69+ if ( newMinute !== selectedMinute ) {
70+ setDate (
71+ new Date (
72+ selectedYear ,
73+ Number ( selectedMonth ) - 1 ,
74+ Number ( selectedDay ) ,
75+ Number ( selectedHour ) ,
76+ Number ( newMinute ) ,
77+ ) ,
78+ ) ;
79+ }
80+ } ;
81+
3182 return (
3283 < div className = "flex flex-col gap-4 flex-1 min-w-[25rem]" >
3384 < Txt size = "h3" > { title } </ Txt >
34- < Txt
35- size = "h4"
36- color = "white"
37- className = "text-center p-4 bg-[linear-gradient(91deg,#0255D5_12.84%,#9CBBFF_104.56%)] rounded-md"
38- > { `${ selectedYear } : ${ selectedMonth } : ${ selectedDay } / ${ selectedHour } : ${ selectedMinute } ` } </ Txt >
85+ < div className = "text-center p-4 bg-[linear-gradient(91deg,#0255D5_12.84%,#9CBBFF_104.56%)] rounded-md" >
86+ < Txt size = "h4" color = "white" >
87+ { `${ selectedYear } : ${ selectedMonth } : ${ selectedDay } / ` }
88+ </ Txt >
89+ < input
90+ className = "text-2xl font-semibold w-7 text-white bg-transparent"
91+ value = { selectedHour }
92+ onChange = { onHourChange }
93+ />
94+ < Txt size = "h4" color = "white" className = "pl-2 pr-2" >
95+ :
96+ </ Txt >
97+ < input
98+ className = "text-2xl font-semibold w-7 text-white bg-transparent"
99+ value = { selectedMinute }
100+ onChange = { onMinuteChange }
101+ />
102+ </ div >
39103 < div className = "flex justify-center" >
40104 < DatePicker
41105 selected = { date }
@@ -61,15 +125,7 @@ export const SettingCreateTime = () => {
61125 return ;
62126 }
63127
64- if ( isPastTime ( openDate ) ) {
65- alert ( 'OPEN 시간을 현재 시간보다 이전 시간으로 설정할 수 없습니다.' ) ;
66- return ;
67- }
68-
69- if ( isPastTime ( endDate ) ) {
70- alert ( 'CLOSE 시간을 현재 시간보다 이전 시간으로 설정할 수 없습니다.' ) ;
71- return ;
72- }
128+ if ( ! isValidDate ( openDate , endDate ) ) return ;
73129
74130 createSettingTime ( {
75131 startAt : openDate ,
@@ -79,18 +135,9 @@ export const SettingCreateTime = () => {
79135 } ;
80136
81137 const onSetCreateTime =
82- (
83- predicate : ( date : Date ) => boolean ,
84- errMsg : string ,
85- setDate : Dispatch < SetStateAction < Date > > ,
86- setDateType : 'open' | 'close' ,
87- ) =>
138+ ( setDate : Dispatch < SetStateAction < Date > > , setDateType : 'open' | 'close' ) =>
88139 ( date : Date | null ) => {
89140 if ( ! date ) return ;
90- if ( predicate ( date ) ) {
91- alert ( errMsg ) ;
92- return ;
93- }
94141 setDate ( date ) ;
95142 if ( setDateType === 'open' && date > endDate ) {
96143 setEndDate ( date ) ;
@@ -112,22 +159,12 @@ export const SettingCreateTime = () => {
112159 < div className = "flex justify-around gap-8" >
113160 < DateTimePicker
114161 date = { openDate }
115- setDate = { onSetCreateTime (
116- isPastTime ,
117- '현재 시간보다 이전 시간으로 설정할 수 없습니다.' ,
118- setOpenDate ,
119- 'open' ,
120- ) }
162+ setDate = { onSetCreateTime ( setOpenDate , 'open' ) }
121163 title = "Open"
122164 />
123165 < DateTimePicker
124166 date = { endDate }
125- setDate = { onSetCreateTime (
126- isPastTime ,
127- '현재 시간보다 이전 시간으로 설정할 수 없습니다.' ,
128- setEndDate ,
129- 'close' ,
130- ) }
167+ setDate = { onSetCreateTime ( setEndDate , 'close' ) }
131168 title = "Close"
132169 />
133170 </ div >
0 commit comments