@@ -29,85 +29,112 @@ function validateProps(props: AndroidNativeProps) {
29
29
) ;
30
30
}
31
31
32
- export default function RNDateTimePicker ( props : AndroidNativeProps ) {
33
- validateProps ( props ) ;
34
- const {
35
- mode,
36
- value,
37
- display,
38
- onChange,
39
- is24Hour,
40
- minimumDate,
41
- maximumDate,
42
- neutralButtonLabel,
43
- minuteInterval,
44
- } = props ;
45
- let picker ;
46
-
32
+ function getPicker ( {
33
+ mode,
34
+ value,
35
+ display,
36
+ is24Hour,
37
+ minimumDate,
38
+ maximumDate,
39
+ neutralButtonLabel,
40
+ minuteInterval,
41
+ } ) {
47
42
switch ( mode ) {
48
43
case MODE_TIME :
49
- picker = pickers [ MODE_TIME ] . open ( {
44
+ return pickers [ MODE_TIME ] . open ( {
50
45
value,
51
46
display,
52
47
minuteInterval,
53
48
is24Hour,
54
49
neutralButtonLabel,
55
50
} ) ;
56
- break ;
57
-
58
51
case MODE_DATE :
59
52
default :
60
- picker = pickers [ MODE_DATE ] . open ( {
53
+ return pickers [ MODE_DATE ] . open ( {
61
54
value,
62
55
display,
63
56
minimumDate,
64
57
maximumDate,
65
58
neutralButtonLabel,
66
59
} ) ;
67
- break ;
68
60
}
61
+ }
62
+
63
+ export default function RNDateTimePicker ( props : AndroidNativeProps ) {
64
+ validateProps ( props ) ;
65
+ const {
66
+ mode,
67
+ value,
68
+ onChange,
69
+ display,
70
+ is24Hour,
71
+ minimumDate,
72
+ maximumDate,
73
+ neutralButtonLabel,
74
+ minuteInterval,
75
+ } = props ;
76
+ const valueTimestamp = value . getTime ( ) ;
69
77
70
78
useEffect ( ( ) => {
71
- // This effect runs on unmount, and will ensure the picker is closed.
79
+ // This effect runs on unmount / with mode change , and will ensure the picker is closed.
72
80
// This allows for controlling the opening state of the picker through declarative logic in jsx.
73
81
return ( ) => ( pickers [ mode ] ?? pickers [ MODE_DATE ] ) . dismiss ( ) ;
74
82
} , [ mode ] ) ;
75
83
76
- picker . then (
77
- function resolve ( { action, day, month, year, minute, hour} ) {
78
- const date = new Date ( value ) ;
79
- const event : AndroidEvent = {
80
- type : 'set' ,
81
- nativeEvent : { } ,
82
- } ;
84
+ useEffect (
85
+ function showOrUpdatePicker ( ) {
86
+ const picker = getPicker ( {
87
+ mode,
88
+ value : valueTimestamp ,
89
+ display,
90
+ is24Hour,
91
+ minimumDate,
92
+ maximumDate,
93
+ neutralButtonLabel,
94
+ minuteInterval,
95
+ } ) ;
83
96
84
- switch ( action ) {
85
- case DATE_SET_ACTION :
86
- event . nativeEvent . timestamp = date . setFullYear ( year , month , day ) ;
87
- onChange ( event , date ) ;
88
- break ;
97
+ picker . then (
98
+ function resolve ( { action, day, month, year, minute, hour} ) {
99
+ const date = new Date ( valueTimestamp ) ;
100
+ const event : AndroidEvent = {
101
+ type : 'set' ,
102
+ nativeEvent : { } ,
103
+ } ;
89
104
90
- case TIME_SET_ACTION :
91
- event . nativeEvent . timestamp = date . setHours ( hour , minute ) ;
92
- onChange ( event , date ) ;
93
- break ;
105
+ switch ( action ) {
106
+ case DATE_SET_ACTION :
107
+ event . nativeEvent . timestamp = date . setFullYear ( year , month , day ) ;
108
+ onChange ( event , date ) ;
109
+ break ;
94
110
95
- case NEUTRAL_BUTTON_ACTION :
96
- event . type = 'neutralButtonPressed' ;
97
- onChange ( event ) ;
98
- break ;
111
+ case TIME_SET_ACTION :
112
+ event . nativeEvent . timestamp = date . setHours ( hour , minute ) ;
113
+ onChange ( event , date ) ;
114
+ break ;
99
115
100
- case DISMISS_ACTION :
101
- default :
102
- event . type = 'dismissed' ;
103
- onChange ( event ) ;
104
- break ;
105
- }
106
- } ,
107
- function reject ( error ) {
108
- // ignore or throw `activity == null` error
109
- throw error ;
116
+ case NEUTRAL_BUTTON_ACTION :
117
+ event . type = 'neutralButtonPressed' ;
118
+ onChange ( event ) ;
119
+ break ;
120
+
121
+ case DISMISS_ACTION :
122
+ default :
123
+ event . type = 'dismissed' ;
124
+ onChange ( event ) ;
125
+ break ;
126
+ }
127
+ } ,
128
+ function reject ( error ) {
129
+ // ignore or throw `activity == null` error
130
+ throw error ;
131
+ } ,
132
+ ) ;
110
133
} ,
134
+ // the android dialog, when presented, will actually ignore updates to all props other than `value`
135
+ // we need to change the behavior as described in https://github.com/react-native-datetimepicker/datetimepicker/pull/327#issuecomment-723160992
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ [ onChange , valueTimestamp , mode ] ,
111
138
) ;
112
139
113
140
return null ;
0 commit comments