@hero-design/rn 8.94.0 → 8.96.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 (61) hide show
  1. package/.turbo/turbo-build.log +7 -2
  2. package/CHANGELOG.md +12 -0
  3. package/es/index.js +1319 -966
  4. package/lib/index.js +1319 -965
  5. package/locales/en_AU.js +10 -0
  6. package/locales/en_AU.mjs +8 -0
  7. package/locales/en_CA.js +10 -0
  8. package/locales/en_CA.mjs +8 -0
  9. package/locales/index.js +11 -0
  10. package/locales/index.mjs +9 -0
  11. package/locales/types.js +2 -0
  12. package/locales/types.mjs +1 -0
  13. package/package.json +4 -3
  14. package/rollup.config.mjs +97 -58
  15. package/src/components/DatePicker/DatePickerAndroid.tsx +27 -7
  16. package/src/components/DatePicker/DatePickerCalendar.tsx +23 -4
  17. package/src/components/DatePicker/DatePickerIOS.tsx +27 -8
  18. package/src/components/DatePicker/__tests__/DatePicker.spec.tsx +30 -1
  19. package/src/components/DatePicker/__tests__/DatePickerAndroid.spec.tsx +27 -0
  20. package/src/components/DatePicker/__tests__/DatePickerCalendar.spec.tsx +27 -0
  21. package/src/components/DatePicker/__tests__/DatePickerIOS.spec.tsx +28 -1
  22. package/src/components/DatePicker/__tests__/__snapshots__/DatePickerIOS.spec.tsx.snap +1 -0
  23. package/src/components/DatePicker/hooks/__tests__/useFormatDate.spec.ts +61 -0
  24. package/src/components/DatePicker/{useCalculateDate.tsx → hooks/useCalculateDate.tsx} +1 -1
  25. package/src/components/DatePicker/hooks/useFormatDate.ts +25 -0
  26. package/src/components/DatePicker/hooks/utils.ts +30 -0
  27. package/src/components/DatePicker/types.ts +15 -1
  28. package/src/components/HeroDesignProvider/index.tsx +19 -6
  29. package/src/components/LocaleProvider/__tests__/utils.specs.ts +12 -0
  30. package/src/components/LocaleProvider/context.ts +7 -0
  31. package/src/components/LocaleProvider/hooks.ts +19 -0
  32. package/src/components/LocaleProvider/index.tsx +27 -0
  33. package/src/components/LocaleProvider/utils.ts +14 -0
  34. package/src/index.ts +2 -0
  35. package/src/locales/en_AU.ts +10 -0
  36. package/src/locales/en_CA.ts +10 -0
  37. package/src/locales/index.ts +7 -0
  38. package/src/locales/types.ts +12 -0
  39. package/src/testHelpers/renderWithTheme.tsx +7 -1
  40. package/src/types.ts +4 -0
  41. package/stats/8.95.0/rn-stats.html +4842 -0
  42. package/stats/8.96.0/rn-stats.html +4842 -0
  43. package/types/components/DatePicker/DatePickerAndroid.d.ts +1 -1
  44. package/types/components/DatePicker/DatePickerCalendar.d.ts +1 -1
  45. package/types/components/DatePicker/DatePickerIOS.d.ts +1 -1
  46. package/types/components/DatePicker/{useCalculateDate.d.ts → hooks/useCalculateDate.d.ts} +1 -1
  47. package/types/components/DatePicker/hooks/useFormatDate.d.ts +10 -0
  48. package/types/components/DatePicker/hooks/utils.d.ts +6 -0
  49. package/types/components/DatePicker/types.d.ts +8 -1
  50. package/types/components/HeroDesignProvider/index.d.ts +5 -1
  51. package/types/components/LocaleProvider/__tests__/utils.specs.d.ts +1 -0
  52. package/types/components/LocaleProvider/context.d.ts +3 -0
  53. package/types/components/LocaleProvider/hooks.d.ts +5 -0
  54. package/types/components/LocaleProvider/index.d.ts +7 -0
  55. package/types/components/LocaleProvider/utils.d.ts +3 -0
  56. package/types/index.d.ts +2 -1
  57. package/types/locales/en_AU.d.ts +3 -0
  58. package/types/locales/en_CA.d.ts +3 -0
  59. package/types/locales/index.d.ts +5 -0
  60. package/types/locales/types.d.ts +10 -0
  61. package/types/types.d.ts +2 -1
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ const locale = {
4
+ lang: 'en-AU',
5
+ dateTimeFormats: {
6
+ fullDate: 'dd/MM/yyyy',
7
+ },
8
+ };
9
+
10
+ module.exports = locale;
@@ -0,0 +1,8 @@
1
+ const locale = {
2
+ lang: 'en-AU',
3
+ dateTimeFormats: {
4
+ fullDate: 'dd/MM/yyyy',
5
+ },
6
+ };
7
+
8
+ export { locale as default };
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ const locale = {
4
+ lang: 'en-CA',
5
+ dateTimeFormats: {
6
+ fullDate: 'MMM dd, yyyy',
7
+ },
8
+ };
9
+
10
+ module.exports = locale;
@@ -0,0 +1,8 @@
1
+ const locale = {
2
+ lang: 'en-CA',
3
+ dateTimeFormats: {
4
+ fullDate: 'MMM dd, yyyy',
5
+ },
6
+ };
7
+
8
+ export { locale as default };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var locales_en_AU = require('./en_AU.js');
4
+ var locales_en_CA = require('./en_CA.js');
5
+
6
+ var index = {
7
+ 'en-AU': locales_en_AU,
8
+ 'en-CA': locales_en_CA,
9
+ };
10
+
11
+ module.exports = index;
@@ -0,0 +1,9 @@
1
+ import locale from './en_AU.mjs';
2
+ import locale$1 from './en_CA.mjs';
3
+
4
+ var index = {
5
+ 'en-AU': locale,
6
+ 'en-CA': locale$1,
7
+ };
8
+
9
+ export { index as default };
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+
@@ -0,0 +1 @@
1
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hero-design/rn",
3
- "version": "8.94.0",
3
+ "version": "8.96.0",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -23,7 +23,7 @@
23
23
  "@emotion/primitives-core": "11.0.0",
