@hero-design/rn 8.34.0 → 8.34.2-alpha.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 (282) hide show
  1. package/.tool-versions +1 -0
  2. package/.turbo/turbo-build.log +2 -2
  3. package/.turbo/turbo-build:types.log +9 -0
  4. package/.turbo/turbo-lint.log +152 -0
  5. package/.turbo/turbo-publish:npm.log +9 -0
  6. package/.turbo/turbo-test.log +725 -0
  7. package/.turbo/turbo-type-check.log +1 -0
  8. package/es/index.js +2054 -10981
  9. package/lib/index.js +2053 -10981
  10. package/package.json +10 -7
  11. package/rollup.config.js +8 -3
  12. package/src/components/Calendar/__tests__/index.spec.tsx +47 -0
  13. package/src/components/Calendar/index.tsx +161 -59
  14. package/src/components/DatePicker/DatePickerAndroid.tsx +4 -1
  15. package/src/components/DatePicker/DatePickerCalendar.tsx +18 -1
  16. package/src/components/DatePicker/DatePickerIOS.tsx +4 -1
  17. package/src/components/DatePicker/__tests__/DatePickerCalendar.spec.tsx +39 -0
  18. package/src/components/DatePicker/types.ts +8 -0
  19. package/src/theme/__tests__/__snapshots__/index.spec.ts.snap +2 -0
  20. package/src/theme/components/calendar.ts +2 -0
  21. package/testUtils/setup.tsx +19 -0
  22. package/types/components/Accordion/AccordionItem.d.ts +0 -0
  23. package/types/components/Accordion/StyledAccordion.d.ts +0 -0
  24. package/types/components/Accordion/index.d.ts +0 -0
  25. package/types/components/Alert/StyledAlert.d.ts +0 -0
  26. package/types/components/Alert/index.d.ts +0 -0
  27. package/types/components/Attachment/StyledAttachment.d.ts +0 -0
  28. package/types/components/Attachment/index.d.ts +0 -0
  29. package/types/components/Avatar/Avatar.d.ts +0 -0
  30. package/types/components/Avatar/AvatarStack/StyledAvatarStack.d.ts +0 -0
  31. package/types/components/Avatar/AvatarStack/index.d.ts +0 -0
  32. package/types/components/Avatar/AvatarStack/utils.d.ts +0 -0
  33. package/types/components/Avatar/StyledAvatar.d.ts +0 -0
  34. package/types/components/Avatar/index.d.ts +0 -0
  35. package/types/components/Badge/Status.d.ts +0 -0
  36. package/types/components/Badge/StyledBadge.d.ts +0 -0
  37. package/types/components/Badge/index.d.ts +0 -0
  38. package/types/components/BottomNavigation/StyledBottomNavigation.d.ts +0 -0
  39. package/types/components/BottomNavigation/index.d.ts +0 -0
  40. package/types/components/BottomSheet/BottomSheetContext.d.ts +0 -0
  41. package/types/components/BottomSheet/Footer.d.ts +0 -0
  42. package/types/components/BottomSheet/Header.d.ts +0 -0
  43. package/types/components/BottomSheet/ScrollView.d.ts +0 -0
  44. package/types/components/BottomSheet/StyledBottomSheet.d.ts +0 -0
  45. package/types/components/BottomSheet/index.d.ts +0 -0
  46. package/types/components/Box/StyledBox.d.ts +0 -0
  47. package/types/components/Box/config.d.ts +0 -0
  48. package/types/components/Box/index.d.ts +0 -0
  49. package/types/components/Box/types.d.ts +0 -0
  50. package/types/components/Button/Button.d.ts +0 -0
  51. package/types/components/Button/IconButton.d.ts +0 -0
  52. package/types/components/Button/LoadingIndicator/StyledLoadingIndicator.d.ts +0 -0
  53. package/types/components/Button/LoadingIndicator/index.d.ts +0 -0
  54. package/types/components/Button/StyledButton.d.ts +0 -0
  55. package/types/components/Button/UtilityButton/StyledUtilityButton.d.ts +0 -0
  56. package/types/components/Button/UtilityButton/index.d.ts +0 -0
  57. package/types/components/Button/index.d.ts +0 -0
  58. package/types/components/Calendar/CalendarRowItem.d.ts +0 -0
  59. package/types/components/Calendar/StyledCalendar.d.ts +0 -0
  60. package/types/components/Calendar/helpers.d.ts +0 -0
  61. package/types/components/Calendar/index.d.ts +13 -1
  62. package/types/components/Card/DataCard/StyledDataCard.d.ts +0 -0
  63. package/types/components/Card/DataCard/index.d.ts +0 -0
  64. package/types/components/Card/StyledCard.d.ts +0 -0
  65. package/types/components/Card/index.d.ts +0 -0
  66. package/types/components/Carousel/CardCarousel.d.ts +0 -0
  67. package/types/components/Carousel/CarouselItem.d.ts +0 -0
  68. package/types/components/Carousel/StyledCardCarousel.d.ts +0 -0
  69. package/types/components/Carousel/StyledCarousel.d.ts +0 -0
  70. package/types/components/Carousel/contants.d.ts +0 -0
  71. package/types/components/Carousel/index.d.ts +0 -0
  72. package/types/components/Carousel/types.d.ts +0 -0
  73. package/types/components/Checkbox/StyledCheckbox.d.ts +0 -0
  74. package/types/components/Checkbox/index.d.ts +0 -0
  75. package/types/components/Collapse/StyledCollapse.d.ts +0 -0
  76. package/types/components/Collapse/index.d.ts +0 -0
  77. package/types/components/ContentNavigator/StyledContentNavigator.d.ts +0 -0
  78. package/types/components/ContentNavigator/index.d.ts +0 -0
  79. package/types/components/DatePicker/DatePickerAndroid.d.ts +1 -1
  80. package/types/components/DatePicker/DatePickerCalendar.d.ts +1 -1
  81. package/types/components/DatePicker/DatePickerIOS.d.ts +1 -1
  82. package/types/components/DatePicker/StyledDatePicker.d.ts +0 -0
  83. package/types/components/DatePicker/index.d.ts +0 -0
  84. package/types/components/DatePicker/types.d.ts +8 -0
  85. package/types/components/Divider/StyledDivider.d.ts +0 -0
  86. package/types/components/Divider/index.d.ts +0 -0
  87. package/types/components/Drawer/DragableDrawer/helpers.d.ts +0 -0
  88. package/types/components/Drawer/DragableDrawer/index.d.ts +0 -0
  89. package/types/components/Drawer/StyledDrawer.d.ts +0 -0
  90. package/types/components/Drawer/index.d.ts +0 -0
  91. package/types/components/Empty/StyledEmpty.d.ts +0 -0
  92. package/types/components/Empty/index.d.ts +0 -0
  93. package/types/components/Error/StyledError.d.ts +0 -0
  94. package/types/components/Error/index.d.ts +0 -0
  95. package/types/components/FAB/ActionGroup/ActionItem.d.ts +0 -0
  96. package/types/components/FAB/ActionGroup/StyledActionGroup.d.ts +0 -0
  97. package/types/components/FAB/ActionGroup/StyledActionItem.d.ts +0 -0
  98. package/types/components/FAB/ActionGroup/index.d.ts +0 -0
  99. package/types/components/FAB/AnimatedFABIcon.d.ts +0 -0
  100. package/types/components/FAB/FAB.d.ts +0 -0
  101. package/types/components/FAB/StyledFAB.d.ts +0 -0
  102. package/types/components/FAB/index.d.ts +0 -0
  103. package/types/components/Icon/AnimatedIcon.d.ts +0 -0
  104. package/types/components/Icon/HeroIcon/index.d.ts +0 -0
  105. package/types/components/Icon/IconList.d.ts +0 -0
  106. package/types/components/Icon/index.d.ts +0 -0
  107. package/types/components/Icon/utils.d.ts +0 -0
  108. package/types/components/Image/index.d.ts +0 -0
  109. package/types/components/List/BasicListItem.d.ts +0 -0
  110. package/types/components/List/ListItem.d.ts +0 -0
  111. package/types/components/List/StyledBasicListItem.d.ts +0 -0
  112. package/types/components/List/StyledListItem.d.ts +0 -0
  113. package/types/components/List/index.d.ts +0 -0
  114. package/types/components/PageControl/StyledPageControl.d.ts +0 -0
  115. package/types/components/PageControl/index.d.ts +0 -0
  116. package/types/components/PinInput/PinCell.d.ts +0 -0
  117. package/types/components/PinInput/StyledPinInput.d.ts +0 -0
  118. package/types/components/PinInput/index.d.ts +0 -0
  119. package/types/components/Progress/ProgressBar.d.ts +0 -0
  120. package/types/components/Progress/ProgressCircle.d.ts +0 -0
  121. package/types/components/Progress/StyledProgressBar.d.ts +0 -0
  122. package/types/components/Progress/StyledProgressCircle.d.ts +0 -0
  123. package/types/components/Progress/__tests__/index.spec.d.ts +0 -0
  124. package/types/components/Progress/constants.d.ts +0 -0
  125. package/types/components/Progress/index.d.ts +0 -0
  126. package/types/components/Progress/types.d.ts +0 -0
  127. package/types/components/Radio/Radio.d.ts +0 -0
  128. package/types/components/Radio/RadioGroup.d.ts +0 -0
  129. package/types/components/Radio/StyledRadio.d.ts +0 -0
  130. package/types/components/Radio/index.d.ts +0 -0
  131. package/types/components/Radio/types.d.ts +0 -0
  132. package/types/components/RefreshControl/index.d.ts +0 -0
  133. package/types/components/RichTextEditor/EditorEvent.d.ts +0 -0
  134. package/types/components/RichTextEditor/EditorToolbar.d.ts +0 -0
  135. package/types/components/RichTextEditor/MentionList.d.ts +0 -0
  136. package/types/components/RichTextEditor/RichTextEditor.d.ts +0 -0
  137. package/types/components/RichTextEditor/StyledRichTextEditor.d.ts +0 -0
  138. package/types/components/RichTextEditor/StyledToolbar.d.ts +0 -0
  139. package/types/components/RichTextEditor/__mocks__/heroEditorApp.d.ts +0 -0
  140. package/types/components/RichTextEditor/constants.d.ts +0 -0
  141. package/types/components/RichTextEditor/heroEditorApp.d.ts +0 -0
  142. package/types/components/RichTextEditor/index.d.ts +0 -0
  143. package/types/components/RichTextEditor/types.d.ts +0 -0
  144. package/types/components/RichTextEditor/utils/events.d.ts +0 -0
  145. package/types/components/RichTextEditor/utils/rnWebView.d.ts +0 -0
  146. package/types/components/SectionHeading/StyledHeading.d.ts +0 -0
  147. package/types/components/SectionHeading/index.d.ts +0 -0
  148. package/types/components/Select/BaseOptionList.d.ts +0 -0
  149. package/types/components/Select/Footer.d.ts +0 -0
  150. package/types/components/Select/MultiSelect/Option.d.ts +0 -0
  151. package/types/components/Select/MultiSelect/OptionList.d.ts +0 -0
  152. package/types/components/Select/MultiSelect/index.d.ts +0 -0
  153. package/types/components/Select/SingleSelect/Option.d.ts +0 -0
  154. package/types/components/Select/SingleSelect/OptionList.d.ts +0 -0
  155. package/types/components/Select/SingleSelect/StyledSingleSelect.d.ts +0 -0
  156. package/types/components/Select/SingleSelect/index.d.ts +0 -0
  157. package/types/components/Select/StyledSelect.d.ts +0 -0
  158. package/types/components/Select/helpers.d.ts +0 -0
  159. package/types/components/Select/index.d.ts +0 -0
  160. package/types/components/Select/types.d.ts +0 -0
  161. package/types/components/Skeleton/StyledSkeleton.d.ts +0 -0
  162. package/types/components/Skeleton/index.d.ts +0 -0
  163. package/types/components/Slider/index.d.ts +0 -0
  164. package/types/components/Spinner/AnimatedSpinner.d.ts +0 -0
  165. package/types/components/Spinner/StyledSpinner.d.ts +0 -0
  166. package/types/components/Spinner/index.d.ts +0 -0
  167. package/types/components/Success/StyledSuccess.d.ts +0 -0
  168. package/types/components/Success/index.d.ts +0 -0
  169. package/types/components/Swipeable/StyledSwipeable.d.ts +0 -0
  170. package/types/components/Swipeable/SwipeableAction.d.ts +0 -0
  171. package/types/components/Swipeable/index.d.ts +0 -0
  172. package/types/components/Switch/SelectorSwitch/Option.d.ts +0 -0
  173. package/types/components/Switch/SelectorSwitch/StyledSelectorSwitch.d.ts +0 -0
  174. package/types/components/Switch/SelectorSwitch/index.d.ts +0 -0
  175. package/types/components/Switch/StyledSwitch.d.ts +0 -0
  176. package/types/components/Switch/index.d.ts +0 -0
  177. package/types/components/Tabs/ActiveTabIndicator.d.ts +0 -0
  178. package/types/components/Tabs/SceneView.d.ts +0 -0
  179. package/types/components/Tabs/ScrollableTabs.d.ts +0 -0
  180. package/types/components/Tabs/ScrollableTabsHeader.d.ts +0 -0
  181. package/types/components/Tabs/ScrollableTabsV2/SceneView.d.ts +10 -0
  182. package/types/components/Tabs/ScrollableTabsV2/ScrollableTabsV2.d.ts +9 -0
  183. package/types/components/Tabs/ScrollableTabsV2/index.d.ts +4 -0
  184. package/types/components/Tabs/StyledScrollableTabs.d.ts +0 -0
  185. package/types/components/Tabs/StyledTabs.d.ts +0 -0
  186. package/types/components/Tabs/TabWithBadge.d.ts +0 -0
  187. package/types/components/Tabs/index.d.ts +0 -0
  188. package/types/components/Tabs/useIsFocused.d.ts +0 -0
  189. package/types/components/Tabs/utils.d.ts +0 -0
  190. package/types/components/Tag/StyledTag.d.ts +0 -0
  191. package/types/components/Tag/index.d.ts +0 -0
  192. package/types/components/TextInput/StyledTextInput.d.ts +0 -0
  193. package/types/components/TextInput/index.d.ts +0 -0
  194. package/types/components/TimePicker/StyledTimePicker.d.ts +0 -0
  195. package/types/components/TimePicker/TimePickerAndroid.d.ts +0 -0
  196. package/types/components/TimePicker/TimePickerIOS.d.ts +0 -0
  197. package/types/components/TimePicker/index.d.ts +0 -0
  198. package/types/components/TimePicker/types.d.ts +0 -0
  199. package/types/components/Toast/StyledToast.d.ts +0 -0
  200. package/types/components/Toast/Toast.d.ts +0 -0
  201. package/types/components/Toast/ToastContainer.d.ts +0 -0
  202. package/types/components/Toast/ToastContext.d.ts +0 -0
  203. package/types/components/Toast/ToastProvider.d.ts +0 -0
  204. package/types/components/Toast/index.d.ts +0 -0
  205. package/types/components/Toast/types.d.ts +0 -0
  206. package/types/components/Toolbar/StyledToolbar.d.ts +0 -0
  207. package/types/components/Toolbar/ToolbarGroup.d.ts +0 -0
  208. package/types/components/Toolbar/ToolbarItem.d.ts +0 -0
  209. package/types/components/Toolbar/index.d.ts +0 -0
  210. package/types/components/Typography/Text/StyledText.d.ts +0 -0
  211. package/types/components/Typography/Text/index.d.ts +0 -0
  212. package/types/components/Typography/index.d.ts +0 -0
  213. package/types/index.d.ts +0 -0
  214. package/types/testHelpers/renderWithTheme.d.ts +0 -0
  215. package/types/theme/ThemeProvider.d.ts +0 -0
  216. package/types/theme/ThemeSwitcher.d.ts +0 -0
  217. package/types/theme/components/accordion.d.ts +0 -0
  218. package/types/theme/components/alert.d.ts +0 -0
  219. package/types/theme/components/attachment.d.ts +0 -0
  220. package/types/theme/components/avatar.d.ts +0 -0
  221. package/types/theme/components/badge.d.ts +0 -0
  222. package/types/theme/components/bottomNavigation.d.ts +0 -0
  223. package/types/theme/components/bottomSheet.d.ts +0 -0
  224. package/types/theme/components/button.d.ts +0 -0
  225. package/types/theme/components/calendar.d.ts +2 -0
  226. package/types/theme/components/card.d.ts +0 -0
  227. package/types/theme/components/cardCarousel.d.ts +0 -0
  228. package/types/theme/components/carousel.d.ts +0 -0
  229. package/types/theme/components/checkbox.d.ts +0 -0
  230. package/types/theme/components/contentNavigator.d.ts +0 -0
  231. package/types/theme/components/datePicker.d.ts +0 -0
  232. package/types/theme/components/divider.d.ts +0 -0
  233. package/types/theme/components/drawer.d.ts +0 -0
  234. package/types/theme/components/empty.d.ts +0 -0
  235. package/types/theme/components/error.d.ts +0 -0
  236. package/types/theme/components/fab.d.ts +0 -0
  237. package/types/theme/components/icon.d.ts +0 -0
  238. package/types/theme/components/image.d.ts +0 -0
  239. package/types/theme/components/list.d.ts +0 -0
  240. package/types/theme/components/pageControl.d.ts +0 -0
  241. package/types/theme/components/pinInput.d.ts +0 -0
  242. package/types/theme/components/progress.d.ts +0 -0
  243. package/types/theme/components/radio.d.ts +0 -0
  244. package/types/theme/components/refreshControl.d.ts +0 -0
  245. package/types/theme/components/richTextEditor.d.ts +0 -0
  246. package/types/theme/components/sectionHeading.d.ts +0 -0
  247. package/types/theme/components/select.d.ts +0 -0
  248. package/types/theme/components/skeleton.d.ts +0 -0
  249. package/types/theme/components/slider.d.ts +0 -0
  250. package/types/theme/components/spinner.d.ts +0 -0
  251. package/types/theme/components/success.d.ts +0 -0
  252. package/types/theme/components/swipeable.d.ts +0 -0
  253. package/types/theme/components/switch.d.ts +0 -0
  254. package/types/theme/components/tabs.d.ts +0 -0
  255. package/types/theme/components/tag.d.ts +0 -0
  256. package/types/theme/components/textInput.d.ts +0 -0
  257. package/types/theme/components/timePicker.d.ts +0 -0
  258. package/types/theme/components/toast.d.ts +0 -0
  259. package/types/theme/components/toolbar.d.ts +0 -0
  260. package/types/theme/components/typography.d.ts +0 -0
  261. package/types/theme/getTheme.d.ts +0 -0
  262. package/types/theme/global/borders.d.ts +0 -0
  263. package/types/theme/global/colors/eBens.d.ts +0 -0
  264. package/types/theme/global/colors/global.d.ts +0 -0
  265. package/types/theme/global/colors/globalDark.d.ts +0 -0
  266. package/types/theme/global/colors/jobs.d.ts +0 -0
  267. package/types/theme/global/colors/swag.d.ts +0 -0
  268. package/types/theme/global/colors/swagDark.d.ts +0 -0
  269. package/types/theme/global/colors/types.d.ts +0 -0
  270. package/types/theme/global/colors/wallet.d.ts +0 -0
  271. package/types/theme/global/colors/work.d.ts +0 -0
  272. package/types/theme/global/index.d.ts +0 -0
  273. package/types/theme/global/scale.d.ts +0 -0
  274. package/types/theme/global/sizes.d.ts +0 -0
  275. package/types/theme/global/space.d.ts +0 -0
  276. package/types/theme/global/typography.d.ts +0 -0
  277. package/types/theme/index.d.ts +0 -0
  278. package/types/types.d.ts +0 -0
  279. package/types/utils/functions.d.ts +0 -0
  280. package/types/utils/helpers.d.ts +0 -0
  281. package/types/utils/hooks.d.ts +0 -0
  282. package/types/utils/scale.d.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hero-design/rn",
