@hero-design/rn 8.24.0-alpha.1 → 8.24.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 (287) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-publish:npm.log +0 -9
  3. package/es/index.js +78 -142
  4. package/lib/index.js +78 -142
  5. package/package.json +5 -5
  6. package/src/components/RichTextEditor/RichTextEditor.tsx +3 -4
  7. package/src/components/Success/__tests__/index.spec.tsx +6 -0
  8. package/src/components/Success/index.tsx +19 -0
  9. package/src/components/Tabs/{ScrollableTabsV2/SceneView.tsx → SceneView.tsx} +2 -2
  10. package/src/components/Tabs/ScrollableTabs.tsx +54 -48
  11. package/src/components/Tabs/{ScrollableTabsV2/__tests__ → __tests__}/SceneView.spec.tsx +3 -3
  12. package/src/components/Tabs/__tests__/ScrollableTabs.spec.tsx +86 -28
  13. package/src/components/Tabs/__tests__/__snapshots__/ScrollableTabs.spec.tsx.snap +1687 -49
  14. package/src/components/Tabs/__tests__/__snapshots__/index.spec.tsx.snap +1213 -29
  15. package/src/components/Tabs/__tests__/index.spec.tsx +58 -14
  16. package/src/components/Tabs/index.tsx +108 -102
  17. package/src/components/Tabs/useIsFocused.tsx +19 -0
  18. package/types/components/Accordion/AccordionItem.d.ts +0 -0
  19. package/types/components/Accordion/StyledAccordion.d.ts +0 -0
  20. package/types/components/Accordion/index.d.ts +0 -0
  21. package/types/components/Alert/StyledAlert.d.ts +0 -0
  22. package/types/components/Alert/index.d.ts +0 -0
  23. package/types/components/Attachment/StyledAttachment.d.ts +0 -0
  24. package/types/components/Attachment/index.d.ts +0 -0
  25. package/types/components/Avatar/Avatar.d.ts +0 -0
  26. package/types/components/Avatar/AvatarStack/StyledAvatarStack.d.ts +0 -0
  27. package/types/components/Avatar/AvatarStack/index.d.ts +0 -0
  28. package/types/components/Avatar/AvatarStack/utils.d.ts +0 -0
  29. package/types/components/Avatar/StyledAvatar.d.ts +0 -0
  30. package/types/components/Avatar/index.d.ts +0 -0
  31. package/types/components/Badge/Status.d.ts +0 -0
  32. package/types/components/Badge/StyledBadge.d.ts +0 -0
  33. package/types/components/Badge/index.d.ts +0 -0
  34. package/types/components/BottomNavigation/StyledBottomNavigation.d.ts +0 -0
  35. package/types/components/BottomNavigation/index.d.ts +0 -0
  36. package/types/components/BottomSheet/BottomSheetContext.d.ts +0 -0
  37. package/types/components/BottomSheet/Footer.d.ts +0 -0
  38. package/types/components/BottomSheet/Header.d.ts +0 -0
  39. package/types/components/BottomSheet/ScrollView.d.ts +0 -0
  40. package/types/components/BottomSheet/StyledBottomSheet.d.ts +0 -0
  41. package/types/components/BottomSheet/index.d.ts +0 -0
  42. package/types/components/Box/StyledBox.d.ts +0 -0
  43. package/types/components/Box/config.d.ts +0 -0
  44. package/types/components/Box/index.d.ts +0 -0
  45. package/types/components/Box/types.d.ts +0 -0
  46. package/types/components/Button/Button.d.ts +0 -0
  47. package/types/components/Button/IconButton.d.ts +0 -0
  48. package/types/components/Button/LoadingIndicator/StyledLoadingIndicator.d.ts +0 -0
  49. package/types/components/Button/LoadingIndicator/index.d.ts +0 -0
  50. package/types/components/Button/StyledButton.d.ts +0 -0
  51. package/types/components/Button/UtilityButton/StyledUtilityButton.d.ts +0 -0
  52. package/types/components/Button/UtilityButton/index.d.ts +0 -0
  53. package/types/components/Button/index.d.ts +0 -0
  54. package/types/components/Calendar/CalendarRowItem.d.ts +0 -0
  55. package/types/components/Calendar/StyledCalendar.d.ts +0 -0
  56. package/types/components/Calendar/helpers.d.ts +0 -0
  57. package/types/components/Calendar/index.d.ts +0 -0
  58. package/types/components/Card/DataCard/StyledDataCard.d.ts +0 -0
  59. package/types/components/Card/DataCard/index.d.ts +0 -0
  60. package/types/components/Card/StyledCard.d.ts +0 -0
  61. package/types/components/Card/index.d.ts +0 -0
  62. package/types/components/Carousel/CardCarousel.d.ts +0 -0
  63. package/types/components/Carousel/CarouselItem.d.ts +0 -0
  64. package/types/components/Carousel/StyledCardCarousel.d.ts +0 -0
  65. package/types/components/Carousel/StyledCarousel.d.ts +0 -0
  66. package/types/components/Carousel/contants.d.ts +0 -0
  67. package/types/components/Carousel/index.d.ts +0 -0
  68. package/types/components/Carousel/types.d.ts +0 -0
  69. package/types/components/Checkbox/StyledCheckbox.d.ts +0 -0
  70. package/types/components/Checkbox/index.d.ts +0 -0
  71. package/types/components/Collapse/StyledCollapse.d.ts +0 -0
  72. package/types/components/Collapse/index.d.ts +0 -0
  73. package/types/components/ContentNavigator/StyledContentNavigator.d.ts +0 -0
  74. package/types/components/ContentNavigator/index.d.ts +0 -0
  75. package/types/components/DatePicker/DatePickerAndroid.d.ts +0 -0
  76. package/types/components/DatePicker/DatePickerCalendar.d.ts +0 -0
  77. package/types/components/DatePicker/DatePickerIOS.d.ts +0 -0
  78. package/types/components/DatePicker/StyledDatePicker.d.ts +0 -0
  79. package/types/components/DatePicker/index.d.ts +0 -0
  80. package/types/components/DatePicker/types.d.ts +0 -0
  81. package/types/components/Divider/StyledDivider.d.ts +0 -0
  82. package/types/components/Divider/index.d.ts +0 -0
  83. package/types/components/Drawer/DragableDrawer/helpers.d.ts +0 -0
  84. package/types/components/Drawer/DragableDrawer/index.d.ts +0 -0
  85. package/types/components/Drawer/StyledDrawer.d.ts +0 -0
  86. package/types/components/Drawer/index.d.ts +0 -0
  87. package/types/components/Empty/StyledEmpty.d.ts +0 -0
  88. package/types/components/Empty/index.d.ts +0 -0
  89. package/types/components/Error/StyledError.d.ts +0 -0
  90. package/types/components/Error/index.d.ts +0 -0
  91. package/types/components/FAB/ActionGroup/ActionItem.d.ts +0 -0
  92. package/types/components/FAB/ActionGroup/StyledActionGroup.d.ts +0 -0
  93. package/types/components/FAB/ActionGroup/StyledActionItem.d.ts +0 -0
  94. package/types/components/FAB/ActionGroup/index.d.ts +0 -0
  95. package/types/components/FAB/AnimatedFABIcon.d.ts +0 -0
  96. package/types/components/FAB/FAB.d.ts +0 -0
  97. package/types/components/FAB/StyledFAB.d.ts +0 -0
  98. package/types/components/FAB/index.d.ts +0 -0
  99. package/types/components/Icon/AnimatedIcon.d.ts +0 -0
  100. package/types/components/Icon/HeroIcon/index.d.ts +0 -0
  101. package/types/components/Icon/IconList.d.ts +0 -0
  102. package/types/components/Icon/index.d.ts +0 -0
  103. package/types/components/Icon/utils.d.ts +0 -0
  104. package/types/components/Image/index.d.ts +0 -0
  105. package/types/components/List/BasicListItem.d.ts +0 -0
  106. package/types/components/List/ListItem.d.ts +0 -0
  107. package/types/components/List/StyledBasicListItem.d.ts +0 -0
  108. package/types/components/List/StyledListItem.d.ts +0 -0
  109. package/types/components/List/index.d.ts +0 -0
  110. package/types/components/PageControl/StyledPageControl.d.ts +0 -0
  111. package/types/components/PageControl/index.d.ts +0 -0
  112. package/types/components/PinInput/PinCell.d.ts +0 -0
  113. package/types/components/PinInput/StyledPinInput.d.ts +0 -0
  114. package/types/components/PinInput/index.d.ts +0 -0
  115. package/types/components/Progress/ProgressBar.d.ts +0 -0
  116. package/types/components/Progress/ProgressCircle.d.ts +0 -0
  117. package/types/components/Progress/StyledProgressBar.d.ts +0 -0
  118. package/types/components/Progress/StyledProgressCircle.d.ts +0 -0
  119. package/types/components/Progress/__tests__/index.spec.d.ts +0 -0
  120. package/types/components/Progress/constants.d.ts +0 -0
  121. package/types/components/Progress/index.d.ts +0 -0
  122. package/types/components/Progress/types.d.ts +0 -0
  123. package/types/components/Radio/Radio.d.ts +0 -0
  124. package/types/components/Radio/RadioGroup.d.ts +0 -0
  125. package/types/components/Radio/StyledRadio.d.ts +0 -0
  126. package/types/components/Radio/index.d.ts +0 -0
  127. package/types/components/Radio/types.d.ts +0 -0
  128. package/types/components/RefreshControl/index.d.ts +0 -0
  129. package/types/components/RichTextEditor/EditorEvent.d.ts +0 -0
  130. package/types/components/RichTextEditor/EditorToolbar.d.ts +0 -0
  131. package/types/components/RichTextEditor/MentionList.d.ts +0 -0
  132. package/types/components/RichTextEditor/RichTextEditor.d.ts +0 -0
  133. package/types/components/RichTextEditor/StyledRichTextEditor.d.ts +0 -0
  134. package/types/components/RichTextEditor/StyledToolbar.d.ts +0 -0
  135. package/types/components/RichTextEditor/__mocks__/heroEditorApp.d.ts +0 -0
  136. package/types/components/RichTextEditor/constants.d.ts +0 -0
  137. package/types/components/RichTextEditor/heroEditorApp.d.ts +0 -0
  138. package/types/components/RichTextEditor/index.d.ts +0 -0
  139. package/types/components/RichTextEditor/types.d.ts +0 -0
  140. package/types/components/RichTextEditor/utils/events.d.ts +0 -0
  141. package/types/components/RichTextEditor/utils/rnWebView.d.ts +0 -0
  142. package/types/components/SectionHeading/StyledHeading.d.ts +0 -0
  143. package/types/components/SectionHeading/index.d.ts +0 -0
  144. package/types/components/Select/BaseOptionList.d.ts +0 -0
  145. package/types/components/Select/Footer.d.ts +0 -0
  146. package/types/components/Select/MultiSelect/Option.d.ts +0 -0
  147. package/types/components/Select/MultiSelect/OptionList.d.ts +0 -0
  148. package/types/components/Select/MultiSelect/index.d.ts +0 -0
  149. package/types/components/Select/SingleSelect/Option.d.ts +0 -0
  150. package/types/components/Select/SingleSelect/OptionList.d.ts +0 -0
  151. package/types/components/Select/SingleSelect/StyledSingleSelect.d.ts +0 -0
  152. package/types/components/Select/SingleSelect/index.d.ts +0 -0
  153. package/types/components/Select/StyledSelect.d.ts +0 -0
  154. package/types/components/Select/helpers.d.ts +0 -0
  155. package/types/components/Select/index.d.ts +0 -0
  156. package/types/components/Select/types.d.ts +0 -0
  157. package/types/components/Skeleton/StyledSkeleton.d.ts +0 -0
  158. package/types/components/Skeleton/index.d.ts +0 -0
  159. package/types/components/Slider/index.d.ts +0 -0
  160. package/types/components/Spinner/AnimatedSpinner.d.ts +0 -0
  161. package/types/components/Spinner/StyledSpinner.d.ts +0 -0
  162. package/types/components/Spinner/index.d.ts +0 -0
  163. package/types/components/Success/StyledSuccess.d.ts +0 -0
  164. package/types/components/Success/index.d.ts +8 -0
  165. package/types/components/Swipeable/StyledSwipeable.d.ts +0 -0
  166. package/types/components/Swipeable/SwipeableAction.d.ts +0 -0
  167. package/types/components/Swipeable/index.d.ts +0 -0
  168. package/types/components/Switch/SelectorSwitch/Option.d.ts +0 -0
  169. package/types/components/Switch/SelectorSwitch/StyledSelectorSwitch.d.ts +0 -0
  170. package/types/components/Switch/SelectorSwitch/index.d.ts +0 -0
  171. package/types/components/Switch/StyledSwitch.d.ts +0 -0
  172. package/types/components/Switch/index.d.ts +0 -0
  173. package/types/components/Tabs/ActiveTabIndicator.d.ts +0 -0
  174. package/types/components/Tabs/SceneView.d.ts +4 -3
  175. package/types/components/Tabs/ScrollableTabs.d.ts +0 -0
  176. package/types/components/Tabs/ScrollableTabsHeader.d.ts +0 -0
  177. package/types/components/Tabs/StyledScrollableTabs.d.ts +0 -0
  178. package/types/components/Tabs/StyledTabs.d.ts +0 -0
  179. package/types/components/Tabs/TabWithBadge.d.ts +0 -0
  180. package/types/components/Tabs/index.d.ts +1 -3
  181. package/types/components/Tabs/useIsFocused.d.ts +6 -0
  182. package/types/components/Tabs/utils.d.ts +0 -0
  183. package/types/components/Tag/StyledTag.d.ts +0 -0
  184. package/types/components/Tag/index.d.ts +0 -0
  185. package/types/components/TextInput/StyledTextInput.d.ts +0 -0
  186. package/types/components/TextInput/index.d.ts +0 -0
  187. package/types/components/TimePicker/StyledTimePicker.d.ts +0 -0
  188. package/types/components/TimePicker/TimePickerAndroid.d.ts +0 -0
  189. package/types/components/TimePicker/TimePickerIOS.d.ts +0 -0
  190. package/types/components/TimePicker/index.d.ts +0 -0
  191. package/types/components/TimePicker/types.d.ts +0 -0
  192. package/types/components/Toast/StyledToast.d.ts +0 -0
  193. package/types/components/Toast/Toast.d.ts +0 -0
  194. package/types/components/Toast/ToastContainer.d.ts +0 -0
  195. package/types/components/Toast/ToastContext.d.ts +0 -0
  196. package/types/components/Toast/ToastProvider.d.ts +0 -0
  197. package/types/components/Toast/index.d.ts +0 -0
  198. package/types/components/Toast/types.d.ts +0 -0
  199. package/types/components/Toolbar/StyledToolbar.d.ts +0 -0
  200. package/types/components/Toolbar/ToolbarGroup.d.ts +0 -0
  201. package/types/components/Toolbar/ToolbarItem.d.ts +0 -0
  202. package/types/components/Toolbar/index.d.ts +0 -0
  203. package/types/components/Typography/Text/StyledText.d.ts +0 -0
  204. package/types/components/Typography/Text/index.d.ts +0 -0
  205. package/types/components/Typography/index.d.ts +0 -0
  206. package/types/index.d.ts +0 -0
  207. package/types/testHelpers/renderWithTheme.d.ts +0 -0
  208. package/types/theme/ThemeProvider.d.ts +0 -0
  209. package/types/theme/ThemeSwitcher.d.ts +0 -0
  210. package/types/theme/components/accordion.d.ts +0 -0
  211. package/types/theme/components/alert.d.ts +0 -0
  212. package/types/theme/components/attachment.d.ts +0 -0
  213. package/types/theme/components/avatar.d.ts +0 -0
  214. package/types/theme/components/badge.d.ts +0 -0
  215. package/types/theme/components/bottomNavigation.d.ts +0 -0
  216. package/types/theme/components/bottomSheet.d.ts +0 -0
  217. package/types/theme/components/button.d.ts +0 -0
  218. package/types/theme/components/calendar.d.ts +0 -0
  219. package/types/theme/components/card.d.ts +0 -0
  220. package/types/theme/components/cardCarousel.d.ts +0 -0
  221. package/types/theme/components/carousel.d.ts +0 -0
  222. package/types/theme/components/checkbox.d.ts +0 -0
  223. package/types/theme/components/contentNavigator.d.ts +0 -0
  224. package/types/theme/components/datePicker.d.ts +0 -0
  225. package/types/theme/components/divider.d.ts +0 -0
  226. package/types/theme/components/drawer.d.ts +0 -0
  227. package/types/theme/components/empty.d.ts +0 -0
  228. package/types/theme/components/error.d.ts +0 -0
  229. package/types/theme/components/fab.d.ts +0 -0
  230. package/types/theme/components/icon.d.ts +0 -0
  231. package/types/theme/components/image.d.ts +0 -0
  232. package/types/theme/components/list.d.ts +0 -0
  233. package/types/theme/components/pageControl.d.ts +0 -0
  234. package/types/theme/components/pinInput.d.ts +0 -0
  235. package/types/theme/components/progress.d.ts +0 -0
  236. package/types/theme/components/radio.d.ts +0 -0
  237. package/types/theme/components/refreshControl.d.ts +0 -0
  238. package/types/theme/components/richTextEditor.d.ts +0 -0
  239. package/types/theme/components/sectionHeading.d.ts +0 -0
  240. package/types/theme/components/select.d.ts +0 -0
  241. package/types/theme/components/skeleton.d.ts +0 -0
  242. package/types/theme/components/slider.d.ts +0 -0
  243. package/types/theme/components/spinner.d.ts +0 -0
  244. package/types/theme/components/success.d.ts +0 -0
  245. package/types/theme/components/swipeable.d.ts +0 -0
  246. package/types/theme/components/switch.d.ts +0 -0
  247. package/types/theme/components/tabs.d.ts +0 -0
  248. package/types/theme/components/tag.d.ts +0 -0
  249. package/types/theme/components/textInput.d.ts +0 -0
  250. package/types/theme/components/timePicker.d.ts +0 -0
  251. package/types/theme/components/toast.d.ts +0 -0
  252. package/types/theme/components/toolbar.d.ts +0 -0
  253. package/types/theme/components/typography.d.ts +0 -0
  254. package/types/theme/getTheme.d.ts +0 -0
  255. package/types/theme/global/borders.d.ts +0 -0
  256. package/types/theme/global/colors/eBens.d.ts +0 -0
  257. package/types/theme/global/colors/global.d.ts +0 -0
  258. package/types/theme/global/colors/globalDark.d.ts +0 -0
  259. package/types/theme/global/colors/jobs.d.ts +0 -0
  260. package/types/theme/global/colors/swag.d.ts +0 -0
  261. package/types/theme/global/colors/swagDark.d.ts +0 -0
  262. package/types/theme/global/colors/types.d.ts +0 -0
  263. package/types/theme/global/colors/wallet.d.ts +0 -0
  264. package/types/theme/global/colors/work.d.ts +0 -0
  265. package/types/theme/global/index.d.ts +0 -0
  266. package/types/theme/global/scale.d.ts +0 -0
  267. package/types/theme/global/sizes.d.ts +0 -0
  268. package/types/theme/global/space.d.ts +0 -0
  269. package/types/theme/global/typography.d.ts +0 -0
  270. package/types/theme/index.d.ts +0 -0
  271. package/types/types.d.ts +0 -0
  272. package/types/utils/functions.d.ts +0 -0
  273. package/types/utils/helpers.d.ts +0 -0
  274. package/types/utils/hooks.d.ts +0 -0
  275. package/types/utils/scale.d.ts +0 -0
  276. package/.turbo/turbo-build:types.log +0 -2
  277. package/.turbo/turbo-lint.log +0 -146
  278. package/.turbo/turbo-test.log +0 -451
  279. package/.turbo/turbo-type-check.log +0 -1
  280. package/src/components/Tabs/ScrollableTabsV2/ScrollableTabsV2.tsx +0 -120
  281. package/src/components/Tabs/ScrollableTabsV2/__tests__/ScrollableTabsV2.spec.tsx +0 -166
  282. package/src/components/Tabs/ScrollableTabsV2/__tests__/__snapshots__/ScrollableTabsV2.spec.tsx.snap +0 -2497
  283. package/src/components/Tabs/ScrollableTabsV2/index.tsx +0 -5
  284. package/types/components/Tabs/ScrollableTabsV2/SceneView.d.ts +0 -10
  285. package/types/components/Tabs/ScrollableTabsV2/ScrollableTabsV2.d.ts +0 -9
  286. package/types/components/Tabs/ScrollableTabsV2/index.d.ts +0 -4
  287. /package/src/components/Tabs/{ScrollableTabsV2/__tests__ → __tests__}/__snapshots__/SceneView.spec.tsx.snap +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hero-design/rn",
3
- "version": "8.24.0-alpha.1",
3
+ "version": "8.24.0",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -21,7 +21,7 @@
21
21
  "dependencies": {
22
22
  "@emotion/native": "^11.9.3",
23
23
  "@emotion/react": "^11.9.3",
24
- "@hero-design/colors": "8.23.0",
24
+ "@hero-design/colors": "8.24.0",
25
25
  "date-fns": "^2.16.1",
26
26
  "events": "^3.2.0",
27
27
  "hero-editor": "^1.9.21"
@@ -45,7 +45,7 @@
45
45
  "@babel/preset-typescript": "^7.17.12",
46
46
  "@babel/runtime": "^7.18.9",
47
47
  "@emotion/jest": "^11.9.3",
48
- "@hero-design/eslint-plugin": "8.23.0",
48
+ "@hero-design/eslint-plugin": "8.24.0",
49
49
  "@react-native-community/datetimepicker": "^3.5.2",
50
50
  "@react-native-community/slider": "4.1.12",
51
51
  "@rollup/plugin-babel": "^5.3.1",
@@ -61,9 +61,9 @@
61
61
  "@types/react-native": "^0.67.7",
62
62
  "@types/react-native-vector-icons": "^6.4.10",
63
63
  "babel-plugin-inline-import": "^3.0.0",
64
- "eslint-config-hd": "8.23.0",
64
+ "eslint-config-hd": "8.24.0",
65
65
  "jest": "^27.3.1",
66
- "prettier-config-hd": "8.23.0",
66
+ "prettier-config-hd": "8.24.0",
67
67
  "react": "18.0.0",
68
68
  "react-native": "0.69.7",
69
69
  "react-native-gesture-handler": "~2.1.0",
@@ -10,7 +10,7 @@ import React, {
10
10
  useState,
11
11
  } from 'react';
12
12
 
13
- import { Keyboard, TouchableWithoutFeedback } from 'react-native';
13
+ import { TouchableWithoutFeedback } from 'react-native';
14
14
  import { WebView } from 'react-native-webview';
15
15
  import type { ComponentType, ReactElement, Ref } from 'react';
16
16
  import type { StyleProp, ViewStyle } from 'react-native';
@@ -207,11 +207,10 @@ const RichTextEditor: ComponentType<RichTextEditorProps> = ({
207
207
  }, []);
208
208
 
209
209
  const requestBlur = useCallback(() => {
210
- if (webview.current) {
210
+ if (webview.current && isFocused) {
211
211
  requestBlurEditor(webview.current);
212
- Keyboard.dismiss();
213
212
  }
214
- }, []);
213
+ }, [isFocused]);
215
214
 
216
215
  useImperativeHandle(forwardedRef, () => ({ requestBlur }), [requestBlur]);
217
216
 
@@ -61,6 +61,7 @@ describe('Success', () => {
61
61
  });
62
62
  it('handles CTA press correctly', () => {
63
63
  const onCtaPress = jest.fn();
64
+ const onSecondCtaPress = jest.fn();
64
65
  const { getByText } = renderWithTheme(
65
66
  <Success
66
67
  title={title}
@@ -68,11 +69,16 @@ describe('Success', () => {
68
69
  image="path_to_image"
69
70
  ctaText="CTA Text"
70
71
  onCtaPress={onCtaPress}
72
+ secondaryCtaText="Second CTA Text"
73
+ onSecondaryCtaPress={onSecondCtaPress}
71
74
  />
72
75
  );
73
76
 
74
77
  const CTA = getByText('CTA Text');
75
78
  fireEvent.press(CTA);
79
+ const secondCTA = getByText('Second CTA Text');
80
+ fireEvent.press(secondCTA);
76
81
  expect(onCtaPress).toBeCalledTimes(1);
82
+ expect(onSecondCtaPress).toBeCalledTimes(1);
77
83
  });
78
84
  });
@@ -47,6 +47,14 @@ export interface SuccessProps extends ViewProps {
47
47
  * Callback when the action button is pressed.
48
48
  */
49
49
  onCtaPress?: () => void;
50
+ /**
51
+ * Secondary button text.
52
+ */
53
+ secondaryCtaText?: string;
54
+ /**
55
+ * Callback when the secondary button is pressed.
56
+ */
57
+ onSecondaryCtaPress?: () => void;
50
58
  /**
51
59
  * Testing id of the component.
52
60
  */
@@ -78,8 +86,12 @@ const SuccessPage = ({
78
86
  testID,
79
87
  ctaText,
80
88
  onCtaPress = noop,
89
+ secondaryCtaText,
90
+ onSecondaryCtaPress,
81
91
  ...nativeProps
82
92
  }: SuccessProps): ReactElement => {
93
+ const showSecondaryButton = secondaryCtaText && onSecondaryCtaPress;
94
+
83
95
  return (
84
96
  <StyledSuccessContainer
85
97
  testID={testID}
@@ -102,6 +114,13 @@ const SuccessPage = ({
102
114
  {!!ctaText && (
103
115
  <StyledSuccessButtonContainer>
104
116
  <StyledSuccessButtonPrimary text={ctaText} onPress={onCtaPress} />
117
+ {!!showSecondaryButton && (
118
+ <StyledSuccessButtonPrimary
119
+ variant="text"
120
+ text={secondaryCtaText}
121
+ onPress={onSecondaryCtaPress}
122
+ />
123
+ )}
105
124
  </StyledSuccessButtonContainer>
106
125
  )}
107
126
  </StyledSuccessContainer>
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { StyleSheet } from 'react-native';
3
- import { TabScreen } from '../StyledScrollableTabs';
3
+ import { TabScreen } from './StyledScrollableTabs';
4
4
 
5
- export const SceneView = ({
5
+ const SceneView = ({
6
6
  lazy = false,
7
7
  lazyPreloadDistance = 1,
8
8
  children,
@@ -1,13 +1,11 @@
1
1
  import React from 'react';
2
2
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
3
3
  import PagerView from 'react-native-pager-view';
4
- import {
5
- TabContainer,
6
- TabScreen,
7
- ContentWrapper,
8
- } from './StyledScrollableTabs';
4
+ import { TabContainer, ContentWrapper } from './StyledScrollableTabs';
9
5
  import type { TabsProps } from '.';
6
+ import SceneView from './SceneView';
10
7
  import ScrollableTabHeader from './ScrollableTabsHeader';
8
+ import { ScreenContext, TabContext } from './useIsFocused';
11
9
 
12
10
  const ScrollableTab = ({
13
11
  onTabPress,
@@ -25,6 +23,7 @@ const ScrollableTab = ({
25
23
  const selectedTabIndex = tabs.findIndex(
26
24
  (item) => item.key === selectedTabKey
27
25
  );
26
+
28
27
  React.useEffect(() => {
29
28
  let timeoutHandle: number | null = null;
30
29
  if (selectedTabIndex !== -1) {
@@ -43,51 +42,58 @@ const ScrollableTab = ({
43
42
  };
44
43
  }, [selectedTabIndex, pagerViewRef]);
45
44
 
45
+ const tabContextProviderValue = React.useMemo(
46
+ () => ({
47
+ selectedTabKey,
48
+ }),
49
+ [selectedTabKey]
50
+ );
51
+
46
52
  return (
47
- <TabContainer style={containerStyle} testID={componentTestID}>
48
- <ScrollableTabHeader
49
- tabs={tabs}
50
- selectedIndex={selectedTabIndex}
51
- onTabPress={onTabPress}
52
- barStyle={barStyle}
53
- insets={insets}
54
- testID={componentTestID ? `${componentTestID}-tab-bar` : undefined}
55
- />
56
- <ContentWrapper
57
- initialPage={selectedTabIndex}
58
- ref={pagerViewRef}
59
- onPageSelected={(e) => {
60
- const index = e.nativeEvent.position;
61
- const selectedItem = tabs[index];
62
- if (selectedItem) {
63
- onTabPress(selectedItem.key);
64
- }
65
- }}
66
- scrollEnabled={swipeEnabled}
67
- >
68
- {tabs.map((tab, index) => {
69
- const { key, component, testID } = tab;
70
- const active = selectedTabKey === key;
71
- const isLazyScreen =
72
- lazy && Math.abs(selectedTabIndex - index) > lazyPreloadDistance;
53
+ <TabContext.Provider value={tabContextProviderValue}>
54
+ <TabContainer style={containerStyle} testID={componentTestID}>
55
+ <ScrollableTabHeader
56
+ tabs={tabs}
57
+ selectedIndex={selectedTabIndex}
58
+ onTabPress={onTabPress}
59
+ barStyle={barStyle}
60
+ insets={insets}
61
+ testID={componentTestID ? `${componentTestID}-tab-bar` : undefined}
62
+ />
63
+ <ContentWrapper
64
+ initialPage={selectedTabIndex}
65
+ ref={pagerViewRef}
66
+ onPageSelected={(e) => {
67
+ const index = e.nativeEvent.position;
68
+ const selectedItem = tabs[index];
69
+ if (selectedItem) {
70
+ setTimeout(() => {
71
+ onTabPress(selectedItem.key);
72
+ });
73
+ }
74
+ }}
75
+ scrollEnabled={swipeEnabled}
76
+ >
77
+ {tabs.map((tab, index) => {
78
+ const { key, component, testID } = tab;
73
79
 
74
- return (
75
- <TabScreen
76
- key={key}
77
- testID={testID ? `tab-screen-${testID}` : undefined}
78
- pointerEvents={active ? 'auto' : 'none'}
79
- accessibilityElementsHidden={!active}
80
- importantForAccessibility={
81
- active ? 'auto' : 'no-hide-descendants'
82
- }
83
- collapsable={false}
84
- >
85
- {isLazyScreen ? null : component}
86
- </TabScreen>
87
- );
88
- })}
89
- </ContentWrapper>
90
- </TabContainer>
80
+ return (
81
+ <ScreenContext.Provider value={key} key={key}>
82
+ <SceneView
83
+ testID={testID}
84
+ index={index}
85
+ selectedIndex={selectedTabIndex}
86
+ lazy={lazy}
87
+ lazyPreloadDistance={lazyPreloadDistance}
88
+ >
89
+ {component}
90
+ </SceneView>
91
+ </ScreenContext.Provider>
92
+ );
93
+ })}
94
+ </ContentWrapper>
95
+ </TabContainer>
96
+ </TabContext.Provider>
91
97
  );
92
98
  };
93
99
 
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { ThemeProvider } from '@emotion/react';
3
- import renderWithTheme from '../../../../testHelpers/renderWithTheme';
3
+ import renderWithTheme from '../../../testHelpers/renderWithTheme';
4
4
  import ScenceView from '../SceneView';
5
- import Typography from '../../../Typography';
6
- import { theme } from '../../../../index';
5
+ import Typography from '../../Typography';
6
+ import { theme } from '../../../index';
7
7
 
8
8
  describe('ScenceView', () => {
9
9
  describe('lazy', () => {
@@ -1,16 +1,25 @@
1
1
  import React from 'react';
2
2
  import { Text } from 'react-native';
3
- import { fireEvent } from '@testing-library/react-native';
3
+ import { fireEvent, waitFor } from '@testing-library/react-native';
4
4
  import { SafeAreaProvider } from 'react-native-safe-area-context';
5
5
  import type { ComponentProps } from 'react';
6
6
  import renderWithTheme from '../../../testHelpers/renderWithTheme';
7
- import Tabs from '..';
7
+ import ScrollableTabs from '../ScrollableTabs';
8
8
  import Button from '../../Button';
9
9
  import type { TabType } from '..';
10
+ import { useIsFocused } from '../useIsFocused';
10
11
 
12
+ const CustomScreen = ({ title }: { title: string }) => {
13
+ const isFocused = useIsFocused();
14
+ return (
15
+ <Text>
16
+ {title} {isFocused ? 'focused' : 'unfocused'}
17
+ </Text>
18
+ );
19
+ };
11
20
  const TestTabsComponent = (
12
21
  props: Omit<
13
- ComponentProps<typeof Tabs>,
22
+ ComponentProps<typeof ScrollableTabs>,
14
23
  'selectedTabKey' | 'onTabPress' | 'tabs'
15
24
  >
16
25
  ) => {
@@ -19,19 +28,19 @@ const TestTabsComponent = (
19
28
  {
20
29
  key: 'work',
21
30
  activeItem: 'Work',
22
- component: <Text>Work Screen</Text>,
31
+ component: <CustomScreen title="Work Screen" />,
23
32
  },
24
33
  {
25
34
  key: 'personal',
26
35
  activeItem: 'speaker',
27
36
  inactiveItem: 'speaker-outlined',
28
- component: <Text>Personal Screen</Text>,
37
+ component: <CustomScreen title="Personal Screen" />,
29
38
  },
30
39
  {
31
40
  key: 'home',
32
41
  activeItem: 'home',
33
42
  inactiveItem: 'home-outlined',
34
- component: <Text>Home Screen</Text>,
43
+ component: <CustomScreen title="Home Screen" />,
35
44
  badge: {
36
45
  type: 'status',
37
46
  },
@@ -40,7 +49,7 @@ const TestTabsComponent = (
40
49
  key: 'calendar',
41
50
  activeItem: 'calendar',
42
51
  inactiveItem: 'calendar-dates-outlined',
43
- component: <Text>Calendar Screen</Text>,
52
+ component: <CustomScreen title="Calendar Screen" />,
44
53
  badge: {
45
54
  type: 'counter',
46
55
  value: 50,
@@ -60,7 +69,7 @@ const TestTabsComponent = (
60
69
  onPress={() => setSelectedTabKey('work')}
61
70
  icon="sync"
62
71
  />
63
- <Tabs.Scroll
72
+ <ScrollableTabs
64
73
  {...props}
65
74
  tabs={tabs}
66
75
  selectedTabKey={selectedTabKey}
@@ -71,7 +80,7 @@ const TestTabsComponent = (
71
80
  };
72
81
 
73
82
  describe('Tabs.Scroll', () => {
74
- it('renders correctly', () => {
83
+ it('renders correctly', async () => {
75
84
  const { getByTestId, getByText, toJSON } = renderWithTheme(
76
85
  <TestTabsComponent />
77
86
  );
@@ -80,30 +89,79 @@ describe('Tabs.Scroll', () => {
80
89
  expect(getByText('Work')).toBeDefined();
81
90
  expect(getByTestId('hero-icon-speaker-outlined')).toBeDefined();
82
91
  expect(getByTestId('hero-icon-home-outlined')).toBeDefined();
83
- expect(getByText('Work Screen')).toBeDefined();
84
- fireEvent.press(getByTestId('hero-icon-speaker-outlined'));
85
- expect(getByText('Personal Screen')).toBeDefined();
86
- fireEvent.press(getByTestId('hero-icon-home-outlined'));
87
- expect(getByText('Home Screen')).toBeDefined();
88
- fireEvent.press(getByTestId('hero-icon-calendar-dates-outlined'));
89
- expect(getByText('Calendar Screen')).toBeDefined();
90
- expect(getByText('50')).toBeDefined();
91
- fireEvent.press(getByText('Move to Work'));
92
- expect(getByText('Work Screen')).toBeDefined();
92
+ expect(getByText('Work Screen focused')).toBeDefined();
93
+ expect(getByText('Personal Screen unfocused')).toBeDefined();
94
+ await waitFor(() =>
95
+ expect(getByText('Home Screen unfocused')).toBeDefined()
96
+ );
97
+
98
+ expect(getByText('Home Screen unfocused')).toBeDefined();
99
+ expect(getByText('Calendar Screen unfocused')).toBeDefined();
100
+ });
101
+
102
+ describe('lazy', () => {
103
+ it('render all screens when lazy = false', async () => {
104
+ const { queryByText } = renderWithTheme(
105
+ <TestTabsComponent lazy={false} />
106
+ );
107
+ expect(queryByText('Work Screen focused')).toBeDefined();
108
+ expect(queryByText('Personal Screen unfocused')).toBeDefined();
109
+ await waitFor(() =>
110
+ expect(queryByText('Home Screen unfocused')).toBeDefined()
111
+ );
112
+ expect(queryByText('Home Screen unfocused')).toBeDefined();
113
+ expect(queryByText('Calendar Screen unfocused')).toBeDefined();
114
+ });
115
+
116
+ it('not render lazy screen', async () => {
117
+ const { toJSON, queryByText } = renderWithTheme(
118
+ <TestTabsComponent lazyPreloadDistance={1} lazy />
119
+ );
120
+ expect(queryByText('Work Screen focused')).toBeDefined();
121
+ expect(queryByText('Personal Screen unfocused')).toBeDefined();
122
+ await waitFor(() =>
123
+ expect(queryByText('Home Screen unfocused')).toBeDefined()
124
+ );
125
+ expect(toJSON()).toMatchSnapshot('xxx');
126
+ expect(queryByText('Home Screen unfocused')).toBeDefined();
127
+ expect(queryByText('Calendar Screen unfocused')).toBeNull();
128
+ });
93
129
  });
130
+ });
94
131
 
95
- it('renders correctly with lazy preloaded', () => {
96
- const { getByText, queryByText, getByTestId } = renderWithTheme(
97
- <TestTabsComponent lazy lazyPreloadDistance={1} swipeEnabled={false} />
132
+ describe('useIsFocused', () => {
133
+ it('renders correctly', async () => {
134
+ const { getByTestId, getByText, toJSON } = renderWithTheme(
135
+ <TestTabsComponent />
98
136
  );
99
137
 
100
- expect(getByText('Work Screen')).toBeDefined();
101
- expect(getByText('Personal Screen')).toBeDefined();
102
- // Preload distance is 1, so Home Screen is not rendered.
103
- expect(queryByText('Home Screen')).toBeNull();
138
+ expect(toJSON()).toMatchSnapshot();
139
+ expect(getByText('Work')).toBeDefined();
140
+ expect(getByTestId('hero-icon-speaker-outlined')).toBeDefined();
141
+ expect(getByTestId('hero-icon-home-outlined')).toBeDefined();
142
+ await waitFor(() => expect(getByText('Work Screen focused')).toBeDefined());
143
+ expect(getByText('Work Screen focused')).toBeDefined();
144
+ expect(getByText('Personal Screen unfocused')).toBeDefined();
145
+ expect(getByText('Home Screen unfocused')).toBeDefined();
146
+ expect(getByText('Calendar Screen unfocused')).toBeDefined();
147
+
148
+ fireEvent.press(getByTestId('hero-icon-speaker-outlined'));
149
+ expect(getByText('Personal Screen focused')).toBeDefined();
150
+ expect(getByText('Work Screen unfocused')).toBeDefined();
151
+ expect(getByText('Home Screen unfocused')).toBeDefined();
152
+ expect(getByText('Calendar Screen unfocused')).toBeDefined();
104
153
 
105
154
  fireEvent.press(getByTestId('hero-icon-home-outlined'));
106
- expect(getByText('Home Screen')).toBeDefined();
107
- expect(queryByText('Work Screen')).toBeNull();
155
+ expect(getByText('Personal Screen unfocused')).toBeDefined();
156
+ expect(getByText('Work Screen unfocused')).toBeDefined();
157
+ expect(getByText('Home Screen focused')).toBeDefined();
158
+ expect(getByText('Calendar Screen unfocused')).toBeDefined();
159
+
160
+ fireEvent.press(getByTestId('hero-icon-calendar-dates-outlined'));
161
+ expect(getByText('Personal Screen unfocused')).toBeDefined();
162
+ expect(getByText('Work Screen unfocused')).toBeDefined();
163
+ expect(getByText('Home Screen unfocused')).toBeDefined();
164
+ expect(getByText('Calendar Screen focused')).toBeDefined();
165
+ expect(getByText('50')).toBeDefined();
108
166
  });
109
167
  });