24
24
  "@emotion/react": "^11.9.3",
25
25
  "@hero-design/colors": "8.46.0",
26
- "date-fns": "^2.16.1",
26
+ "date-fns": "^2.30.0",
27
27
  "hero-editor": "^1.15.5",
28
28
  "nanoid": "^5.0.9"
29
29
  },
@@ -64,6 +64,7 @@
64
64
  "@rollup/plugin-replace": "^6.0.1",
65
65
  "@rollup/plugin-typescript": "^12.1.1",
66
66
  "@testing-library/jest-native": "^5.4.2",
67
+ "@testing-library/react-hooks": "^8.0.1",
67
68
  "@testing-library/react-native": "^9.1.0",
68
69
  "@types/events": "^3.0.3",
69
70
  "@types/jest": "^29.5.3",
@@ -81,7 +82,7 @@
81
82
  "prettier-config-hd": "8.42.4",
82
83
  "react": "18.2.0",
83
84
  "react-dom": "^18.2.0",
84
- "react-native": "^0.74.5",
85
+ "react-native": "0.74.5",
85
86
  "react-native-gesture-handler": "^2.15.0",
86
87
  "react-native-linear-gradient": "2.8.3",
87
88
  "react-native-pager-view": "^6.2.1",
package/rollup.config.mjs CHANGED
@@ -7,7 +7,8 @@ import replace from '@rollup/plugin-replace';
7
7
  import copy from 'rollup-plugin-copy';
8
8
  import flow from 'rollup-plugin-flow';
9
9
  import { visualizer } from 'rollup-plugin-visualizer';
10
-
10
+ import glob from 'glob';
11
+ import { fileURLToPath } from 'node:url';
11
12
  import pkg from './package.json' assert { type: 'json' };
12
13
 
13
14
  const extensions = ['.js', '.jsx', '.ts', '.tsx'];
@@ -16,60 +17,98 @@ const generateBuildStats = process.env.GENERATE_BUILD_STATS === 'true';
16
17
  const bundleTemplate = process.env.BUNDLE_TEMPLATE || 'treemap';
17
18
  const fileName = process.env.FILE_NAME || `stats/${pkg.version}/rn-stats.html`;
18
19
 
