Skip to content

Commit fc02709

Browse files
authored
refactor(ui): drop moment.js (#2644)
* refactor(ui): drop moment.js Project has two libs to work with dates date-fns and moment.js. As moment.js > We now generally consider Moment to be a legacy project in maintenance mode. It is not dead, but it is indeed done. * bump date-fns to version 3.2
1 parent be73fe7 commit fc02709

File tree

5 files changed

+43
-69
lines changed

5 files changed

+43
-69
lines changed

ui/package-lock.json

+9-32
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@
2525
"@types/react-redux": "^7.1.31",
2626
"buffer": "^6.0.3",
2727
"clsx": "^2.1.0",
28-
"date-fns": "^2.30.0",
28+
"date-fns": "^3.2.0",
2929
"dotenv": "^16.3.1",
3030
"formik": "^2.4.5",
3131
"highlight.js": "^11.9.0",
32-
"moment": "^2.30.1",
3332
"monaco-editor": "^0.45.0",
3433
"monaco-themes": "^0.4.4",
3534
"nightwind": "^1.1.13",

ui/src/app/preferences/Preferences.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export default function Preferences() {
7373
Display dates and times in UTC timezone
7474
</p>
7575
<p className="text-gray-400 mt-2 text-sm">
76-
{inTimezone(new Date().toUTCString())}
76+
{inTimezone(new Date().toISOString())}
7777
</p>
7878
</Switch.Label>
7979
<dd className="text-gray-900 mt-1 flex text-sm sm:col-span-2 sm:mt-0">

ui/src/components/segments/ConstraintForm.tsx

+27-31
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Dialog } from '@headlessui/react';
22
import { QuestionMarkCircleIcon } from '@heroicons/react/20/solid';
33
import { XMarkIcon } from '@heroicons/react/24/outline';
4+
import { addMinutes, format, formatISO, parseISO } from 'date-fns';
45
import { Form, Formik, useField, useFormikContext } from 'formik';
5-
import moment from 'moment';
66
import { forwardRef, useEffect, useState } from 'react';
77
import { useSelector } from 'react-redux';
88
import { Link } from 'react-router-dom';
@@ -132,40 +132,40 @@ function ConstraintValueDateTimeInput(props: ConstraintInputProps) {
132132

133133
const [field] = useField({
134134
...props,
135-
validate: (value) => {
136-
const m = moment(value);
137-
return m.isValid() ? undefined : 'Value is not a valid datetime';
135+
validate: (value: string) => {
136+
const m = parseISO(value);
137+
return m ? undefined : 'Value is not a valid datetime';
138138
}
139139
});
140140

141-
const [fieldDate, setFieldDate] = useState(field.value?.split('T')[0] || '');
142-
const [fieldTime, setFieldTime] = useState(field.value?.split('T')[1] || '');
141+
const [fieldDate, setFieldDate] = useState('');
142+
const [fieldTime, setFieldTime] = useState('');
143143

144144
useEffect(() => {
145-
// if both date and time are set, then combine, parse, and set the value
146-
if (
147-
fieldDate &&
148-
fieldDate.trim() !== '' &&
149-
fieldTime &&
150-
fieldTime.trim() !== ''
151-
) {
152-
if (timezone === Timezone.LOCAL) {
153-
// if local timezone, then parse as local (moment default) and convert to UTC
154-
const m = moment(`${fieldDate}T${fieldTime}`);
155-
setFieldValue(field.name, m.utc().format());
156-
return;
145+
if (field.value) {
146+
let m = parseISO(field.value);
147+
if (timezone === Timezone.UTC) {
148+
// if utc timezone, then convert to UTC
149+
m = addMinutes(m, m.getTimezoneOffset());
157150
}
158-
159-
// otherwise, parse as UTC
160-
const m = moment.utc(`${fieldDate}T${fieldTime}`);
161-
setFieldValue(field.name, m.format());
162-
return;
151+
setFieldDate(format(m, 'yyyy-MM-dd'));
152+
setFieldTime(format(m, 'HH:mm'));
163153
}
154+
}, [field.value, timezone]);
164155

165-
// otherwise, if only date is set, then parse and set the value
156+
useEffect(() => {
157+
// if both date and time are set, then combine, parse, and set the value
166158
if (fieldDate && fieldDate.trim() !== '') {
167-
const m = moment(fieldDate);
168-
setFieldValue(field.name, m.utc().format());
159+
let d = `${fieldDate}T00:00:00`;
160+
if (fieldTime && fieldTime.trim() !== '') {
161+
d = `${fieldDate}T${fieldTime}:00`;
162+
}
163+
let m = parseISO(d);
164+
if (timezone === Timezone.UTC) {
165+
// if utc timezone, then convert to UTC
166+
m = addMinutes(m, -m.getTimezoneOffset());
167+
}
168+
setFieldValue(field.name, formatISO(m));
169169
}
170170
}, [timezone, field.name, fieldDate, fieldTime, setFieldValue]);
171171

@@ -209,11 +209,7 @@ function ConstraintValueDateTimeInput(props: ConstraintInputProps) {
209209
type="time"
210210
id="valueTime"
211211
name="valueTime"
212-
value={
213-
timezone === Timezone.LOCAL
214-
? moment(fieldTime, 'HH:mm Z').format('HH:mm')
215-
: moment.utc(fieldTime, 'HH:mm Z').format('HH:mm')
216-
}
212+
value={fieldTime}
217213
onChange={(e) => {
218214
setFieldTime(e.target.value);
219215
}}

ui/src/data/hooks/timezone.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import moment from 'moment';
1+
import { addMinutes, format, parseISO } from 'date-fns';
22
import { useSelector } from 'react-redux';
33
import { selectTimezone } from '~/app/preferences/preferencesSlice';
44
import { Timezone } from '~/types/Preferences';
@@ -7,9 +7,11 @@ export const useTimezone = () => {
77
const timezone = useSelector(selectTimezone);
88

99
const inTimezone = (v: string) => {
10+
const d = parseISO(v);
1011
return timezone === Timezone.LOCAL
11-
? moment(v).format('YYYY-MM-DD HH:mm:ss')
12-
: moment.utc(v).format('YYYY-MM-DD HH:mm:ss') + ' UTC';
12+
? format(d, 'yyyy-MM-dd HH:mm:ss')
13+
: format(addMinutes(d, d.getTimezoneOffset()), 'yyyy-MM-dd HH:mm:ss') +
14+
' UTC';
1315
};
1416

1517
return {

0 commit comments

Comments
 (0)