ferns-ui 0.44.2 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/Common.d.ts +16 -0
  2. package/dist/DateTimeActionSheet.d.ts +1 -1
  3. package/dist/DateTimeActionSheet.js +130 -95
  4. package/dist/DateTimeActionSheet.js.map +1 -1
  5. package/dist/DateTimeField.android.d.ts +1 -1
  6. package/dist/DateTimeField.android.js +20 -20
  7. package/dist/DateTimeField.android.js.map +1 -1
  8. package/dist/DateTimeField.ios.d.ts +1 -1
  9. package/dist/DateTimeField.ios.js +21 -21
  10. package/dist/DateTimeField.ios.js.map +1 -1
  11. package/dist/DateUtilities.d.ts +50 -0
  12. package/dist/DateUtilities.js +240 -0
  13. package/dist/DateUtilities.js.map +1 -0
  14. package/dist/DateUtilities.test.d.ts +1 -0
  15. package/dist/DateUtilities.test.js +270 -0
  16. package/dist/DateUtilities.test.js.map +1 -0
  17. package/dist/Field.d.ts +1 -1
  18. package/dist/Field.js +2 -2
  19. package/dist/Field.js.map +1 -1
  20. package/dist/TextField.d.ts +1 -1
  21. package/dist/TextField.js +36 -34
  22. package/dist/TextField.js.map +1 -1
  23. package/dist/TextFieldNumberActionSheet.js +1 -2
  24. package/dist/TextFieldNumberActionSheet.js.map +1 -1
  25. package/dist/TimezonePicker.d.ts +3 -0
  26. package/dist/TimezonePicker.js +26 -0
  27. package/dist/TimezonePicker.js.map +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/setupTests.d.ts +0 -0
  32. package/dist/setupTests.js +3 -0
  33. package/dist/setupTests.js.map +1 -0
  34. package/package.json +37 -54
  35. package/src/Common.ts +19 -0
  36. package/src/DateTimeActionSheet.tsx +178 -119
  37. package/src/DateTimeField.android.tsx +18 -17
  38. package/src/DateTimeField.ios.tsx +19 -18
  39. package/src/DateUtilities.test.ts +417 -0
  40. package/src/DateUtilities.tsx +296 -0
  41. package/src/Field.tsx +2 -0
  42. package/src/TextField.tsx +34 -31
  43. package/src/TextFieldNumberActionSheet.tsx +1 -2
  44. package/src/TimezonePicker.tsx +52 -0
  45. package/src/index.tsx +1 -0
  46. package/src/setupTests.ts +1 -0
  47. package/dist/dayjsExtended.d.ts +0 -2
  48. package/dist/dayjsExtended.js +0 -10
  49. package/dist/dayjsExtended.js.map +0 -1
  50. package/src/dayjsExtended.ts +0 -11
@@ -1,18 +1,20 @@
1
1
  import {Picker} from "@react-native-picker/picker";
2
+ import {getCalendars} from "expo-localization";
2
3
  import range from "lodash/range";
4
+ import {DateTime} from "luxon";
3
5
  import React, {useContext, useEffect, useState} from "react";
4
6
  import {Platform, StyleProp, TextInput, TextStyle, View} from "react-native";
5
7
  import {Calendar} from "react-native-calendars";
6
8
 
7
9
  import {Box} from "./Box";
8
10
  import {DateTimeActionSheetProps} from "./Common";
9
- import dayjs from "./dayjsExtended";
10
11
  import {Heading} from "./Heading";
11
12
  import {IconButton} from "./IconButton";
12
13
  import {isMobileDevice} from "./MediaQuery";
13
14
  import {Modal} from "./Modal";
14
15
  import {SelectList} from "./SelectList";
15
16
  import {ThemeContext} from "./Theme";
17
+ import {TimezonePicker} from "./TimezonePicker";
16
18
 
17
19
  const TIME_PICKER_HEIGHT = 104;
18
20
  const INPUT_HEIGHT = 40;
