1
- import { Fragment , useState } from 'react'
1
+ import { Fragment , useCallback , useState } from 'react'
2
2
import { Dialog , Transition } from '@headlessui/react'
3
3
import Picker , { PickerValue } from 'react-mobile-picker'
4
4
5
5
function getDayArray ( year : number , month : number ) {
6
6
const dayCount = new Date ( year , month , 0 ) . getDate ( )
7
- return Array . from ( { length : dayCount } , ( _ , i ) => i + 1 )
7
+ return Array . from ( { length : dayCount } , ( _ , i ) => String ( i + 1 ) . padStart ( 2 , '0' ) )
8
8
}
9
9
10
10
export default function ModalPicker ( ) {
11
11
const [ isOpen , setIsOpen ] = useState ( false )
12
12
const [ pickerValue , setPickerValue ] = useState < PickerValue > ( {
13
- year : 1989 ,
14
- month : 8 ,
15
- day : 12 ,
13
+ year : ' 1989' ,
14
+ month : '08' ,
15
+ day : '12' ,
16
16
} )
17
17
18
+ const handlePickerChange = useCallback ( ( newValue : PickerValue , key : string ) => {
19
+ if ( key === 'day' ) {
20
+ setPickerValue ( newValue )
21
+ return
22
+ }
23
+
24
+ const { year, month } = newValue
25
+ const newDayArray = getDayArray ( Number ( year ) , Number ( month ) )
26
+ const newDay = newDayArray . includes ( newValue . day ) ? newValue . day : newDayArray [ newDayArray . length - 1 ]
27
+ setPickerValue ( { ...newValue , day : newDay } )
28
+ } , [ ] )
29
+
18
30
return (
19
31
< >
20
32
< button
@@ -60,11 +72,11 @@ export default function ModalPicker() {
60
72
< div className = "mt-2" >
61
73
< Picker
62
74
value = { pickerValue }
63
- onChange = { setPickerValue }
75
+ onChange = { handlePickerChange }
64
76
wheelMode = "natural"
65
77
>
66
78
< Picker . Column name = "year" >
67
- { Array . from ( { length : 100 } , ( _ , i ) => 1923 + i ) . map ( ( year ) => (
79
+ { Array . from ( { length : 100 } , ( _ , i ) => ` ${ 1923 + i } ` ) . map ( ( year ) => (
68
80
< Picker . Item key = { year } value = { year } >
69
81
{ ( { selected } ) => (
70
82
< div className = { selected ? 'font-semibold text-neutral-900' : 'text-neutral-400' } > { year } </ div >
@@ -73,7 +85,7 @@ export default function ModalPicker() {
73
85
) ) }
74
86
</ Picker . Column >
75
87
< Picker . Column name = "month" >
76
- { Array . from ( { length : 12 } , ( _ , i ) => i + 1 ) . map ( ( month ) => (
88
+ { Array . from ( { length : 12 } , ( _ , i ) => String ( i + 1 ) . padStart ( 2 , '0' ) ) . map ( ( month ) => (
77
89
< Picker . Item key = { month } value = { month } >
78
90
{ ( { selected } ) => (
79
91
< div className = { selected ? 'font-semibold text-neutral-900' : 'text-neutral-400' } > { month } </ div >
@@ -82,7 +94,7 @@ export default function ModalPicker() {
82
94
) ) }
83
95
</ Picker . Column >
84
96
< Picker . Column name = "day" >
85
- { getDayArray ( pickerValue . year , pickerValue . month ) . map ( ( day ) => (
97
+ { getDayArray ( Number ( pickerValue . year ) , Number ( pickerValue . month ) ) . map ( ( day ) => (
86
98
< Picker . Item key = { day } value = { day } >
87
99
{ ( { selected } ) => (
88
100
< div className = { selected ? 'font-semibold text-neutral-900' : 'text-neutral-400' } > { day } </ div >
0 commit comments