1
- import React , { useState , useEffect } from 'react' ;
1
+ import { useState , useEffect } from 'react' ;
2
2
import PropTypes from 'prop-types' ;
3
3
import { defineMessages , useIntl } from 'react-intl' ;
4
4
import loadable from '@loadable/component' ;
@@ -12,11 +12,10 @@ import leftKey from '@plone/volto/icons/left-key.svg';
12
12
import rightKey from '@plone/volto/icons/right-key.svg' ;
13
13
import clearSVG from '@plone/volto/icons/clear.svg' ;
14
14
15
- import 'rc-time-picker/assets/index.css' ;
16
15
import 'react-dates/initialize' ;
17
16
import 'react-dates/lib/css/_datepicker.css' ;
18
17
19
- const TimePicker = loadable ( ( ) => import ( 'rc -time-picker' ) ) ;
18
+ const TimePicker = loadable ( ( ) => import ( 'react -time-picker' ) ) ;
20
19
21
20
const messages = defineMessages ( {
22
21
date : {
@@ -73,7 +72,6 @@ const DatetimeWidgetComponent = (props) => {
73
72
resettable,
74
73
reactDates,
75
74
widgetOptions,
76
- moment,
77
75
value,
78
76
onChange,
79
77
dateOnly,
@@ -91,19 +89,14 @@ const DatetimeWidgetComponent = (props) => {
91
89
const { SingleDatePicker } = reactDates ;
92
90
93
91
useEffect ( ( ) => {
94
- const parsedDateTime = parseDateTime (
95
- toBackendLang ( lang ) ,
96
- value ,
97
- undefined ,
98
- moment . default ,
99
- ) ;
100
- setIsDefault (
101
- parsedDateTime ?. toISOString ( ) === moment . default ( ) . utc ( ) . toISOString ( ) ,
102
- ) ;
103
- } , [ value , lang , moment ] ) ;
92
+ const parsedDateTime = parseDateTime ( toBackendLang ( lang ) , value ) ;
93
+ const nowUTC = new Date ( ) . toISOString ( ) ;
94
+
95
+ setIsDefault ( parsedDateTime ?. toISOString ( ) === nowUTC ) ;
96
+ } , [ value , lang ] ) ;
104
97
105
98
const getInternalValue = ( ) => {
106
- return parseDateTime ( toBackendLang ( lang ) , value , undefined , moment . default ) ;
99
+ return parseDateTime ( toBackendLang ( lang ) , value , undefined ) ;
107
100
} ;
108
101
109
102
const getDateOnly = ( ) => {
@@ -113,28 +106,38 @@ const DatetimeWidgetComponent = (props) => {
113
106
const onDateChange = ( date ) => {
114
107
if ( date ) {
115
108
const isDateOnly = getDateOnly ( ) ;
116
- const base = ( getInternalValue ( ) || moment . default ( ) ) . set ( {
117
- year : date . year ( ) ,
118
- month : date . month ( ) ,
119
- date : date . date ( ) ,
120
- ...( isDateOnly ? defaultTimeDateOnly : { } ) ,
121
- } ) ;
109
+ const current = getInternalValue ( ) || new Date ( ) ;
110
+
111
+ const updated = new Date ( current ) ;
112
+ updated . setFullYear ( date . year ( ) ) ;
113
+ updated . setMonth ( date . month ( ) ) ;
114
+ updated . setDate ( date . date ( ) ) ;
115
+
116
+ if ( isDateOnly ) {
117
+ updated . setHours ( defaultTimeDateOnly . hour ) ;
118
+ updated . setMinutes ( defaultTimeDateOnly . minute ) ;
119
+ updated . setSeconds ( defaultTimeDateOnly . second ) ;
120
+ }
121
+
122
122
const dateValue = isDateOnly
123
- ? base . format ( 'YYYY-MM-DD' )
124
- : base . toISOString ( ) ;
123
+ ? updated . toISOString ( ) . split ( 'T' ) [ 0 ] // YYYY-MM-DD
124
+ : updated . toISOString ( ) ;
125
+
125
126
onChange ( id , dateValue ) ;
126
127
}
127
128
setIsDefault ( false ) ;
128
129
} ;
129
130
130
131
const onTimeChange = ( time ) => {
131
132
if ( time ) {
132
- const base = ( getInternalValue ( ) || moment . default ( ) ) . set ( {
133
- hours : time ?. hours ( ) ?? 0 ,
134
- minutes : time ?. minutes ( ) ?? 0 ,
135
- seconds : 0 ,
136
- } ) ;
137
- const dateValue = base . toISOString ( ) ;
133
+ const current = getInternalValue ( ) || new Date ( ) ;
134
+ const updated = new Date ( current ) ;
135
+
136
+ updated . setHours ( time ?. hours ( ) ?? 0 ) ;
137
+ updated . setMinutes ( time ?. minutes ( ) ?? 0 ) ;
138
+ updated . setSeconds ( 0 ) ;
139
+
140
+ const dateValue = updated . toISOString ( ) ;
138
141
onChange ( id , dateValue ) ;
139
142
}
140
143
} ;
@@ -168,9 +171,13 @@ const DatetimeWidgetComponent = (props) => {
168
171
{ ...( noPastDates ? { } : { isOutsideRange : ( ) => false } ) }
169
172
onFocusChange = { onFocusChange }
170
173
noBorder
171
- displayFormat = { moment . default
172
- . localeData ( toBackendLang ( lang ) )
173
- . longDateFormat ( 'L' ) }
174
+ displayFormat = { ( date ) =>
175
+ date ?. toLocaleDateString ( toBackendLang ( lang ) , {
176
+ year : 'numeric' ,
177
+ month : '2-digit' ,
178
+ day : '2-digit' ,
179
+ } )
180
+ }
174
181
navPrev = { < PrevIcon /> }
175
182
navNext = { < NextIcon /> }
176
183
id = { `${ id } -date` }
@@ -192,9 +199,13 @@ const DatetimeWidgetComponent = (props) => {
192
199
showSecond = { false }
193
200
use12Hours = { lang === 'en' }
194
201
id = { `${ id } -time` }
195
- format = { moment . default
196
- . localeData ( toBackendLang ( lang ) )
197
- . longDateFormat ( 'LT' ) }
202
+ format = { ( date ) =>
203
+ date ?. toLocaleTimeString ( toBackendLang ( lang ) , {
204
+ hour : '2-digit' ,
205
+ minute : '2-digit' ,
206
+ hour12 : lang === 'en' ,
207
+ } )
208
+ }
198
209
placeholder = { intl . formatMessage ( messages . time ) }
199
210
focusOnOpen
200
211
placement = "bottomRight"
@@ -240,6 +251,4 @@ DatetimeWidgetComponent.defaultProps = {
240
251
resettable : true ,
241
252
} ;
242
253
243
- export default injectLazyLibs ( [ 'reactDates' , 'moment' ] ) (
244
- DatetimeWidgetComponent ,
245
- ) ;
254
+ export default injectLazyLibs ( [ 'reactDates' ] ) ( DatetimeWidgetComponent ) ;
0 commit comments