Skip to content

Commit daa61e6

Browse files
committed
build: [PROD-13949] upgrade date-pickers to version 7
1 parent fa654db commit daa61e6

File tree

3 files changed

+964
-1143
lines changed

3 files changed

+964
-1143
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"@testing-library/user-event": "^14.5.2",
4545
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
4646
"babel-jest": "^29.7.0",
47+
"dayjs": "^1.11.13",
4748
"eslint": "^8.57.0",
4849
"eslint-config-prettier": "^9.1.0",
4950
"eslint-config-standard": "^17.1.0",
@@ -86,7 +87,7 @@
8687
"dependencies": {
8788
"@emotion/react": "^11.13.0",
8889
"@emotion/styled": "^11.13.0",
89-
"@mui/x-date-pickers": "^5.0.20",
90+
"@mui/x-date-pickers": "^7.0.0",
9091
"@nosferatu500/react-sortable-tree": "^3.0.6",
9192
"ag-grid-community": "~32.0.2",
9293
"ag-grid-react": "~32.0.2",

src/inputs/BasicInputs/BasicDateInput/BasicDateInput.js

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
// Copyright (c) Cosmo Tech.
22
// Licensed under the MIT license.
3-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
3+
import React, { useCallback } from 'react';
44
import PropTypes from 'prop-types';
5-
import { Stack, TextField } from '@mui/material';
5+
import { Stack } from '@mui/material';
66
import makeStyles from '@mui/styles/makeStyles';
7-
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
7+
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
88
import { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';
99
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
10-
import { DateUtils } from '@cosmotech/core';
10+
import dayjs from 'dayjs';
11+
import timezone from 'dayjs/plugin/timezone';
12+
import utc from 'dayjs/plugin/utc';
1113
import { TooltipInfo } from '../../../misc';
1214
import { getCommonInputStyles } from '../../style';
1315
import { BasicInputPlaceholder } from '../BasicInputPlaceholder';
1416

1517
const useStyles = makeStyles(getCommonInputStyles);
18+
dayjs.extend(utc);
19+
dayjs.extend(timezone);
1620

17-
const _computeInternalDate = (value, reverseTimezoneOffset) => {
18-
if (value == null) return value;
19-
return reverseTimezoneOffset ? DateUtils.addLocalDateToUTCOffset(value) : value;
20-
};
21-
22-
const _getInternalDateToReturnToParent = (value, reverseTimezoneOffset) => {
23-
if (value == null) return value;
24-
return reverseTimezoneOffset ? DateUtils.addUTCToLocalDateOffset(value) : value;
25-
};
21+
const TIME_ZONE = 'UTC';
2622

2723
export const BasicDateInput = (props) => {
2824
const {
@@ -41,30 +37,11 @@ export const BasicDateInput = (props) => {
4137
} = props;
4238
const classes = useStyles();
4339

44-
// DesktopDatePicker always work in users' local time, meaning that dates provided as UTC may be displayed as a
45-
// different day based on users' timezeone offset. For uses cases that only need tha "date" part withtout "time", we
46-
// should ignore timezones and must thus add an internal state to reverse the timezone offset (this behavior is
47-
// enabled only if reverseTimezoneOffset is set to true)
48-
const [internalDate, setInternalDate] = useState(_computeInternalDate(value, reverseTimezoneOffset));
49-
const minDate = useMemo(
50-
() => _computeInternalDate(dateProps.minDate, reverseTimezoneOffset),
51-
[dateProps, reverseTimezoneOffset]
52-
);
53-
const maxDate = useMemo(
54-
() => _computeInternalDate(dateProps.maxDate, reverseTimezoneOffset),
55-
[dateProps, reverseTimezoneOffset]
56-
);
57-
58-
useEffect(() => {
59-
setInternalDate(_computeInternalDate(value, reverseTimezoneOffset));
60-
}, [reverseTimezoneOffset, value]);
61-
6240
const onChange = useCallback(
6341
(newValue) => {
64-
setInternalDate(newValue);
65-
changeSelectedDate(_getInternalDateToReturnToParent(newValue, reverseTimezoneOffset));
42+
changeSelectedDate(newValue == null ? newValue : new Date(newValue?.format()));
6643
},
67-
[reverseTimezoneOffset, changeSelectedDate]
44+
[changeSelectedDate]
6845
);
6946

7047
if (dateProps.disabled)
@@ -73,7 +50,7 @@ export const BasicDateInput = (props) => {
7350
id={`date-input-${id}`}
7451
label={label}
7552
tooltipText={tooltipText}
76-
value={internalDate?.toLocaleDateString() ?? ''}
53+
value={value?.toLocaleDateString('en-US', { timeZone: TIME_ZONE }) ?? ''}
7754
{...otherProps}
7855
/>
7956
);
@@ -86,26 +63,26 @@ export const BasicDateInput = (props) => {
8663
className={isDirty ? classes.dirtyInput : isDirty === false ? classes.notDirtyInput : ''}
8764
sx={{ alignItems: 'center' }}
8865
>
89-
<LocalizationProvider dateAdapter={AdapterDateFns}>
66+
<LocalizationProvider dateAdapter={AdapterDayjs}>
9067
<DesktopDatePicker
9168
label={label}
9269
inputFormat={format}
93-
minDate={minDate}
94-
maxDate={maxDate}
95-
renderInput={({ error: _, ...params }) => (
96-
<TextField
97-
id={`date-text-field-${id}`}
98-
variant="outlined"
99-
sx={{ flexGrow: 1 }}
100-
size={size}
101-
error={error?.message?.length > 0}
102-
helperText={error?.message ?? ''}
103-
{...params}
104-
/>
105-
)}
70+
minDate={dateProps.minDate ? dayjs(dateProps.minDate) : null}
71+
maxDate={dateProps.minDate ? dayjs(dateProps.maxDate) : null}
72+
timezone={TIME_ZONE}
73+
slotProps={{
74+
textField: {
75+
id: `date-text-field-${id}`,
76+
variant: 'outlined',
77+
sx: { flexGrow: 1 },
78+
error: error?.message?.length > 0,
79+
helperText: error?.message ?? '',
80+
size,
81+
},
82+
}}
10683
id={`date-input-${id}`}
10784
onChange={onChange}
108-
value={internalDate ?? new Date(undefined)}
85+
value={dayjs(value)}
10986
/>
11087
</LocalizationProvider>
11188
<TooltipInfo title={tooltipText} variant="small" />

0 commit comments

Comments
 (0)