@@ -109,8 +109,13 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
109109 } , [ editingSection , dropoffTime ] ) ;
110110
111111 // Write pickup time back to form
112+ const pickupMinuteNum = pickupTimeMinute . length === 2 ? parseInt ( pickupTimeMinute , 10 ) : null ;
113+ const pickupMinuteInvalid = pickupMinuteNum !== null && ( Number . isNaN ( pickupMinuteNum ) || pickupMinuteNum > 59 ) ;
114+ const dropoffMinuteNum = dropoffTimeMinute . length === 2 ? parseInt ( dropoffTimeMinute , 10 ) : null ;
115+ const dropoffMinuteInvalid = dropoffMinuteNum !== null && ( Number . isNaN ( dropoffMinuteNum ) || dropoffMinuteNum > 59 ) ;
116+
112117 useEffect ( ( ) => {
113- if ( editingSection === 'pickup' && pickupTimeHour && pickupTimeMinute ) {
118+ if ( editingSection === 'pickup' && pickupTimeHour && pickupTimeMinute . length === 2 && ! pickupMinuteInvalid ) {
114119 const hour24 =
115120 pickupTimePeriod === 'AM'
116121 ? pickupTimeHour === '12'
@@ -126,7 +131,7 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
126131
127132 // Write dropoff time back to form
128133 useEffect ( ( ) => {
129- if ( editingSection === 'dropoff' && dropoffTimeHour && dropoffTimeMinute ) {
134+ if ( editingSection === 'dropoff' && dropoffTimeHour && dropoffTimeMinute . length === 2 && ! dropoffMinuteInvalid ) {
130135 const hour24 =
131136 dropoffTimePeriod === 'AM'
132137 ? dropoffTimeHour === '12'
@@ -380,7 +385,8 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
380385 ) }
381386 </ div >
382387 < h3 className = { `${ styles . summarySectionLabel } ${ styles . summarySectionLabelAfterValue } ` } > Pickup Time</ h3 >
383- < div className = { styles . timeInputContainer } >
388+ < div className = { styles . timeInputWrapper } >
389+ < div className = { `${ styles . timeInputContainer } ${ pickupMinuteInvalid ? styles . timeInputContainerError : '' } ` } >
384390 < input
385391 type = "text"
386392 className = { styles . timeInputHour }
@@ -399,11 +405,12 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
399405 placeholder = "00"
400406 value = { pickupTimeMinute }
401407 onChange = { ( e ) => {
402- const v = e . target . value . replace ( / \D / g, '' ) ;
403- if ( v === '' || ( parseInt ( v , 10 ) >= 0 && parseInt ( v , 10 ) <= 59 ) ) setPickupTimeMinute ( v . slice ( 0 , 2 ) ) ;
408+ const v = e . target . value . replace ( / \D / g, '' ) . slice ( 0 , 2 ) ;
409+ setPickupTimeMinute ( v ) ;
404410 } }
405411 onBlur = { ( ) => {
406- if ( pickupTimeMinute && pickupTimeMinute . length === 1 ) setPickupTimeMinute ( pickupTimeMinute . padStart ( 2 , '0' ) ) ;
412+ if ( pickupTimeMinute === '' ) return ;
413+ if ( pickupTimeMinute . length === 1 ) setPickupTimeMinute ( pickupTimeMinute . padStart ( 2 , '0' ) ) ;
407414 } }
408415 maxLength = { 2 }
409416 />
@@ -424,6 +431,12 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
424431 </ button >
425432 </ div >
426433 </ div >
434+ { pickupMinuteInvalid && (
435+ < p className = { styles . timeInputError } role = "alert" >
436+ Please enter minutes between 00 and 59. You can correct it above.
437+ </ p >
438+ ) }
439+ </ div >
427440 < button
428441 type = "button"
429442 className = { styles . summaryDoneButton }
@@ -501,7 +514,8 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
501514 ) }
502515 </ div >
503516 < h3 className = { `${ styles . summarySectionLabel } ${ styles . summarySectionLabelAfterValue } ` } > Dropoff Time</ h3 >
504- < div className = { styles . timeInputContainer } >
517+ < div className = { styles . timeInputWrapper } >
518+ < div className = { `${ styles . timeInputContainer } ${ dropoffMinuteInvalid ? styles . timeInputContainerError : '' } ` } >
505519 < input
506520 type = "text"
507521 className = { styles . timeInputHour }
@@ -520,11 +534,12 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
520534 placeholder = "00"
521535 value = { dropoffTimeMinute }
522536 onChange = { ( e ) => {
523- const v = e . target . value . replace ( / \D / g, '' ) ;
524- if ( v === '' || ( parseInt ( v , 10 ) >= 0 && parseInt ( v , 10 ) <= 59 ) ) setDropoffTimeMinute ( v . slice ( 0 , 2 ) ) ;
537+ const v = e . target . value . replace ( / \D / g, '' ) . slice ( 0 , 2 ) ;
538+ setDropoffTimeMinute ( v ) ;
525539 } }
526540 onBlur = { ( ) => {
527- if ( dropoffTimeMinute && dropoffTimeMinute . length === 1 ) setDropoffTimeMinute ( dropoffTimeMinute . padStart ( 2 , '0' ) ) ;
541+ if ( dropoffTimeMinute === '' ) return ;
542+ if ( dropoffTimeMinute . length === 1 ) setDropoffTimeMinute ( dropoffTimeMinute . padStart ( 2 , '0' ) ) ;
528543 } }
529544 maxLength = { 2 }
530545 />
@@ -545,6 +560,12 @@ const RequestSummaryStep: React.FC<RequestSummaryStepProps> = ({
545560 </ button >
546561 </ div >
547562 </ div >
563+ { dropoffMinuteInvalid && (
564+ < p className = { styles . timeInputError } role = "alert" >
565+ Please enter minutes between 00 and 59. You can correct it above.
566+ </ p >
567+ ) }
568+ </ div >
548569 < button
549570 type = "button"
550571 className = { styles . summaryDoneButton }
0 commit comments