3
- "version": "8.34.0",
3
+ "version": "8.34.2-alpha.0",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -21,12 +21,16 @@
21
21
  "dependencies": {
22
22
  "@emotion/native": "^11.9.3",
23
23
  "@emotion/react": "^11.9.3",
24
- "@hero-design/colors": "8.34.0",
24
+ "@hero-design/colors": "8.34.1",
25
+ "@hero-design/react-native-month-year-picker": "^8.34.1",
25
26
  "date-fns": "^2.16.1",
26
27
  "events": "^3.2.0",
27
- "hero-editor": "^1.9.21"
28
+ "hero-editor": "^1.9.21",
29
+ "react-native-root-siblings": "^4.1.1",
30
+ "rollup-plugin-jsx": "^1.0.3"
28
31
  },
29
32
  "peerDependencies": {
33
+ "@hero-design/react-native-month-year-picker": "^8.34.1",
30
34
  "@react-native-community/datetimepicker": "^3.5.2",
31
35
  "@react-native-community/slider": "4.1.12",
32
36
  "react": "18.0.0",
@@ -34,7 +38,6 @@
34
38
  "react-native-gesture-handler": "^1.10.3 | ~2.5.0",
35
39
  "react-native-linear-gradient": "^2.6.2",
36
40
  "react-native-pager-view": "^5.4.25",
37
- "react-native-root-siblings": "^4.1.1",
38
41
  "react-native-safe-area-context": "^3.0.2",
39
42
  "react-native-vector-icons": "^9.1.0",
40
43
  "react-native-webview": "^11.2.5"
@@ -46,7 +49,7 @@
46
49
  "@babel/preset-typescript": "^7.17.12",
47
50
  "@babel/runtime": "^7.18.9",
48
51
  "@emotion/jest": "^11.9.3",
49
- "@hero-design/eslint-plugin": "8.34.0",
52
+ "@hero-design/eslint-plugin": "8.34.1",
50
53
  "@react-native-community/datetimepicker": "^3.5.2",
51
54
  "@react-native-community/slider": "4.1.12",
52
55
  "@rollup/plugin-babel": "^5.3.1",
@@ -62,10 +65,10 @@
62
65
  "@types/react-native": "^0.67.7",
63
66
  "@types/react-native-vector-icons": "^6.4.10",
64
67
  "babel-plugin-inline-import": "^3.0.0",
65
- "eslint-config-hd": "8.34.0",
68
+ "eslint-config-hd": "8.34.1",
66
69
  "eslint-plugin-import": "^2.27.5",
67
70
  "jest": "^27.3.1",
68
- "prettier-config-hd": "8.34.0",
71
+ "prettier-config-hd": "8.34.1",
69
72
  "react": "18.0.0",
70
73
  "react-native": "0.69.7",
71
74
  "react-native-gesture-handler": "~2.5.0",
package/rollup.config.js CHANGED
@@ -34,7 +34,7 @@ export default {
34
34
  'react-native-pager-view',
35
35
  'react-native-vector-icons',
36
36
  'react-native-linear-gradient',
37
- 'react-native-root-siblings',
37
+ '@hero-design/react-native-month-year-picker',
38
38
  ],
39
39
  plugins: [
40
40
  replace({
@@ -42,10 +42,15 @@ export default {
42
42
  }),
43
43
  nodeResolve({ extensions, browser: true }),
44
44
  flow(),
45
- commonjs(),
46
45
  json(),
47
46
  typescript(),
48
- babel({ extensions, babelHelpers: 'bundled' }),
47
+ babel({
48
+ exclude: 'node_modules/**',
49
+ presets: ['@babel/env', '@babel/preset-react'],
50
+ extensions,
51
+ babelHelpers: 'bundled',
52
+ }),
53
+ commonjs(),
49
54
  copy({
50
55
  targets: [
51
56
  {
@@ -92,4 +92,51 @@ describe('Calendar', () => {
92
92
  fireEvent.press(getByText('26'));
93
93
  expect(onChange).toBeCalledWith(new Date(2022, 10, 26));
94
94
  });
95
+
96
+ it('disables onTitlePress when onMonthChange is passed', () => {
97
+ const onTitlePress = jest.fn();
98
+ const { getByTestId } = renderWithTheme(
99
+ <Calendar
100
+ value={new Date(2022, 10, 5)}
101
+ visibleDate={new Date(2022, 10, 5)}
102
+ onTitlePress={onTitlePress}
103
+ minDate={new Date(2022, 10, 3)}
104
+ maxDate={new Date(2022, 10, 27)}
105
+ onMonthChange={jest.fn()}
106
+ />
107
+ );
108
+
109
+ fireEvent.press(getByTestId('calendar-month-picker'));
110
+ expect(onTitlePress).toHaveBeenCalledTimes(0);
111
+ });
112
+
113
+ it.each`
114
+ platform
115
+ ${'ios'}
116
+ ${'android'}
117
+ `('renders correct picker on $platform', ({ platform }) => {
118
+ jest.mock('react-native/Libraries/Utilities/Platform', () => ({
119
+ OS: platform,
120
+ select: () => null,
121
+ }));
122
+
123
+ const { getByTestId, queryByText } = renderWithTheme(
124
+ <Calendar
125
+ value={new Date(2022, 10, 5)}
126
+ visibleDate={new Date(2022, 10, 5)}
127
+ minDate={new Date(2022, 10, 3)}
128
+ maxDate={new Date(2022, 10, 27)}
129
+ onMonthChange={jest.fn()}
130
+ />
131
+ );
132
+
133
+ fireEvent.press(getByTestId('calendar-month-picker'));
134
+
135
+ // Pickers are mocked at packages/rn/testUtils/setup.tsx
136
+ if (platform === 'ios') {
137
+ expect(queryByText('IOS picker')).toBeDefined();
138
+ } else {
139
+ expect(queryByText('Android picker')).toBeDefined();
140
+ }
141
+ });
95
142
  });
@@ -1,7 +1,17 @@
1
- import React from 'react';
1
+ import {
2
+ MonthYearPickerDialogueAndroid,
3
+ MonthYearPickerViewIOS,
4
+ } from '@hero-design/react-native-month-year-picker';
2
5
  import format from 'date-fns/fp/format';
6
+ import React from 'react';
7
+ import { Platform, TouchableOpacity } from 'react-native';
8
+ import { useTheme } from '../../theme';
9
+ import { noop } from '../../utils/functions';
10
+ import Box from '../Box';
3
11
  import ContentNavigator from '../ContentNavigator';
12
+ import Icon from '../Icon';
4
13
  import Typography from '../Typography';
14
+ import CalendarRowItem from './CalendarRowItem';
5
15
  import {
6
16
  StyledCalendarDayNameCell,
7
17
  StyledCalendarHeader,
@@ -10,9 +20,7 @@ import {
10
20
  StyledContainer,
11
21
  StyledDisabledCalendarRowItem,
12
22
  } from './StyledCalendar';
13
- import CalendarRowItem from './CalendarRowItem';
14
23
  import { getValidDate, initArray, isEqDate } from './helpers';
15
- import { noop } from '../../utils/functions';
16
24
 
17
25
  const DAYS_OF_WEEK = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
18
26
  // Sunday first column => 0
@@ -68,6 +76,18 @@ export interface CalendarProps {
68
76
  * Testing id of the component.
69
77
  */
70
78
  testID?: string;
79
+ /**
80
+ * Callback when header month is changed, passing this prop will disable onTitlePress.
81
+ */
82
+ onMonthChange?: (date: Date) => void;
83
+ /**
84
+ * Label for the confirm button of the month picker, Android only.
85
+ */
86
+ monthPickerConfirmLabel?: string;
87
+ /**
88
+ * Label for the cancel button of the month picker, Android only.
89
+ */
90
+ monthPickerCancelLabel?: string;
71
91
  }
72
92
 
73
93
  const Calendar = ({
@@ -81,7 +101,11 @@ const Calendar = ({
81
101
  maxDate,
82
102
  markedDates = [],
83
103
  testID,
104
+ onMonthChange = noop,
105
+ monthPickerConfirmLabel,
106
+ monthPickerCancelLabel,
84
107
  }: CalendarProps) => {
108
+ const theme = useTheme();
85
109
  const currentMonth = visibleDate.getMonth();
86
110
  const currentYear = visibleDate.getFullYear();
87
111
  const now = new Date();
@@ -92,6 +116,10 @@ const Calendar = ({
92
116
  }),
93
117
  {}
94
118
  );
119
+ const [monthPickerVisible, setMonthPickerVisible] = React.useState(false);
120
+ const [contentHeight, setContentHeight] = React.useState(0);
121
+
122
+ const useMonthPicker = onMonthChange !== noop;
95
123
 
96
124
  const firstDateOfMonth = new Date(currentYear, currentMonth, 1);
97
125
  const lastDateOfMonth = new Date(currentYear, currentMonth + 1, 0);
@@ -152,70 +180,144 @@ const Calendar = ({
152
180
  <StyledContainer testID={testID}>
153
181
  <StyledCalendarHeader>
154
182
  <ContentNavigator
155
- value={format('MMMM yyyy', visibleDate)}
183
+ value={
184
+ !useMonthPicker ? (
185
+ format('MMMM yyyy', visibleDate)
186
+ ) : (
187
+ <TouchableOpacity
188
+ testID="calendar-month-picker"
189
+ onPress={() => setMonthPickerVisible(!monthPickerVisible)}
190
+ >
191
+ <Box
192
+ flexDirection="row"
193
+ justifyContent="center"
194
+ alignItems="center"
195
+ >
196
+ <Typography.Title
197
+ level="h5"
198
+ style={{
199
+ textAlign: 'center',
200
+ marginRight:
201
+ theme.__hd__.calendar.space.headerMarginRight,
202
+ }}
203
+ >
204
+ {format('MMMM yyyy', visibleDate)}
205
+ </Typography.Title>
206
+
207
+ <Icon
208
+ icon={monthPickerVisible ? 'arrow-up' : 'arrow-down'}
209
+ size="small"
210
+ />
211
+ </Box>
212
+ </TouchableOpacity>
213
+ )
214
+ }
156
215
  onPreviousPress={onPreviousPress}
157
216
  onNextPress={onNextPress}
158
- onPress={onTitlePress}
217
+ onPress={useMonthPicker ? undefined : onTitlePress}
159
218
  previousDisabled={disablePrevButton}
160
219
  nextDisabled={disableNextButton}
161
220
  fontSize="large"
162
221
  />
163
222
  </StyledCalendarHeader>
164
- <StyledCalendarRow>
165
- {DAYS_OF_WEEK.map((day) => (
166
- <StyledCalendarRowItem key={day}>
167
- <StyledCalendarDayNameCell>
168
- <Typography.Body variant="small">{day}</Typography.Body>
169
- </StyledCalendarDayNameCell>
170
- </StyledCalendarRowItem>
171
- ))}
172
- </StyledCalendarRow>
173
- <StyledCalendarRow>
174
- {daysOfPreviousMonth.map((date) =>
175
- date ? (
176
- <CalendarRowItem
177
- key={date.toDateString()}
178
- date={date}
179
- isCurrent={isEqDate(now, date)}
180
- isSelected={isEqDate(value, date)}
181
- onPress={() => onChange?.(date)}
182
- textIntent="subdued"
183
- marked={parsedMaskedDate[date.toDateString()]}
184
- />
185
- ) : (
186
- <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
187
- )
188
- )}
189
- {daysOfCurrentMonth.map((date) =>
190
- date ? (
191
- <CalendarRowItem
192
- key={date.toDateString()}
193
- date={date}
194
- isCurrent={isEqDate(now, date)}
195
- isSelected={isEqDate(value, date)}
196
- onPress={() => onChange?.(date)}
197
- marked={parsedMaskedDate[date.toDateString()]}
198
- />
199
- ) : (
200
- <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
201
- )
202
- )}
203
- {daysOfNextMonth.map((date) =>
204
- date ? (
205
- <CalendarRowItem
206
- key={date.toDateString()}
207
- date={date}
208
- isCurrent={isEqDate(now, date)}
209
- isSelected={isEqDate(value, date)}
210
- onPress={() => onChange?.(date)}
211
- textIntent="subdued"
212
- marked={parsedMaskedDate[date.toDateString()]}
223
+ {Platform.OS === 'ios' && monthPickerVisible ? (
224
+ <Box style={{ overflow: 'hidden' }}>
225
+ <MonthYearPickerViewIOS
226
+ value={value}
227
+ minimumDate={minDate}
228
+ maximumDate={maxDate}
229
+ onChange={onMonthChange}
230
+ style={{
231
+ height:
232
+ contentHeight +
233
+ theme.__hd__.calendar.space.iosPickerMarginVertical * 2,
234
+ marginVertical:
235
+ -theme.__hd__.calendar.space.iosPickerMarginVertical,
236
+ }}
237
+ />
238
+ </Box>
239
+ ) : (
240
+ <Box
241
+ onLayout={
242
+ Platform.OS === 'ios'
243
+ ? (e) => setContentHeight(e.nativeEvent.layout.height)
244
+ : undefined
245
+ }
246
+ >
247
+ <StyledCalendarRow>
248
+ {DAYS_OF_WEEK.map((day) => (
249
+ <StyledCalendarRowItem key={day}>
250
+ <StyledCalendarDayNameCell>
251
+ <Typography.Body variant="small">{day}</Typography.Body>
252
+ </StyledCalendarDayNameCell>
253
+ </StyledCalendarRowItem>
254
+ ))}
255
+ </StyledCalendarRow>
256
+ <StyledCalendarRow>
257
+ {daysOfPreviousMonth.map((date) =>
258
+ date ? (
259
+ <CalendarRowItem
260
+ key={date.toDateString()}
261
+ date={date}
262
+ isCurrent={isEqDate(now, date)}
263
+ isSelected={isEqDate(value, date)}
264
+ onPress={() => onChange?.(date)}
265
+ textIntent="subdued"
266
+ marked={parsedMaskedDate[date.toDateString()]}
267
+ />
268
+ ) : (
269
+ <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
270
+ )
271
+ )}
272
+ {daysOfCurrentMonth.map((date) =>
273
+ date ? (
274
+ <CalendarRowItem
275
+ key={date.toDateString()}
276
+ date={date}
277
+ isCurrent={isEqDate(now, date)}
278
+ isSelected={isEqDate(value, date)}
279
+ onPress={() => onChange?.(date)}
280
+ marked={parsedMaskedDate[date.toDateString()]}
281
+ />
282
+ ) : (
283
+ <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
284
+ )
285
+ )}
286
+ {daysOfNextMonth.map((date) =>
287
+ date ? (
288
+ <CalendarRowItem
289
+ key={date.toDateString()}
290
+ date={date}
291
+ isCurrent={isEqDate(now, date)}
292
+ isSelected={isEqDate(value, date)}
293
+ onPress={() => onChange?.(date)}
294
+ textIntent="subdued"
295
+ marked={parsedMaskedDate[date.toDateString()]}
296
+ />
297
+ ) : (
298
+ <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
299
+ )
300
+ )}
301
+ </StyledCalendarRow>
302
+
303
+ {Platform.OS === 'android' && monthPickerVisible && (
304
+ <MonthYearPickerDialogueAndroid
305
+ doneButtonLabel={monthPickerConfirmLabel}
306
+ cancelButtonLabel={monthPickerCancelLabel}
307
+ value={value}
308
+ minimumDate={minDate}
309
+ maximumDate={maxDate}
310
+ onChange={(action, date) => {
311
+ setMonthPickerVisible(false);
312
+
313
+ if (action === 'dateSetAction' && !!date) {
314
+ onMonthChange(date);
315
+ }
316
+ }}
213
317
  />
214
- ) : (
215
- <StyledDisabledCalendarRowItem testID="calendar-disabled-cell" />
216
- )
217
- )}
218
- </StyledCalendarRow>
318
+ )}
319
+ </Box>
320
+ )}
219
321
  </StyledContainer>
220
322
  );
221
323
  };
@@ -20,7 +20,10 @@ const DatePickerAndroid = ({
20
20
  helpText,
21
21
  style,
22
22
  testID,
23
- }: Omit<DatePickerProps, 'variant'>) => {
23
+ }: Omit<
24
+ DatePickerProps,
25
+ 'variant' | 'monthPickerConfirmLabel' | 'monthPickerCancelLabel'
26
+ >) => {
24
27
  const [open, setOpen] = useState(false);
25
28
 
26
29
  const displayValue = value ? formatDate(displayFormat, value) : '';
@@ -13,7 +13,17 @@ const InternalCalendar = ({
13
13
  maxDate,
14
14
  value,
15
15
  onChange,
16
- }: Pick<CalendarProps, 'minDate' | 'maxDate' | 'value' | 'onChange'>) => {
16
+ monthPickerConfirmLabel,
17
+ monthPickerCancelLabel,
18
+ }: Pick<
19
+ CalendarProps,
20
+ | 'minDate'
21
+ | 'maxDate'
22
+ | 'value'
23
+ | 'onChange'
24
+ | 'monthPickerConfirmLabel'
25
+ | 'monthPickerCancelLabel'
26
+ >) => {
17
27
  const [visibleDate, setVisibleDate] = useState(value || new Date());
18
28
  const [selectingDate, setSelectingDate] = useState<Date>(value || new Date());
19
29
  return (
@@ -39,6 +49,9 @@ const InternalCalendar = ({
39
49
  }
40
50
  minDate={minDate}
41
51
  maxDate={maxDate}
52
+ onMonthChange={(date) => setVisibleDate(date)}
53
+ monthPickerConfirmLabel={monthPickerConfirmLabel}
54
+ monthPickerCancelLabel={monthPickerCancelLabel}
42
55
  />
43
56
  );
44
57
  };
@@ -58,6 +71,8 @@ const DatePickerCalendar = ({
58
71
  helpText,
59
72
  style,
60
73
  testID,
74
+ monthPickerConfirmLabel,
75
+ monthPickerCancelLabel,
61
76
  }: Omit<DatePickerProps, 'variant'>) => {
62
77
  const [open, setOpen] = useState(false);
63
78
 
@@ -101,6 +116,8 @@ const DatePickerCalendar = ({
101
116
  maxDate={maxDate}
102
117
  value={value}
103
118
  onChange={setSelectingDate}
119
+ monthPickerConfirmLabel={monthPickerConfirmLabel}
120
+ monthPickerCancelLabel={monthPickerCancelLabel}
104
121
  />
105
122
  </BottomSheet>
106
123
  </TouchableOpacity>
@@ -41,7 +41,10 @@ const DatePickerIOS = ({
41
41
  helpText,
42
42
  style,
43
43
  testID,
44
- }: Omit<DatePickerProps, 'variant'>) => {
44
+ }: Omit<
45
+ DatePickerProps,
46
+ 'variant' | 'monthPickerConfirmLabel' | 'monthPickerCancelLabel'
47
+ >) => {
45
48
  const [selectingDate, setSelectingDate] = useState<Date>(
46
49
  getInitialDateValue(value || new Date(), minDate, maxDate)
47
50
  );
@@ -58,4 +58,43 @@ describe('DatePickerCalendar', () => {
58
58
 
59
59
  expect(getByText('This is help text')).toBeTruthy();
60
60
  });
61
+
62
+ it.each`
63
+ platform
64
+ ${'ios'}
65
+ ${'android'}
66
+ `('renders month year picker when pressing on title', ({ platform }) => {
67
+ jest.mock('react-native/Libraries/Utilities/Platform', () => ({
68
+ OS: platform,
69
+ select: () => null,
70
+ }));
71
+
72
+ const { queryByText, getByText, getByTestId } = renderWithTheme(
73
+ <DatePickerCalendar
74
+ value={new Date('December 21, 1995')}
75
+ label="Start date"
76
+ confirmLabel="Confirm"
77
+ helpText="This is help text"
78
+ onChange={jest.fn()}
79
+ />
80
+ );
81
+
82
+ fireEvent.press(getByText('Start date'));
83
+ fireEvent.press(getByText('December 1995'));
84
+
85
+ if (platform === 'ios') {
86
+ expect(queryByText('IOS picker')).toBeDefined();
87
+ } else {
88
+ expect(queryByText('Android picker')).toBeDefined();
89
+ }
90
+
91
+ // Selecting month
92
+ fireEvent(
93
+ getByTestId('calendar'),
94
+ 'onMonthChange',
95
+ new Date('January 17, 1993')
96
+ );
97
+
98
+ expect(queryByText('January 1993')).toBeDefined();
99
+ });
61
100
  });
@@ -64,4 +64,12 @@ export interface DatePickerProps {
64
64
  * Testing id of the component.
65
65
  */
66
66
  testID?: string;
67
+ /**
68
+ * Calendar variant prop. Label for the confirm button of the month picker, Android only.
69
+ */
70
+ monthPickerConfirmLabel?: string;
71
+ /**
72
+ * Calendar variant prop. Label for the cancel button of the month picker, Android only.
73
+ */
74
+ monthPickerCancelLabel?: string;
67
75
  }
@@ -262,7 +262,9 @@ Object {
262
262
  },
263
263
  "space": Object {
264
264
  "headerHorizontalPadding": 12,
265
+ "headerMarginRight": 8,
265
266
  "headerVerticalPadding": 16,
267
+ "iosPickerMarginVertical": 64,
266
268
  "rowVerticalPadding": 16,
267
269
  },
268
270
  },
@@ -24,6 +24,8 @@ const getCalendarTheme = (theme: GlobalTheme) => {
24
24
  rowVerticalPadding: theme.space.medium,
25
25
  headerVerticalPadding: theme.space.medium,
26
26
  headerHorizontalPadding: theme.space.smallMedium,
27
+ headerMarginRight: theme.space.small,
28
+ iosPickerMarginVertical: theme.space['5xlarge'],
27
29
  };
28
30
 
29
31
  const radii = {
@@ -107,6 +107,25 @@ jest.mock('react-native-gesture-handler', () => {
107
107
  };
108
108
  });
109
109
 
110
+ jest.mock("@hero-design/react-native-month-year-picker", () => {
111
+ const React = jest.requireActual("react");
112
+ const { View, Text } = jest.requireActual("react-native");
113
+
114
+ return {
115
+ MonthYearPickerDialogueAndroid: () => (
116
+ <View>
117
+ <Text>Android picker</Text>
118
+ </View>
119
+ ),
120
+ MonthYearPickerViewIOS: () => (
121
+ <View>
122
+ <Text>IOS picker</Text>
123
+ </View>
124
+ ),
125
+ };
126
+ });
127
+
128
+
110
129
  jest.mock('react-native/Libraries/Utilities/BackHandler', () => {
111
130
  return jest.requireActual(
112
131
  'react-native/Libraries/Utilities/__mocks__/BackHandler.js',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes