File tree 4 files changed +49
-3
lines changed
4 files changed +49
-3
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ export function FormExamples() {
21
21
switchField2 : true ,
22
22
checkboxField2 : true ,
23
23
radioField2 : 'b' ,
24
+ dateField : new Date ( ) . toISOString ( ) ,
24
25
} }
25
26
onChange = { console . info }
26
27
onSubmit = { ( formData , reset ) => {
@@ -105,7 +106,7 @@ export function FormExamples() {
105
106
< FormGroupInput name = "numberField" label = "Number field" type = "number" />
106
107
</ div >
107
108
< div className = "col" >
108
- < FormGroupInput name = "dateField" label = "Date field " type = "datetime-local" />
109
+ < FormGroupInput name = "dateField" label = "Date field" type = "datetime-local" />
109
110
</ div >
110
111
</ div >
111
112
Original file line number Diff line number Diff line change 1
1
import { useContext } from 'react' ;
2
2
import { FormContext } from './form-helpers' ;
3
+ import { toDatetimeLocal , fromDatetimeLocal } from '../../utils/formatters' ;
3
4
4
5
export function useFormControl ( name , type ) {
5
6
const formState = useContext ( FormContext ) ;
@@ -44,7 +45,7 @@ function encode(value, type) {
44
45
}
45
46
46
47
if ( type === 'datetime-local' ) {
47
- return value && value . toISOString ( ) . slice ( 0 , 16 ) ;
48
+ return toDatetimeLocal ( value ) ;
48
49
}
49
50
50
51
return value ;
@@ -58,7 +59,7 @@ function getTargetValue(target) {
58
59
}
59
60
60
61
if ( target . type === 'datetime-local' ) {
61
- value = new Date ( Date . parse ( target . value ) ) ;
62
+ value = fromDatetimeLocal ( target . value ) ;
62
63
}
63
64
64
65
if ( target . type === 'select-one' ) {
Original file line number Diff line number Diff line change
1
+ import { isISOString , isDate } from './types' ;
2
+
3
+ export function toDatetimeLocal ( value ) {
4
+ let date = value ;
5
+
6
+ if ( isISOString ( date ) ) {
7
+ date = new Date ( date ) ;
8
+ }
9
+
10
+ if ( ! isDate ( date ) ) {
11
+ throw new Error ( 'toDatetimeLocal only accepts date objects and ISO date strings' ) ;
12
+ }
13
+
14
+ const YYYY = date . getFullYear ( ) . toString ( ) ;
15
+ const MM = ( date . getMonth ( ) + 1 ) . toString ( ) . padStart ( 2 , '0' ) ;
16
+ const DD = date . getDate ( ) . toString ( ) . padStart ( 2 , '0' ) ;
17
+ const hh = date . getHours ( ) . toString ( ) . padStart ( 2 , '0' ) ;
18
+ const mm = date . getMinutes ( ) . toString ( ) . padStart ( 2 , '0' ) ;
19
+
20
+ return `${ YYYY } -${ MM } -${ DD } T${ hh } :${ mm } ` ;
21
+ }
22
+
23
+ export function fromDatetimeLocal ( value ) {
24
+ return new Date ( Date . parse ( value ) ) ;
25
+ }
Original file line number Diff line number Diff line change
1
+ export function isISOString ( value ) {
2
+ if ( ! isString ( value ) ) {
3
+ return false ;
4
+ }
5
+
6
+ if ( value . length !== 24 ) {
7
+ return false ;
8
+ }
9
+
10
+ return / ^ \d { 4 } - \d { 2 } - \d { 2 } T \d { 2 } : \d { 2 } : \d { 2 } \. \d { 3 } Z $ / . test ( value ) ;
11
+ }
12
+
13
+ export function isString ( value ) {
14
+ return typeof value === 'string' ;
15
+ }
16
+
17
+ export function isDate ( value ) {
18
+ return Object . prototype . toString . call ( value ) === '[object Date]' ;
19
+ }
You can’t perform that action at this time.
0 commit comments