19
- export default {
20
- input: 'src/index.ts',
21
- output: [
22
- {
23
- file: pkg.main,
24
- format: 'cjs',
25
- interop: 'compat',
26
- },
27
- {
28
- file: pkg.module,
29
- format: 'es',
30
- interop: 'compat',
31
- },
32
- ],
33
- external: [
34
- 'react',
35
- 'react-native',
36
- 'react-native-safe-area-context',
37
- 'react-native-svg',
38
- '@react-native-community/datetimepicker',
39
- '@react-native-community/slider',
40
- 'react-native-gesture-handler',
41
- 'react-native-webview',
42
- 'react-native-pager-view',
43
- 'react-native-vector-icons',
44
- 'react-native-linear-gradient',
45
- '@hero-design/react-native-month-year-picker',
46
- '@ptomasroos/react-native-multi-slider',
47
- ],
48
- plugins: [
49
- replace({
50
- 'process.env.NODE_ENV': JSON.stringify('production'),
51
- }),
52
- nodeResolve({ extensions, browser: true }),
53
- flow(),
54
- commonjs(),
55
- json(),
56
- typescript({ tsconfig: './tsconfig.rollup.json' }),
57
- babel({ extensions, babelHelpers: 'bundled' }),
58
- copy({
59
- targets: [
60
- {
61
- src: 'assets/fonts/hero-icons-mobile.ttf',
62
- dest: 'lib/assets/fonts',
63
- },
64
- ],
65
- }),
66
- ...(generateBuildStats
67
- ? [
68
- visualizer({
69
- filename: fileName,
70
- template: bundleTemplate,
71
- }),
72
- ]
73
- : []),
74
- ],
75
- };
20
+ export default [
21
+ {
22
+ input: 'src/index.ts',
23
+ output: [
24
+ {
25
+ file: pkg.main,
26
+ format: 'cjs',
27
+ interop: 'compat',
28
+ },
29
+ {
30
+ file: pkg.module,
31
+ format: 'es',
32
+ interop: 'compat',
33
+ },
34
+ ],
35
+ external: [
36
+ 'react',
37
+ 'react-native',
38
+ 'react-native-safe-area-context',
39
+ 'react-native-svg',
40
+ '@react-native-community/datetimepicker',
41
+ '@react-native-community/slider',
42
+ 'react-native-gesture-handler',
43
+ 'react-native-webview',
44
+ 'react-native-pager-view',
45
+ 'react-native-vector-icons',
46
+ 'react-native-linear-gradient',
47
+ '@hero-design/react-native-month-year-picker',
48
+ '@ptomasroos/react-native-multi-slider',
49
+ ],
50
+ plugins: [
51
+ replace({
52
+ 'process.env.NODE_ENV': JSON.stringify('production'),
53
+ }),
54
+ nodeResolve({ extensions, browser: true }),
55
+ flow(),
56
+ commonjs(),
57
+ json(),
58
+ typescript({ tsconfig: './tsconfig.rollup.json' }),
59
+ babel({ extensions, babelHelpers: 'bundled' }),
60
+ copy({
61
+ targets: [
62
+ {
63
+ src: 'assets/fonts/hero-icons-mobile.ttf',
64
+ dest: 'lib/assets/fonts',
65
+ },
66
+ ],
67
+ }),
68
+ ...(generateBuildStats
69
+ ? [
70
+ visualizer({
71
+ filename: fileName,
72
+ template: bundleTemplate,
73
+ }),
74
+ ]
75
+ : []),
76
+ ],
77
+ },
78
+ {
79
+ input: Object.fromEntries(
80
+ glob.sync('src/locales/*.ts').map((file) => [
81
+ // This remove `src/` as well as the file extension from each
82
+ // file, so e.g. src/nested/foo.js becomes locales/foo
83
+ `locales/${file.split('/').pop().split('.')[0]}`,
84
+ // This expands the relative paths to absolute paths, so e.g.
85
+ // src/nested/foo becomes /project/src/nested/foo.js
86
+ fileURLToPath(new URL(file, import.meta.url)),
87
+ ])
88
+ ),
89
+ output: [
90
+ {
91
+ format: 'es',
92
+ interop: 'auto',
93
+ dir: '.',
94
+ entryFileNames: '[name].mjs',
95
+ },
96
+ {
97
+ format: 'cjs',
98
+ interop: 'auto',
99
+ dir: '.',
100
+ entryFileNames: '[name].js',
101
+ },
102
+ ],
103
+ plugins: [
104
+ typescript({
105
+ tsconfig: './tsconfig.rollup.json',
106
+ declaration: false,
107
+ exclude: ['src/**/*.spec.ts', 'src/**/*.spec.tsx'],
108
+ }),
109
+ copy({
110
+ targets: [{ src: 'types/locales/*.ts', dest: 'locales' }],
111
+ }),
112
+ ],
113
+ },
114
+ ];
@@ -1,13 +1,13 @@
1
1
  import DateTimePicker from '@react-native-community/datetimepicker';