@@ -107,7 +109,7 @@ const CalendarHeader = ({
107
109
  addMonth: (num: number) => void;
108
110
  month: Date[];
109
111
  }): React.ReactElement => {
110
- const displayDate = dayjs(month[0]).format("MMM YYYY");
112
+ const displayDate = DateTime.fromJSDate(month[0]).toFormat("MMM yyyy");
111
113
  return (
112
114
  <Box alignItems="center" direction="row" height={40} justifyContent="between" width="100%">
113
115
  <IconButton
@@ -156,11 +158,13 @@ const CalendarHeader = ({
156
158
  };
157
159
 
158
160
  // For mobile, renders all components in an action sheet. For web, renders all components in a
159
- // modal. For mobile: If mode is "time", renders a spinner picker for time picker on both platforms.
160
- // If mode is "date", renders our custom calendar on both platforms. If mode is "datetime",
161
- // renders a spinner picker for time picker and our custom calendar on both platforms. For web,
162
- // renders a simplistic text box for time picker and a calendar for date picker in a modal In the
163
- // future, web time picker should be a typeahead dropdown like Google calendar.
161
+ // modal. For mobile:
162
+ // If mode is "time", renders a spinner picker for time picker on both platforms.
163
+ // If mode is "date", renders our custom calendar on both platforms.
164
+ // If mode is "datetime",renders a spinner picker for time picker and our custom calendar on both
165
+ // platforms.
166
+ // For web, renders a simplistic text box for time picker and a calendar for date picker
167
+ // in a modal In the future, web time picker should be a typeahead dropdown like Google calendar.
164
168
  export const DateTimeActionSheet = ({
165
169
  // actionSheetRef,
166
170
  mode,
@@ -168,103 +172,121 @@ export const DateTimeActionSheet = ({
168
172
  onChange,
169
173
  visible,
170
174
  onDismiss,
175
+ transformValue,
171
176
  }: DateTimeActionSheetProps) => {
172
177
  const {theme} = useContext(ThemeContext);
173
178
 
174
- // Accept ISO 8601, HH:mm, or hh:mm A formats. We may want only HH:mm or hh:mm A for mode=time
175
- let m;
176
- if (value) {
177
- m = dayjs(value, ["YYYY", "YYYY-MM-DD", "HH:mm", "hh:mm A"]);
178
- } else {
179
- m = dayjs();
179
+ const calendar = getCalendars()[0];
180
+ const originalTimezone = transformValue?.options?.timezone || calendar?.timeZone;
181
+ const [timezone, setTimezone] = useState<string | undefined>(originalTimezone);
182
+ if (!timezone) {
183
+ console.error(
184
+ "Could not automatically determine timezone and none was provided to DateTimeActionSheet."
185
+ );
180
186
  }
181
187
 
182
- if (!m.isValid()) {
183
- throw new Error(`Invalid date/time value ${value}`);
188
+ if (typeof value !== "string" && typeof value !== "undefined") {
189
+ console.error(`Datetime only accepts string or undefined value, not ${typeof value}: ${value}`);
184
190
  }
185
191
 
186
- let hr = dayjs(m).hour() % 12;
187
- if (hr === 0) {
188
- hr = 12;
189
- }
192
+ // Accept ISO 8601, HH:mm, or hh:mm A formats. We may want only HH:mm or hh:mm A for mode=time
190
193
 
191
- const [hour, setHour] = useState<number>(hr);
192
- const [minute, setMinute] = useState<number>(dayjs(m).minute());
193
- const [amPm, setAmPm] = useState<"am" | "pm">(dayjs(m).format("a") === "am" ? "am" : "pm");
194
- const [date, setDate] = useState<string>(dayjs(m).toISOString());
194
+ const [hour, setHour] = useState<number>(0);
195
+ const [minute, setMinute] = useState<number>(0);
196
+ const [amPm, setAmPm] = useState<"am" | "pm">("am");
197
+ const [date, setDate] = useState<string>("");
195
198
 
196
199
  // If the value changes in the props, update the state for the date and time.
197
200
  useEffect(() => {
198
201
  let datetime;
199
202
  if (value) {
200
- datetime = dayjs(value, ["YYYY", "YYYY-MM-DD", "HH:mm", "hh:mm A"]);
203
+ datetime = DateTime.fromISO(value).setZone(timezone).set({millisecond: 0, second: 0});
201
204
  } else {
202
- datetime = dayjs();
205
+ datetime = DateTime.now().setZone(timezone).set({millisecond: 0, second: 0});
206
+ }
207
+ if (!datetime.isValid) {
208
+ throw new Error(
209
+ `Invalid date/time value ${value}, datetime ${datetime} timezone: ${timezone}`
210
+ );
203
211
  }
204
- let h = dayjs(datetime).hour() % 12;
212
+
213
+ let h = datetime.hour % 12;
205
214
  if (h === 0) {
206
215
  h = 12;
207
216
  }
208
217
  setHour(h);
209
- setMinute(dayjs(datetime).minute());
210
- setAmPm(dayjs(datetime).format("a") === "am" ? "am" : "pm");
211
- setDate(dayjs(datetime).toISOString());
212
- }, [value]);
218
+ setMinute(datetime.minute);
219
+ setAmPm(datetime.toFormat("a") === "am" ? "am" : "pm");
220
+ setDate(datetime.toISO());
221
+ // eslint-disable-next-line react-hooks/exhaustive-deps
222
+ }, [value, transformValue, transformValue?.options?.timezone]);
213
223
 
214
224
  // TODO Support 24 hour time for time picker.
215
225
  const renderMobileTime = () => {
216
226
  return (
217
- <Box direction="row" width="100%">
218
- <Box paddingY={2} width="35%">
219
- <Picker
220
- itemStyle={{
221
- height: TIME_PICKER_HEIGHT,
222
- }}
223
- selectedValue={hour}
224
- style={{
225
- height: TIME_PICKER_HEIGHT,
226
- backgroundColor: "#FFFFFF",
227
- }}
228
- onValueChange={(itemValue) => setHour(itemValue)}
229
- >
230
- {hours.map((n) => (
231
- <Picker.Item key={String(n)} label={String(n)} value={String(n)} />
232
- ))}
233
- </Picker>
234
- </Box>
235
- <Box paddingY={2} width="35%">
236
- <Picker
237
- itemStyle={{
238
- height: TIME_PICKER_HEIGHT,
239
- }}
240
- selectedValue={minute}
241
- style={{
242
- height: TIME_PICKER_HEIGHT,
243
- backgroundColor: "#FFFFFF",
244
- }}
245
- onValueChange={(itemValue) => setMinute(itemValue)}
246
- >
247
- {minutes.map((n) => (
248
- <Picker.Item key={String(n)} label={String(n)} value={String(n)} />
249
- ))}
250
- </Picker>
251
- </Box>
252
- <Box paddingY={2} width="30%">
253
- <Picker
254
- itemStyle={{
255
- height: TIME_PICKER_HEIGHT,
256
- }}
257
- selectedValue={amPm}
258
- style={{
259
- height: TIME_PICKER_HEIGHT,
260
- backgroundColor: "#FFFFFF",
261
- }}
262
- onValueChange={(itemValue) => setAmPm(itemValue)}
263
- >
264
- <Picker.Item key="am" label="am" value="am" />
265
- <Picker.Item key="pm" label="pm" value="pm" />
266
- </Picker>
227
+ <Box>
228
+ <Box direction="row" width="100%">
229
+ <Box paddingY={2} width="35%">
230
+ <Picker
231
+ itemStyle={{
232
+ height: TIME_PICKER_HEIGHT,
233
+ }}
234
+ selectedValue={hour}
235
+ style={{
236
+ height: TIME_PICKER_HEIGHT,
237
+ backgroundColor: "#FFFFFF",
238
+ }}
239
+ onValueChange={(itemValue) => setHour(itemValue)}
240
+ >
241
+ {hours.map((n) => (
242
+ <Picker.Item key={String(n)} label={String(n)} value={String(n)} />
243
+ ))}
244
+ </Picker>
245
+ </Box>
246
+ <Box paddingY={2} width="35%">
247
+ <Picker
248
+ itemStyle={{
249
+ height: TIME_PICKER_HEIGHT,
250
+ }}
251
+ selectedValue={minute}
252
+ style={{
253
+ height: TIME_PICKER_HEIGHT,
254
+ backgroundColor: "#FFFFFF",
255
+ }}
256
+ onValueChange={(itemValue) => setMinute(itemValue)}
257
+ >
258
+ {minutes.map((n) => (
259
+ <Picker.Item key={String(n)} label={String(n)} value={String(n)} />
260
+ ))}
261
+ </Picker>
262
+ </Box>
263
+ <Box paddingY={2} width="30%">
264
+ <Picker
265
+ itemStyle={{
266
+ height: TIME_PICKER_HEIGHT,
267
+ }}
268
+ selectedValue={amPm}
269
+ style={{
270
+ height: TIME_PICKER_HEIGHT,
271
+ backgroundColor: "#FFFFFF",
272
+ }}
273
+ onValueChange={(itemValue) => setAmPm(itemValue)}
274
+ >
275
+ <Picker.Item key="am" label="am" value="am" />
276
+ <Picker.Item key="pm" label="pm" value="pm" />
277
+ </Picker>
278
+ </Box>
267
279
  </Box>
280
+ {Boolean(mode === "time" || mode === "datetime") && (
281
+ <Box paddingY={2}>
282
+ <TimezonePicker
283
+ showLabel={false}
284
+ timezone={timezone}
285
+ width="100%"
286
+ onChange={setTimezone}
287
+ />
288
+ </Box>
289
+ )}
268
290
  </Box>
269
291
  );
270
292
  };
@@ -289,7 +311,7 @@ export const DateTimeActionSheet = ({
289
311
  <TimeInput type="minute" value={minute} onChange={(v) => setMinute(v)} />
290
312
  </Box>
291
313
 
292
- <Box width={60}>
314
+ <Box marginRight={2} width={60}>
293
315
  <SelectList
294
316
  options={[
295
317
  {label: "am", value: "am"},
@@ -302,6 +324,11 @@ export const DateTimeActionSheet = ({
302
324
  }}
303
325
  />
304
326
  </Box>
327
+ {Boolean(mode === "time" || mode === "datetime") && (
328
+ <Box>
329
+ <TimezonePicker showLabel={false} timezone={timezone} onChange={setTimezone} />
330
+ </Box>
331
+ )}
305
332
  </Box>
306
333
  );
307
334
  };
@@ -317,17 +344,42 @@ export const DateTimeActionSheet = ({
317
344
 
318
345
  // Note: do not call this if waiting on a state change.
319
346
  const sendOnChange = () => {
320
- const hourChange = amPm === "pm" && hour !== 12 ? Number(hour) + 12 : Number(hour);
347
+ const militaryHour = amPm === "pm" && hour !== 12 ? Number(hour) + 12 : Number(hour);
348
+
321
349
  if (mode === "date") {
322
- onChange({value: date});
350
+ const v = DateTime.fromISO(date)
351
+ .setZone("UTC")
352
+ .set({hour: 0, minute: 0, second: 0, millisecond: 0})
353
+ .toISO();
354
+ if (!v || !DateTime.fromISO(v).isValid) {
355
+ throw new Error(`Invalid date: ${date}`);
356
+ }
357
+ onChange({value: v});
323
358
  } else if (mode === "time") {
324
- onChange({
325
- value: dayjs().hour(hourChange).minute(Number(minute)).toISOString(),
326
- });
359
+ const v = DateTime.fromISO(date)
360
+ .setZone(timezone)
361
+ .set({hour: militaryHour, minute, second: 0, millisecond: 0})
362
+ .setZone(timezone)
363
+ .setZone("UTC")
364
+ .toISO();
365
+ if (!v || !DateTime.fromISO(v).isValid) {
366
+ throw new Error(`Invalid date: ${date}`);
367
+ }
368
+ onChange({value: v});
327
369
  } else if (mode === "datetime") {
328
- onChange({
329
- value: dayjs(date).hour(hourChange).minute(Number(minute)).toISOString(),
330
- });
370
+ const v = DateTime.fromISO(date)
371
+ .setZone(timezone)
372
+ // Take from the original zone
373
+ // Set the value on the screen
374
+ .set({hour: militaryHour, minute, second: 0, millisecond: 0})
375
+ // Put that in the new timezone on the screen
376
+ // We always send back in UTC
377
+ .setZone("UTC")
378
+ .toISO();
379
+ if (!v || !DateTime.fromISO(v).isValid) {
380
+ throw new Error(`Invalid date: ${date}`);
381
+ }
382
+ onChange({value: v});
331
383
  }
332
384
  onDismiss();
333
385
  };
@@ -342,47 +394,54 @@ export const DateTimeActionSheet = ({
342
394
  // Renders our custom calendar component on mobile or web.
343
395
  const renderDateCalendar = () => {
344
396
  const markedDates: {[id: string]: {selected: boolean; selectedColor: string}} = {};
397
+
398
+ // Check if the date is T00:00:00.000Z (it should be), otherwise treat it as a date in the
399
+ // current timezone.
400
+ const dt = DateTime.fromISO(date).setZone("UTC");
401
+ let dateString;
402
+ if (dt.hour === 0 && dt.minute === 0 && dt.second === 0) {
403
+ dateString = dt.toFormat("yyyy-MM-dd");
404
+ } else {
405
+ dateString = dt.setZone().toFormat("yyyy-MM-dd");
406
+ }
407
+
345
408
  if (date) {
346
- markedDates[dayjs(date).format("YYYY-MM-DD")] = {
409
+ markedDates[dateString] = {
347
410
  selected: true,
348
411
  selectedColor: theme.primary,
349
412
  };
350
413
  }
351
414
  return (
352
- <Calendar
353
- customHeader={CalendarHeader}
354
- initialDate={dayjs(date).format("YYYY-MM-DD")}
355
- markedDates={markedDates}
356
- onDayPress={(day) => {
357
- setDate(day.dateString);
358
- // If mode is just date, we can shortcut and close right away.
359
- // time and datetime need to wait for the primary button.
360
- if (mode === "date") {
361
- onChange({value: day.dateString});
362
- onDismiss();
363
- }
364
- }}
365
- />
415
+ <Box width="100%">
416
+ <Box marginBottom={4} width="100%">
417
+ <Calendar
418
+ customHeader={CalendarHeader}
419
+ initialDate={dateString}
420
+ markedDates={markedDates}
421
+ onDayPress={(day) => {
422
+ setDate(day.dateString);
423
+ // If mode is just date, we can shortcut and close right away.
424
+ // time and datetime need to wait for the primary button.
425
+ if (mode === "date") {
426
+ onChange({value: day.dateString});
427
+ onDismiss();
428
+ }
429
+ }}
430
+ />
431
+ </Box>
432
+ </Box>
366
433
  );
367
434
  };
368
435
 
369
436
  const renderContent = (): React.ReactElement => {
370
- if (isMobileDevice()) {
371
- if (mode === "date") {
372
- return renderDateCalendar();
373
- } else if (mode === "time") {
374
- return renderMobileTime();
375
- } else {
376
- return renderDateTime();
377
- }
437
+ if (mode === "date") {
438
+ return renderDateCalendar();
439
+ } else if (mode === "time" && isMobileDevice()) {
440
+ return renderMobileTime();
441
+ } else if (mode === "time" && !isMobileDevice()) {
442
+ return renderWebTime();
378
443
  } else {
379
- if (mode === "date") {
380
- return renderDateCalendar();
381
- } else if (mode === "time") {
382
- return renderWebTime();
383
- } else {
384
- return renderDateTime();
385
- }
444
+ return renderDateTime();
386
445
  }
387
446
  };
388
447
 
@@ -1,9 +1,10 @@
1
1
  import DateTimePicker from "@react-native-community/datetimepicker";
2
- import React, {ReactElement, useContext, useMemo, useState} from "react";
2
+ import {getCalendars} from "expo-localization";
3
+ import React, {ReactElement, useContext, useState} from "react";
3
4
  import {TextInput} from "react-native";
4
5
 
5
6
  import {DateTimeFieldProps} from "./Common";
6
- import dayjs from "./dayjsExtended";
7
+ import {printDate, printDateAndTime, printTime} from "./DateUtilities";
7
8
  import {ThemeContext} from "./Theme";
8
9
  import {WithLabel} from "./WithLabel";
9
10
 
@@ -13,7 +14,6 @@ export const DateTimeField = ({
13
14
  onChange,
14
15
  errorMessage,
15
16
  pickerType = "default",
16
- dateFormat,
17
17
  errorMessageColor,
18
18
  }: DateTimeFieldProps): ReactElement => {
19
19
  // const [showCalendar, setShowCalendar] = useState(false);
@@ -25,19 +25,20 @@ export const DateTimeField = ({
25
25
 
26
26
  const showCalendarFirst = mode === "datetime" || mode === "date";
27
27
 
28
- const defaultFormat = useMemo(() => {
29
- if (dateFormat) {
30
- return dateFormat;
31
- } else {
32
- if (mode === "date") {
33
- return "MMMM Do YYYY";
34
- } else if (mode === "time") {
35
- return "h:mm a";
36
- } else {
37
- return "MMMM Do YYYY, h:mm a";
38
- }
39
- }
40
- }, [mode, dateFormat]);
28
+ const calendar = getCalendars()[0];
29
+ const timezone = calendar?.timeZone;
30
+
31
+ let formattedValue;
32
+ if (mode === "date") {
33
+ formattedValue = printDate(value.toISOString(), {showTimezone: true, ignoreTime: true});
34
+ } else if (mode === "time") {
35
+ formattedValue = printTime(value.toISOString(), {
36
+ showTimezone: true,
37
+ timezone: timezone ?? "America/New_York",
38
+ });
39
+ } else {
40
+ formattedValue = printDateAndTime(value.toISOString(), {showTimezone: true});
41
+ }
41
42
 
42
43
  const showMode = (currentMode: "date" | "time") => {
43
44
  setShowPicker(true);
@@ -74,7 +75,7 @@ export const DateTimeField = ({
74
75
  fontFamily: theme.primaryFont,
75
76
  borderWidth: 1,
76
77
  }}
77
- value={dayjs(value).format(defaultFormat)}
78
+ value={formattedValue}
78
79
  onPressIn={() => {
79
80
  showCalendarFirst ? showDatePicker() : showTimePicker();
80
81
  }}
@@ -1,9 +1,10 @@
1
1
  import DateTimePicker from "@react-native-community/datetimepicker";
2
- import React, {ReactElement, useContext, useMemo, useState} from "react";
2
+ import {getCalendars} from "expo-localization";
3
+ import React, {ReactElement, useContext, useState} from "react";
3
4
  import {TextInput} from "react-native";
4
5
 
5
6
  import {DateTimeFieldProps} from "./Common";
6
- import dayjs from "./dayjsExtended";
7
+ import {printDate, printDateAndTime, printTime} from "./DateUtilities";
7
8
  import {ThemeContext} from "./Theme";
8
9
  import {WithLabel} from "./WithLabel";
9
10
 
@@ -13,26 +14,26 @@ export const DateTimeField = ({
13
14
  onChange,
14
15
  errorMessage,
15
16
  errorMessageColor,
16
- dateFormat,
17
17
  pickerType = "inline",
18
18
  label,
19
19
  }: DateTimeFieldProps): ReactElement => {
20
20
  const [showPicker, setShowPicker] = useState(false);
21
21
  const {theme} = useContext(ThemeContext);
22
22
 
23
- const defaultFormat = useMemo(() => {
24
- if (dateFormat) {
25
- return dateFormat;
26
- } else {
27
- if (mode === "date") {
28
- return "MMMM Do YYYY";
29
- } else if (mode === "time") {
30
- return "h:mm a";
31
- } else {
32
- return "MMMM Do YYYY, h:mm a";
33
- }
34
- }
35
- }, [mode, dateFormat]);
23
+ const calendar = getCalendars()[0];
24
+ const timezone = calendar?.timeZone;
25
+
26
+ let formattedValue;
27
+ if (mode === "date") {
28
+ formattedValue = printDate(value.toISOString(), {showTimezone: true, ignoreTime: true});
29
+ } else if (mode === "time") {
30
+ formattedValue = printTime(value.toISOString(), {
31
+ timezone: timezone ?? "America/New_York",
32
+ showTimezone: true,
33
+ });
34
+ } else {
35
+ formattedValue = printDateAndTime(value.toISOString(), {showTimezone: true});
36
+ }
36
37
 
37
38
  return (
38
39
  <WithLabel label={label} labelSize="lg">
@@ -56,7 +57,7 @@ export const DateTimeField = ({
56
57
  fontFamily: theme.primaryFont,
57
58
  borderWidth: 1,
58
59
  }}
59
- value={dayjs(value).format(defaultFormat)}
60
+ value={formattedValue}
60
61
  onPressIn={() => {
61
62
  setShowPicker(!showPicker);
62
63
  }}
@@ -69,7 +70,7 @@ export const DateTimeField = ({
69
70
  mode={mode}
70
71
  style={{alignSelf: "flex-start"}}
71
72
  testID="dateTimePicker"
72
- value={dayjs(value).toDate()}
73
+ value={value}
73
74
  onChange={(event: any, date: any) => {
74
75
  if (!date) {
75
76
  return;