1
- import React , { useEffect , useState } from "react" ;
1
+ import React from "react" ;
2
2
3
3
import MenuItem from "src/react/shared/menu-item" ;
4
4
import Stack from "src/react/shared/stack" ;
@@ -13,7 +13,7 @@ import { DateFormat } from "src/shared/types/types";
13
13
import { useCompare } from "src/shared/hooks" ;
14
14
import DateFormatMenu from "./components/DateFormatMenu" ;
15
15
import { useMenu } from "src/shared/menu/hooks" ;
16
- import { MenuLevel } from "src/shared/menu/types" ;
16
+ import { MenuCloseRequest , MenuLevel } from "src/shared/menu/types" ;
17
17
18
18
import MenuTrigger from "src/react/shared/menu-trigger" ;
19
19
import { getDisplayNameForDateFormat } from "src/shared/table-state/display-name" ;
@@ -25,7 +25,7 @@ import { useMenuTriggerPosition, useShiftMenu } from "src/shared/menu/utils";
25
25
26
26
interface Props {
27
27
value : number | null ;
28
- menuCloseRequestTime : number | null ;
28
+ menuCloseRequest : MenuCloseRequest | null ;
29
29
dateFormat : DateFormat ;
30
30
onDateTimeChange : ( value : number | null ) => void ;
31
31
onDateFormatChange : ( value : DateFormat ) => void ;
@@ -34,7 +34,7 @@ interface Props {
34
34
35
35
export default function DateCellEdit ( {
36
36
value,
37
- menuCloseRequestTime ,
37
+ menuCloseRequest ,
38
38
dateFormat,
39
39
onDateTimeChange,
40
40
onMenuClose,
@@ -50,53 +50,54 @@ export default function DateCellEdit({
50
50
leftOffset : - 50 ,
51
51
} ) ;
52
52
53
- const [ localValue , setLocalValue ] = useState (
53
+ const [ localValue , setLocalValue ] = React . useState (
54
54
value === null ? "" : unixTimeToDateString ( value , dateFormat )
55
55
) ;
56
56
57
- const [ isInputInvalid , setInputInvalid ] = useState ( false ) ;
58
- const [ closeTime , setCloseTime ] = useState ( 0 ) ;
57
+ const [ isInputInvalid , setInputInvalid ] = React . useState ( false ) ;
58
+ const [ closeTime , setCloseTime ] = React . useState ( 0 ) ;
59
59
const inputRef = React . useRef < HTMLInputElement | null > ( null ) ;
60
60
61
- useEffect ( ( ) => {
61
+ React . useEffect ( ( ) => {
62
62
setLocalValue (
63
63
value === null ? "" : unixTimeToDateString ( value , dateFormat )
64
64
) ;
65
65
} , [ value , dateFormat ] ) ;
66
66
67
- const hasCloseRequestTimeChange = useCompare ( menuCloseRequestTime ) ;
68
- useEffect ( ( ) => {
67
+ const hasCloseRequestTimeChanged = useCompare (
68
+ menuCloseRequest ?. requestTime
69
+ ) ;
70
+ React . useEffect ( ( ) => {
69
71
function validateInput ( ) {
70
- let value : number | null = null ;
72
+ let newValue : number | null = null ;
71
73
//If the user has not entered a value, we don't need to validate the date format
72
74
if ( localValue !== "" ) {
73
- if ( ! isValidDateFormat ( localValue , dateFormat ) ) {
74
- setInputInvalid ( true ) ;
75
- return ;
75
+ if ( isValidDateFormat ( localValue , dateFormat ) ) {
76
+ //Convert local value to unix time
77
+ newValue = dateStringToUnixTime ( localValue , dateFormat ) ;
78
+ } else {
79
+ if ( menuCloseRequest ?. type === "enter" ) {
80
+ setInputInvalid ( true ) ;
81
+ return ;
82
+ }
83
+ newValue = value ;
76
84
}
77
- //Convert local value to unix time
78
- value = dateStringToUnixTime ( localValue , dateFormat ) ;
79
85
}
80
86
81
87
setInputInvalid ( false ) ;
82
- onDateTimeChange ( value ) ;
88
+ onDateTimeChange ( newValue ) ;
83
89
setCloseTime ( Date . now ( ) ) ;
84
90
}
85
91
86
- if ( hasCloseRequestTimeChange && menuCloseRequestTime !== null )
92
+ if ( hasCloseRequestTimeChanged && menuCloseRequest !== null )
87
93
validateInput ( ) ;
88
- } , [
89
- hasCloseRequestTimeChange ,
90
- localValue ,
91
- menuCloseRequestTime ,
92
- dateFormat ,
93
- ] ) ;
94
+ } , [ hasCloseRequestTimeChanged , localValue , menuCloseRequest , dateFormat ] ) ;
94
95
95
96
//If we call onMenuClose directly in the validateInput function, we can see the cell markdown
96
97
//change to the new value as the menu closes
97
98
//If we call onMenuClose in a useEffect, we wait an entire render cycle before closing the menu
98
99
//This allows us to see the cell markdown change to the new value before the menu closes
99
- useEffect ( ( ) => {
100
+ React . useEffect ( ( ) => {
100
101
if ( closeTime !== 0 ) {
101
102
onMenuClose ( ) ;
102
103
}
0 commit comments