2
- import formatDate from 'date-fns/fp/format';
3
2
  import React, { useState } from 'react';
4
3
  import { TouchableOpacity, View } from 'react-native';
5
4
 
6
5
  import { MonthYearPickerDialogueAndroid } from '@hero-design/react-native-month-year-picker';
6
+ import { useTheme } from '../../theme';
7
7
  import TextInput from '../TextInput';
8
+ import useCalculateDate from './hooks/useCalculateDate';
9
+ import useFormatDate from './hooks/useFormatDate';
8
10
  import type { DatePickerProps } from './types';
9
- import useCalculateDate from './useCalculateDate';
10
- import { useTheme } from '../../theme';
11
11
 
12
12
  type DatePickerAndroidProps = Omit<
13
13
  DatePickerProps,
@@ -22,7 +22,7 @@ const DatePickerAndroid = ({
22
22
  label,
23
23
  placeholder,
24
24
  onChange,
25
- displayFormat = 'dd/MM/yyyy',
25
+ displayFormat,
26
26
  disabled = false,
27
27
  required,
28
28
  error,
@@ -30,12 +30,20 @@ const DatePickerAndroid = ({
30
30
  style,
31
31
  testID,
32
32
  variant = 'default',
33
+ renderSelectedValue,
34
+ locale,
33
35
  }: DatePickerAndroidProps) => {
34
36
  const [open, setOpen] = useState(false);
35
- const displayValue = value ? formatDate(displayFormat, value) : '';
36
- const pickerInitValue = value || new Date();
37
+
38
+ const { displayValue, format } = useFormatDate({
39
+ displayFormat,
40
+ locale,
41
+ value,
42
+ });
37
43
 
38
44
  useCalculateDate({ minDate, maxDate, onChange, value });
45
+
46
+ const pickerInitValue = value || new Date();
39
47
  const theme = useTheme();
40
48
 
41
49
  return (
@@ -45,13 +53,25 @@ const DatePickerAndroid = ({
45
53
  label={label}
46
54
  value={displayValue}
47
55
  suffix="calendar-dates-outlined"
48
- placeholder={placeholder || displayFormat}
56
+ placeholder={placeholder || format}
49
57
  disabled={disabled}
50
58
  error={error}
51
59
  required={required}
52
60
  helpText={helpText}
53
61
  style={style}
54
62
  testID={testID}
63
+ renderInputValue={
64
+ renderSelectedValue !== undefined && !!value
65
+ ? (props) =>
66
+ renderSelectedValue(
67
+ {
68
+ date: value,
69
+ formattedDateString: displayValue,
70
+ },
71
+ props
72
+ )
73
+ : undefined
74
+ }
55
75
  />
56
76
  </View>
57
77
  {open && variant === 'month-year' ? (
@@ -1,4 +1,3 @@
1
- import formatDate from 'date-fns/fp/format';
2
1
  import React, { useState } from 'react';
3
2
  import { Platform, ScrollView, TouchableOpacity, View } from 'react-native';
4
3
 
@@ -6,8 +5,9 @@ import BottomSheet from '../BottomSheet';
6
5
  import Button from '../Button';
7
6
  import Calendar, { CalendarProps } from '../Calendar';
8
7
  import TextInput from '../TextInput';
8
+ import useCalculateDate from './hooks/useCalculateDate';
9
+ import useFormatDate from './hooks/useFormatDate';
9
10
  import type { DatePickerProps } from './types';
10
- import useCalculateDate from './useCalculateDate';
11
11
 
12
12
  const InternalCalendar = ({
13
13
  minDate,
@@ -68,7 +68,7 @@ const DatePickerCalendar = ({
68
68
  placeholder,
69
69
  onChange,
70
70
  confirmLabel,
71
- displayFormat = 'dd/MM/yyyy',
71
+ displayFormat,
72
72
  disabled = false,
73
73
  required,
74
74
  error,
@@ -78,13 +78,20 @@ const DatePickerCalendar = ({
78
78
  monthPickerConfirmLabel,
79
79
  monthPickerCancelLabel,
80
80
  supportedOrientations = ['portrait'],
81
+ renderSelectedValue,
82
+ locale,
81
83
  }: Omit<DatePickerProps, 'variant'>) => {
82
84
  const [open, setOpen] = useState(false);
83
85
  const [monthPickerVisible, setMonthPickerVisible] = useState(false);
84
86
  const shouldHideToolbar = Platform.OS === 'ios' && monthPickerVisible;
85
87
 
86
88
  const [selectingDate, setSelectingDate] = useState<Date>(value || new Date());
87
- const displayValue = value ? formatDate(displayFormat, value) : '';
89
+
90
+ const { displayValue } = useFormatDate({
91
+ value,
92
+ displayFormat,
93
+ locale,
94
+ });
88
95
 
89
96
  useCalculateDate({ minDate, maxDate, onChange, value });
90
97
 
@@ -102,6 +109,18 @@ const DatePickerCalendar = ({
102
109
  helpText={helpText}
103
110
  testID={testID}
104
111
  style={style}
112
+ renderInputValue={
113
+ renderSelectedValue !== undefined && !!value
114
+ ? (props) =>
115
+ renderSelectedValue(
116
+ {
117
+ date: value,
118
+ formattedDateString: displayValue,
119
+ },
120
+ props
121
+ )
122
+ : undefined
123
+ }
105
124
  />
106
125
  </View>
107
126
  <BottomSheet
@@ -1,5 +1,4 @@
1
1
  import DateTimePicker from '@react-native-community/datetimepicker';
2
- import formatDate from 'date-fns/fp/format';
3
2
  import React, { useState } from 'react';
4
3
  import { TouchableOpacity, View } from 'react-native';
5
4
 
@@ -7,10 +6,12 @@ import { MonthYearPickerViewIOS } from '@hero-design/react-native-month-year-pic
7
6
  import { useTheme } from '../../theme';
8
7
  import BottomSheet from '../BottomSheet';
9
8
  import Button from '../Button';
9
+ import { useLocale } from '../LocaleProvider/hooks';
10
10
  import TextInput from '../TextInput';
11
+ import useCalculateDate, { getDateValue } from './hooks/useCalculateDate';
12
+ import useFormatDate from './hooks/useFormatDate';
11
13
  import { StyledPickerWrapper } from './StyledDatePicker';
12
14
  import type { DatePickerProps } from './types';
13
- import useCalculateDate, { getDateValue } from './useCalculateDate';
14
15
 
15
16
  type DatePickerIOSProps = Omit<
16
17
  DatePickerProps,
@@ -26,7 +27,7 @@ const DatePickerIOS = ({
26
27
  placeholder,
27
28
  onChange,
28
29
  confirmLabel,
29
- displayFormat = 'dd/MM/yyyy',
30
+ displayFormat,
30
31
  disabled = false,
31
32
  required,
32
33
  error,
@@ -36,13 +37,19 @@ const DatePickerIOS = ({
36
37
  supportedOrientations = ['portrait'],
37
38
  variant = 'default',
38
39
  locale,
40
+ renderSelectedValue,
39
41
  }: DatePickerIOSProps) => {
42
+ const theme = useTheme();
40
43
  const [selectingDate, setSelectingDate] = useState<Date>(
41
44
  getDateValue(value || new Date(), minDate, maxDate)
42
45
  );
43
46
  const [open, setOpen] = useState(false);
44
- const displayValue = value ? formatDate(displayFormat, value) : '';
45
- const theme = useTheme();
47
+ const { lang: defaultLocale } = useLocale();
48
+ const { displayValue, format } = useFormatDate({
49
+ displayFormat,
50
+ locale,
51
+ value,
52
+ });
46
53
 
47
54
  useCalculateDate({ minDate, maxDate, onChange, value });
48
55
 
@@ -53,13 +60,25 @@ const DatePickerIOS = ({
53
60
  label={label}
54
61
  value={displayValue}
55
62
  suffix="calendar-dates-outlined"
56
- placeholder={placeholder || displayFormat}
63
+ placeholder={placeholder || format}
57
64
  disabled={disabled}
58
65
  error={error}
59
66
  required={required}
60
67
  helpText={helpText}
61
68
  testID={testID}
62
69
  style={style}
70
+ renderInputValue={
71
+ renderSelectedValue !== undefined && !!value
72
+ ? (props) =>
73
+ renderSelectedValue(
74
+ {
75
+ date: value,
76
+ formattedDateString: displayValue,
77
+ },
78
+ props
79
+ )
80
+ : undefined
81
+ }
63
82
  />
64
83
  </View>
65
84
  <BottomSheet
@@ -84,7 +103,7 @@ const DatePickerIOS = ({
84
103
  {variant === 'month-year' ? (
85
104
  <MonthYearPickerViewIOS
86
105
  value={value}
87
- locale={locale}
106
+ locale={locale || defaultLocale}
88
107
  minimumDate={minDate}
89
108
  textColor={theme.colors.onDefaultGlobalSurface}
90
109
  maximumDate={maxDate}
@@ -98,7 +117,7 @@ const DatePickerIOS = ({
98
117
  ) : null}
99
118
  {variant === 'default' ? (
100
119
  <DateTimePicker
101
- locale={locale}
120
+ locale={locale || defaultLocale}
102
121
  testID="datePickerIOS"
103
122
  value={selectingDate}
104
123
  minimumDate={minDate}
@@ -3,7 +3,7 @@ import { Platform } from 'react-native';
3
3
  import { fireEvent } from '@testing-library/react-native';
4
4
  import DatePicker from '..';
5
5
  import renderWithTheme from '../../../testHelpers/renderWithTheme';
6
- import { Button } from '../../..';
6
+ import { Button, Typography } from '../../..';
7
7
 
8
8
  describe('DatePicker', () => {
9
9
  it('renders DatePickerIOS when OS is iOS', () => {
@@ -146,4 +146,33 @@ describe('DatePicker', () => {
146
146
  fireEvent.press(getByText('Change max date'));
147
147
  expect(queryByDisplayValue('21/12/1994')).toBeTruthy();
148
148
  });
149
+
150
+ it.each`
151
+ OS | variant
152
+ ${'ios'} | ${'default'}
153
+ ${'android'} | ${'default'}
154
+ ${'ios'} | ${'calendar'}
155
+ ${'android'} | ${'calendar'}
156
+ `(
157
+ 'renders correct with custom value with OS=$OS and variant=$variant',
158
+ ({ OS, variant }) => {
159
+ Platform.OS = OS;
160
+ const { getByTestId } = renderWithTheme(
161
+ <DatePicker
162
+ value={new Date('1995-12-17')}
163
+ label="Start date"
164
+ confirmLabel="Confirm"
165
+ onChange={jest.fn()}
166
+ variant={variant}
167
+ renderSelectedValue={({ date }) => (
168
+ <Typography.Body testID="custom-value">
169
+ {date.toLocaleDateString()}
170
+ </Typography.Body>
171
+ )}
172
+ />
173
+ );
174
+
175
+ expect(getByTestId('custom-value')).toBeVisible();
176
+ }
177
+ );
149
178
  });
@@ -2,6 +2,11 @@ import { fireEvent } from '@testing-library/react-native';
2
2
  import React from 'react';
3
3
  import renderWithTheme from '../../../testHelpers/renderWithTheme';
4
4
  import DatePickerAndroid from '../DatePickerAndroid';
5
+ import HeroDesignProvider from '../../HeroDesignProvider';
6
+ import { theme } from '../../..';
7
+
8
+ import enAU from '../../../locales/en_AU';
9
+ import enCA from '../../../locales/en_CA';
5
10
 
6
11
  describe('DatePickerAndroid', () => {
7
12
  it('renders correctly', () => {
@@ -79,4 +84,26 @@ describe('DatePickerAndroid', () => {
79
84
  expect(queryByText('Android month year picker')).toBeNull();
80
85
  expect(onChangeSpy).toBeCalledWith(new Date('2019-09-01'));
81
86
  });
87
+
88
+ it.each`
89
+ locale | expected
90
+ ${enAU} | ${'21/12/1995'}
91
+ ${enCA} | ${'Dec 21, 1995'}
92
+ `(
93
+ 'renders correct format for $locale.lang locale',
94
+ ({ locale, expected }) => {
95
+ const { getByDisplayValue } = renderWithTheme(
96
+ <HeroDesignProvider theme={theme} locale={locale}>
97
+ <DatePickerAndroid
98
+ value={new Date('December 21, 1995')}
99
+ label="Start date"
100
+ confirmLabel="Confirm"
101
+ onChange={jest.fn()}
102
+ />
103
+ </HeroDesignProvider>
104
+ );
105
+
106
+ expect(getByDisplayValue(expected)).toBeVisible();
107
+ }
108
+ );
82
109
  });
@@ -4,6 +4,11 @@ import type { ModalProps } from 'react-native';
4
4
  import renderWithTheme from '../../../testHelpers/renderWithTheme';
5
5
  import DatePickerCalendar from '../DatePickerCalendar';
6
6
  import { setOrientation } from '../../../testHelpers/utils';
7
+ import HeroDesignProvider from '../../HeroDesignProvider';
8
+ import { theme } from '../../..';
9
+
10
+ import enAU from '../../../locales/en_AU';
11
+ import enCA from '../../../locales/en_CA';
7
12
 
8
13
  jest.mock('react-native/Libraries/Modal/Modal', () => {
9
14
  const Modal = jest.requireActual('react-native/Libraries/Modal/Modal');
@@ -137,4 +142,26 @@ describe('DatePickerCalendar', () => {
137
142
  expect(queryByText('January 1993')).toBeDefined();
138
143
  }
139
144
  );
145
+
146
+ it.each`
147
+ locale | expected
148
+ ${enAU} | ${'21/12/1995'}
149
+ ${enCA} | ${'Dec 21, 1995'}
150
+ `(
151
+ 'renders correct format for $locale.lang locale',
152
+ ({ locale, expected }) => {
153
+ const { getByDisplayValue } = renderWithTheme(
154
+ <HeroDesignProvider theme={theme} locale={locale}>
155
+ <DatePickerCalendar
156
+ value={new Date('December 21, 1995')}
157
+ label="Start date"
158
+ confirmLabel="Confirm"
159
+ onChange={jest.fn()}
160
+ />
161
+ </HeroDesignProvider>
162
+ );
163
+
164
+ expect(getByDisplayValue(expected)).toBeVisible();
165
+ }
166
+ );
140
167
  });
@@ -3,8 +3,13 @@ import React from 'react';
3
3
  import type { ModalProps } from 'react-native';
4
4
  import renderWithTheme from '../../../testHelpers/renderWithTheme';
5
5
  import DatePickerIOS from '../DatePickerIOS';
6
- import { getDateValue } from '../useCalculateDate';
6
+ import { getDateValue } from '../hooks/useCalculateDate';
7
7
  import { setOrientation } from '../../../testHelpers/utils';
8
+ import HeroDesignProvider from '../../HeroDesignProvider';
9
+ import { theme } from '../../..';
10
+
11
+ import enAU from '../../../locales/en_AU';
12
+ import enCA from '../../../locales/en_CA';
8
13
 
9
14
  jest.mock('react-native/Libraries/Modal/Modal', () => {
10
15
  const Modal = jest.requireActual('react-native/Libraries/Modal/Modal');
@@ -178,4 +183,26 @@ describe('DatePickerIOS', () => {
178
183
  expect(queryByText('iOS month year picker')).toBeNull();
179
184
  expect(onChangeSpy).toBeCalledWith(new Date('2019-09-01'));
180
185
  });
186
+
187
+ it.each`
188
+ locale | expected
189
+ ${enAU} | ${'21/12/1995'}
190
+ ${enCA} | ${'Dec 21, 1995'}
191
+ `(
192
+ 'renders correct format for $locale.lang locale',
193
+ ({ locale, expected }) => {
194
+ const { getByDisplayValue } = renderWithTheme(
195
+ <HeroDesignProvider theme={theme} locale={locale}>
196
+ <DatePickerIOS
197
+ value={new Date('December 21, 1995')}
198
+ label="Start date"
199
+ confirmLabel="Confirm"
200
+ onChange={jest.fn()}
201
+ />
202
+ </HeroDesignProvider>
203
+ );
204
+
205
+ expect(getByDisplayValue(expected)).toBeVisible();
206
+ }
207
+ );
181
208
  });