@hero-design/rn 8.94.0 → 8.97.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 (73) hide show
  1. package/.turbo/turbo-build.log +7 -2
  2. package/CHANGELOG.md +18 -0
  3. package/es/index.js +1744 -1322
  4. package/lib/index.js +1747 -1324
  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 +34 -40
  16. package/src/components/DatePicker/DatePickerCalendar.tsx +23 -4
  17. package/src/components/DatePicker/DatePickerIOS.tsx +36 -67
  18. package/src/components/DatePicker/Dialog/AndroidDialog.tsx +68 -0
  19. package/src/components/DatePicker/Dialog/IOSDialog.tsx +91 -0
  20. package/src/components/DatePicker/Dialog/__tests__/AndroidDialog.spec.tsx +70 -0
  21. package/src/components/DatePicker/Dialog/__tests__/IOSDialog.spec.tsx +114 -0
  22. package/src/components/DatePicker/Dialog/type.ts +50 -0
  23. package/src/components/DatePicker/__tests__/DatePicker.spec.tsx +30 -1
  24. package/src/components/DatePicker/__tests__/DatePickerAndroid.spec.tsx +27 -0
  25. package/src/components/DatePicker/__tests__/DatePickerCalendar.spec.tsx +27 -0
  26. package/src/components/DatePicker/__tests__/DatePickerIOS.spec.tsx +28 -1
  27. package/src/components/DatePicker/__tests__/__snapshots__/DatePickerAndroid.spec.tsx.snap +18 -9
  28. package/src/components/DatePicker/__tests__/__snapshots__/DatePickerIOS.spec.tsx.snap +1 -0
  29. package/src/components/DatePicker/hooks/__tests__/useFormatDate.spec.ts +61 -0
  30. package/src/components/DatePicker/{useCalculateDate.tsx → hooks/useCalculateDate.tsx} +1 -1
  31. package/src/components/DatePicker/hooks/useFormatDate.ts +25 -0
  32. package/src/components/DatePicker/hooks/utils.ts +30 -0
  33. package/src/components/DatePicker/index.tsx +12 -1
  34. package/src/components/DatePicker/types.ts +15 -1
  35. package/src/components/HeroDesignProvider/index.tsx +19 -6
  36. package/src/components/LocaleProvider/__tests__/utils.specs.ts +12 -0
  37. package/src/components/LocaleProvider/context.ts +7 -0
  38. package/src/components/LocaleProvider/hooks.ts +19 -0
  39. package/src/components/LocaleProvider/index.tsx +27 -0
  40. package/src/components/LocaleProvider/utils.ts +14 -0
  41. package/src/index.ts +2 -0
  42. package/src/locales/en_AU.ts +10 -0
  43. package/src/locales/en_CA.ts +10 -0
  44. package/src/locales/index.ts +7 -0
  45. package/src/locales/types.ts +12 -0
  46. package/src/testHelpers/renderWithTheme.tsx +7 -1
  47. package/src/types.ts +4 -0
  48. package/stats/8.95.0/rn-stats.html +4842 -0
  49. package/stats/8.96.0/rn-stats.html +4842 -0
  50. package/stats/8.97.0/rn-stats.html +4842 -0
  51. package/types/components/DatePicker/DatePickerAndroid.d.ts +1 -1
  52. package/types/components/DatePicker/DatePickerCalendar.d.ts +1 -1
  53. package/types/components/DatePicker/DatePickerIOS.d.ts +1 -1
  54. package/types/components/DatePicker/Dialog/AndroidDialog.d.ts +5 -0
  55. package/types/components/DatePicker/Dialog/IOSDialog.d.ts +4 -0
  56. package/types/components/DatePicker/Dialog/type.d.ts +50 -0
  57. package/types/components/DatePicker/{useCalculateDate.d.ts → hooks/useCalculateDate.d.ts} +1 -1
  58. package/types/components/DatePicker/hooks/useFormatDate.d.ts +10 -0
  59. package/types/components/DatePicker/hooks/utils.d.ts +6 -0
  60. package/types/components/DatePicker/index.d.ts +5 -2
  61. package/types/components/DatePicker/types.d.ts +8 -1
  62. package/types/components/HeroDesignProvider/index.d.ts +5 -1
  63. package/types/components/LocaleProvider/__tests__/utils.specs.d.ts +1 -0
  64. package/types/components/LocaleProvider/context.d.ts +3 -0
  65. package/types/components/LocaleProvider/hooks.d.ts +5 -0
  66. package/types/components/LocaleProvider/index.d.ts +7 -0
  67. package/types/components/LocaleProvider/utils.d.ts +3 -0
  68. package/types/index.d.ts +2 -1
  69. package/types/locales/en_AU.d.ts +3 -0
  70. package/types/locales/en_CA.d.ts +3 -0
  71. package/types/locales/index.d.ts +5 -0
  72. package/types/locales/types.d.ts +10 -0
  73. 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.97.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,11 @@
1
- import DateTimePicker from '@react-native-community/datetimepicker';
2
- import formatDate from 'date-fns/fp/format';
3
1
  import React, { useState } from 'react';
4
2
  import { TouchableOpacity, View } from 'react-native';
5
3
 
6
- import { MonthYearPickerDialogueAndroid } from '@hero-design/react-native-month-year-picker';
7
4
  import TextInput from '../TextInput';
5
+ import AndroidDatePickerDialog from './Dialog/AndroidDialog';
6
+ import useCalculateDate from './hooks/useCalculateDate';
7
+ import useFormatDate from './hooks/useFormatDate';
8
8
  import type { DatePickerProps } from './types';
9
- import useCalculateDate from './useCalculateDate';
10
- import { useTheme } from '../../theme';
11
9
 
12
10
  type DatePickerAndroidProps = Omit<
13
11
  DatePickerProps,
@@ -22,7 +20,7 @@ const DatePickerAndroid = ({
22
20
  label,
23
21
  placeholder,
24
22
  onChange,
25
- displayFormat = 'dd/MM/yyyy',
23
+ displayFormat,
26
24
  disabled = false,
27
25
  required,
28
26
  error,
@@ -30,13 +28,18 @@ const DatePickerAndroid = ({
30
28
  style,
31
29
  testID,
32
30
  variant = 'default',
31
+ renderSelectedValue,
32
+ locale,
33
33
  }: DatePickerAndroidProps) => {
34
34
  const [open, setOpen] = useState(false);
35
- const displayValue = value ? formatDate(displayFormat, value) : '';
36
- const pickerInitValue = value || new Date();
35
+
36
+ const { displayValue, format } = useFormatDate({
37
+ displayFormat,
38
+ locale,
39
+ value,
40
+ });
37
41
 
38
42
  useCalculateDate({ minDate, maxDate, onChange, value });
39
- const theme = useTheme();
40
43
 
41
44
  return (
42
45
  <TouchableOpacity onPress={() => setOpen(true)} disabled={disabled}>
@@ -45,45 +48,36 @@ const DatePickerAndroid = ({
45
48
  label={label}
46
49
  value={displayValue}
47
50
  suffix="calendar-dates-outlined"
48
- placeholder={placeholder || displayFormat}
51
+ placeholder={placeholder || format}
49
52
  disabled={disabled}
50
53
  error={error}
51
54
  required={required}
52
55
  helpText={helpText}
53
56
  style={style}
54
57
  testID={testID}
58
+ renderInputValue={
59
+ renderSelectedValue !== undefined && !!value
60
+ ? (props) =>
61
+ renderSelectedValue(
62
+ {
63
+ date: value,
64
+ formattedDateString: displayValue,
65
+ },
66
+ props
67
+ )
68
+ : undefined
69
+ }
55
70
  />
56
71
  </View>
57
- {open && variant === 'month-year' ? (
58
- <MonthYearPickerDialogueAndroid
59
- themeVariant={theme.themeMode === 'dark' ? 'dark' : 'light'}
60
- value={value}
61
- minimumDate={minDate}
62
- maximumDate={maxDate}
63
- onChange={(action, date) => {
64
- setOpen(false);
65
- if (action === 'dateSetAction' && !!date) {
66
- onChange(date);
67
- }
68
- }}
69
- />
70
- ) : null}
71
- {open && variant === 'default' ? (
72
- <DateTimePicker
73
- testID="datePickerAndroid"
74
- mode="date"
75
- value={pickerInitValue}
76
- minimumDate={minDate}
77
- maximumDate={maxDate}
78
- display="default"
79
- onChange={(_: any, date: Date | undefined) => {
80
- setOpen(false);
81
- if (date) {
82
- onChange(date);
83
- }
84
- }}
85
- />
86
- ) : null}
72
+ <AndroidDatePickerDialog
73
+ open={open}
74
+ onClose={() => setOpen(false)}
75
+ value={value}
76
+ minDate={minDate}
77
+ maxDate={maxDate}
78
+ onChange={onChange}
79
+ variant={variant}
80
+ />
87
81
  </TouchableOpacity>
88
82
  );
89
83
  };
@@ -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,16 +1,12 @@
1
- import DateTimePicker from '@react-native-community/datetimepicker';
2
- import formatDate from 'date-fns/fp/format';
3
1
  import React, { useState } from 'react';
4
2
  import { TouchableOpacity, View } from 'react-native';
5
3
 
6
- import { MonthYearPickerViewIOS } from '@hero-design/react-native-month-year-picker';
7
- import { useTheme } from '../../theme';
8
- import BottomSheet from '../BottomSheet';
9
- import Button from '../Button';
4
+ import { useLocale } from '../LocaleProvider/hooks';
10
5
  import TextInput from '../TextInput';
11
- import { StyledPickerWrapper } from './StyledDatePicker';
6
+ import IOSDatePickerDialog from './Dialog/IOSDialog';
7
+ import useCalculateDate from './hooks/useCalculateDate';
8
+ import useFormatDate from './hooks/useFormatDate';
12
9
  import type { DatePickerProps } from './types';
13
- import useCalculateDate, { getDateValue } from './useCalculateDate';
14
10
 
15
11
  type DatePickerIOSProps = Omit<
16
12
  DatePickerProps,
@@ -26,7 +22,7 @@ const DatePickerIOS = ({
26
22
  placeholder,
27
23
  onChange,
28
24
  confirmLabel,
29
- displayFormat = 'dd/MM/yyyy',
25
+ displayFormat,
30
26
  disabled = false,
31
27
  required,
32
28
  error,
@@ -36,13 +32,15 @@ const DatePickerIOS = ({
36
32
  supportedOrientations = ['portrait'],
37
33
  variant = 'default',
38
34
  locale,
35
+ renderSelectedValue,
39
36
  }: DatePickerIOSProps) => {
40
- const [selectingDate, setSelectingDate] = useState<Date>(
41
- getDateValue(value || new Date(), minDate, maxDate)
42
- );
43
37
  const [open, setOpen] = useState(false);
44
- const displayValue = value ? formatDate(displayFormat, value) : '';
45
- const theme = useTheme();
38
+ const { lang: defaultLocale } = useLocale();
39
+ const { displayValue, format } = useFormatDate({
40
+ displayFormat,
41
+ locale,
42
+ value,
43
+ });
46
44
 
47
45
  useCalculateDate({ minDate, maxDate, onChange, value });
48
46
 
@@ -53,69 +51,40 @@ const DatePickerIOS = ({
53
51
  label={label}
54
52
  value={displayValue}
55
53
  suffix="calendar-dates-outlined"
56
- placeholder={placeholder || displayFormat}
54
+ placeholder={placeholder || format}
57
55
  disabled={disabled}
58
56
  error={error}
59
57
  required={required}
60
58
  helpText={helpText}
61
59
  testID={testID}
62
60
  style={style}
61
+ renderInputValue={
62
+ renderSelectedValue !== undefined && !!value
63
+ ? (props) =>
64
+ renderSelectedValue(
65
+ {
66
+ date: value,
67
+ formattedDateString: displayValue,
68
+ },
69
+ props
70
+ )
71
+ : undefined
72
+ }
63
73
  />
64
74
  </View>
65
- <BottomSheet
75
+ <IOSDatePickerDialog
76
+ value={value}
77
+ onChange={onChange}
66
78
  open={open}
67
- onRequestClose={() => setOpen(false)}
68
- header={label}
69
- footer={
70
- <Button
71
- variant="text"
72
- text={confirmLabel}
73
- onPress={() => {
74
- if (selectingDate) {
75
- onChange(selectingDate);
76
- }
77
- setOpen(false);
78
- }}
79
- />
80
- }
79
+ onClose={() => setOpen(false)}
80
+ confirmLabel={confirmLabel}
81
+ locale={locale || defaultLocale}
81
82
  supportedOrientations={supportedOrientations}
82
- >
83
- <StyledPickerWrapper>
84
- {variant === 'month-year' ? (
85
- <MonthYearPickerViewIOS
86
- value={value}
87
- locale={locale}
88
- minimumDate={minDate}
89
- textColor={theme.colors.onDefaultGlobalSurface}
90
- maximumDate={maxDate}
91
- onChange={(date: Date | undefined) => {
92
- if (date) {
93
- setSelectingDate(date);
94
- }
95
- }}
96
- style={{ flex: 1 }}
97
- />
98
- ) : null}
99
- {variant === 'default' ? (
100
- <DateTimePicker
101
- locale={locale}
102
- testID="datePickerIOS"
103
- value={selectingDate}
104
- minimumDate={minDate}
105
- maximumDate={maxDate}
106
- mode="date"
107
- onChange={(_: any, date: Date | undefined) => {
108
- if (date) {
109
- setSelectingDate(date);
110
- }
111
- }}
112
- display="spinner"
113
- style={{ flex: 1 }}
114
- textColor={theme.colors.onDefaultGlobalSurface}
115
- />
116
- ) : null}
117
- </StyledPickerWrapper>
118
- </BottomSheet>
83
+ variant={variant}
84
+ label={label}
85
+ minDate={minDate}
86
+ maxDate={maxDate}
87
+ />
119
88
  </TouchableOpacity>
120
89
  );
121
90
  };
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ import DateTimePicker, {
3
+ DateTimePickerEvent,
4
+ } from '@react-native-community/datetimepicker';
5
+ import { MonthYearPickerDialogueAndroid } from '@hero-design/react-native-month-year-picker';
6
+ import { DatePickerDialogProps } from './type';
7
+ import { useTheme } from '../../../theme';
8
+ import Box from '../../Box';
9
+
10
+ export type AndroidDatePickerDialogProps = Omit<
11
+ DatePickerDialogProps,
12
+ 'supportedOrientations' | 'confirmLabel' | 'label' | 'locale'
13
+ >;
14
+
15
+ const AndroidDatePickerDialog = ({
16
+ open,
17
+ onClose,
18
+ value,
19
+ minDate,
20
+ maxDate,
21
+ onChange,
22
+ testID,
23
+ variant = 'default',
24
+ }: AndroidDatePickerDialogProps) => {
25
+ const theme = useTheme();
26
+ if (!open) return null;
27
+
28
+ const pickerInitValue = value || new Date();
29
+
30
+ return (
31
+ <Box testID={testID}>
32
+ {open && variant === 'month-year' ? (
33
+ <Box testID={testID}>
34
+ <MonthYearPickerDialogueAndroid
35
+ themeVariant={theme.themeMode === 'dark' ? 'dark' : 'light'}
36
+ value={value}
37
+ minimumDate={minDate}
38
+ maximumDate={maxDate}
39
+ onChange={(action, date) => {
40
+ onClose();
41
+ if (action === 'dateSetAction' && !!date) {
42
+ onChange(date);
43
+ }
44
+ }}
45
+ />
46
+ </Box>
47
+ ) : null}
48
+ {open && variant === 'default' ? (
49
+ <DateTimePicker
50
+ testID="datePickerAndroid"
51
+ mode="date"
52
+ value={pickerInitValue}
53
+ minimumDate={minDate}
54
+ maximumDate={maxDate}
55
+ display="default"
56
+ onChange={(_: DateTimePickerEvent, date: Date | undefined) => {
57
+ onClose();
58
+ if (date) {
59
+ onChange(date);
60
+ }
61
+ }}
62
+ />
63
+ ) : null}
64
+ </Box>
65
+ );
66
+ };
67
+
68
+ export default AndroidDatePickerDialog;