1
1
import { ChevronLeftIcon , ChevronRightIcon , EarthGlobeIcon } from '@sanity/icons'
2
2
import { Box , Flex , Grid , Select , Text } from '@sanity/ui'
3
- import { addDays , addMonths , setDate , setHours , setMinutes , setMonth , setYear } from 'date-fns'
4
- import { range } from 'lodash'
3
+ import {
4
+ addDays ,
5
+ addMonths ,
6
+ format ,
7
+ parse ,
8
+ setDate ,
9
+ setHours ,
10
+ setMinutes ,
11
+ setMonth ,
12
+ setYear ,
13
+ } from 'date-fns'
5
14
import {
6
15
type ComponentProps ,
7
16
type FormEvent ,
@@ -19,8 +28,9 @@ import {Button} from '../../../../../ui-components/button/Button'
19
28
import { TooltipDelayGroupProvider } from '../../../../../ui-components/tooltipDelayGroupProvider/TooltipDelayGroupProvider'
20
29
import useDialogTimeZone from '../../../../scheduledPublishing/hooks/useDialogTimeZone'
21
30
import useTimeZone from '../../../../scheduledPublishing/hooks/useTimeZone'
31
+ import { TimeInput } from '../TimeInput'
22
32
import { CalendarMonth } from './CalendarMonth'
23
- import { ARROW_KEYS , DEFAULT_TIME_PRESETS , HOURS_24 } from './constants'
33
+ import { ARROW_KEYS , DEFAULT_TIME_PRESETS } from './constants'
24
34
import { features } from './features'
25
35
import { type CalendarLabels , type MonthNames } from './types'
26
36
import { formatTime } from './utils'
@@ -119,29 +129,21 @@ export const Calendar = forwardRef(function Calendar(
119
129
[ onSelect , selectedDate ] ,
120
130
)
121
131
122
- const handleMinutesChange = useCallback (
123
- ( event : FormEvent < HTMLSelectElement > ) => {
124
- const m = Number ( event . currentTarget . value )
125
- onSelect ( setMinutes ( selectedDate , m ) )
126
- } ,
127
- [ onSelect , selectedDate ] ,
128
- )
129
-
130
- const handleHoursChange = useCallback (
131
- ( event : FormEvent < HTMLSelectElement > ) => {
132
- const m = Number ( event . currentTarget . value )
133
- onSelect ( setHours ( selectedDate , m ) )
134
- } ,
135
- [ onSelect , selectedDate ] ,
136
- )
137
-
138
132
const handleTimeChange = useCallback (
139
133
( hours : number , mins : number ) => {
140
134
onSelect ( setHours ( setMinutes ( selectedDate , mins ) , hours ) )
141
135
} ,
142
136
[ onSelect , selectedDate ] ,
143
137
)
144
138
139
+ const handleTimeChangeInputChange = useCallback (
140
+ ( event : FormEvent < HTMLInputElement > ) => {
141
+ const date = parse ( event . currentTarget . value , 'HH:mm' , new Date ( ) )
142
+ handleTimeChange ( date . getHours ( ) , date . getMinutes ( ) )
143
+ } ,
144
+ [ handleTimeChange ] ,
145
+ )
146
+
145
147
const ref = useRef < HTMLDivElement | null > ( null )
146
148
147
149
useImperativeHandle < HTMLDivElement | null , HTMLDivElement | null > ( forwardedRef , ( ) => ref . current )
@@ -328,46 +330,11 @@ export const Calendar = forwardRef(function Calendar(
328
330
{ selectTime && (
329
331
< >
330
332
< Flex align = "center" >
331
- < Flex align = "center" flex = { 1 } >
332
- < Box >
333
- < Select
334
- aria-label = { labels . selectHour }
335
- fontSize = { 1 }
336
- padding = { 2 }
337
- radius = { 2 }
338
- value = { selectedDate ?. getHours ( ) }
339
- onChange = { handleHoursChange }
340
- >
341
- { HOURS_24 . map ( ( h ) => (
342
- < option key = { h } value = { h } >
343
- { `${ h } ` . padStart ( 2 , '0' ) }
344
- </ option >
345
- ) ) }
346
- </ Select >
347
- </ Box >
348
-
349
- < Box paddingX = { 1 } >
350
- < Text size = { 1 } > :</ Text >
351
- </ Box >
352
-
353
- < Box >
354
- < Select
355
- aria-label = { labels . selectMinute }
356
- fontSize = { 1 }
357
- padding = { 2 }
358
- radius = { 2 }
359
- value = { selectedDate ?. getMinutes ( ) }
360
- onChange = { handleMinutesChange }
361
- >
362
- { range ( 0 , 60 , timeStep ) . map ( ( m ) => (
363
- < option key = { m } value = { m } >
364
- { `${ m } ` . padStart ( 2 , '0' ) }
365
- </ option >
366
- ) ) }
367
- </ Select >
368
- </ Box >
369
- </ Flex >
370
-
333
+ < TimeInput
334
+ aria-label = { labels . selectTime }
335
+ value = { format ( selectedDate , 'HH:mm' ) }
336
+ onChange = { handleTimeChangeInputChange }
337
+ />
371
338
< Box marginLeft = { 2 } >
372
339
< Button text = { labels . setToCurrentTime } mode = "bleed" onClick = { handleNowClick } />
373
340
</ Box >
0 commit comments