@applicaster/zapp-react-native-ui-components 13.0.0-alpha.2040752175 → 13.0.0-alpha.2060875348

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 (173) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  3. package/Components/AppContainer/__tests__/__snapshots__/AppContainer.test.js.snap +1 -1
  4. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  5. package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
  6. package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
  7. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +56 -113
  8. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +39 -23
  9. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
  10. package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
  11. package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
  12. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  13. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  14. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  15. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  16. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  17. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  18. package/Components/BaseFocusable/index.ios.ts +1 -1
  19. package/Components/BaseFocusable/index.tsx +67 -31
  20. package/Components/Cell/Cell.tsx +15 -9
  21. package/Components/Cell/CellWithFocusable.tsx +44 -59
  22. package/Components/Cell/TvOSCellComponent.tsx +23 -30
  23. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  24. package/Components/Cell/index.js +3 -1
  25. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +50 -50
  26. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  27. package/Components/ComponentResolver/__tests__/componentResolver.test.js +26 -30
  28. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  29. package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
  30. package/Components/ErrorScreen/index.tsx +6 -6
  31. package/Components/Focusable/Focusable.tsx +1 -54
  32. package/Components/Focusable/FocusableTvOS.tsx +6 -2
  33. package/Components/Focusable/Touchable.tsx +19 -20
  34. package/Components/Focusable/index.android.tsx +10 -3
  35. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -83
  36. package/Components/FocusableGroup/index.tsx +1 -3
  37. package/Components/FocusableList/index.tsx +26 -10
  38. package/Components/FocusableScrollView/index.tsx +43 -13
  39. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +9 -0
  40. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  41. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  42. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +1 -0
  43. package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
  44. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +6 -5
  45. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +12 -11
  46. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  47. package/Components/Layout/TV/__tests__/index.test.tsx +7 -3
  48. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  49. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +66 -0
  50. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
  51. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +6 -12
  52. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
  53. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  54. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
  55. package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
  56. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  57. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  58. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  59. package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
  60. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +11 -19
  61. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +6 -235
  62. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  63. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  64. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  65. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
  66. package/Components/MasterCell/utils/index.ts +1 -1
  67. package/Components/ModalComponent/Button/index.tsx +6 -6
  68. package/Components/ModalComponent/Header/index.tsx +3 -3
  69. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  70. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  71. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  72. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  73. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
  74. package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
  75. package/Components/PlayerContainer/PlayerContainer.tsx +13 -19
  76. package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
  77. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  78. package/Components/PlayerImageBackground/index.tsx +23 -3
  79. package/Components/River/ComponentsMap/ComponentsMap.tsx +39 -66
  80. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  81. package/Components/River/RefreshControl.tsx +1 -1
  82. package/Components/River/RiverFooter.tsx +39 -9
  83. package/Components/River/RiverItem.tsx +37 -2
  84. package/Components/River/TV/index.tsx +6 -1
  85. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +114 -45
  86. package/Components/River/__tests__/__snapshots__/river.test.js.snap +21 -83
  87. package/Components/River/__tests__/componentsMap.test.js +64 -17
  88. package/Components/River/__tests__/river.test.js +75 -40
  89. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +12 -5
  90. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  91. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  92. package/Components/Screen/__tests__/Screen.test.tsx +41 -27
  93. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
  94. package/Components/Screen/hooks.ts +56 -0
  95. package/Components/Screen/index.tsx +16 -42
  96. package/Components/ScreenResolver/__tests__/screenResolver.test.js +95 -70
  97. package/Components/Tabs/Tab.tsx +12 -9
  98. package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
  99. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
  100. package/Components/TextInputTv/index.tsx +6 -5
  101. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
  102. package/Components/Transitioner/AnimationManager.js +8 -8
  103. package/Components/Transitioner/Scene.tsx +53 -24
  104. package/Components/Transitioner/Transitioner.tsx +3 -3
  105. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  106. package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
  107. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +10 -50
  108. package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
  109. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +4 -4
  110. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  111. package/Components/Transitioner/index.js +8 -4
  112. package/Components/VideoLive/LiveImageManager.ts +27 -1
  113. package/Components/VideoLive/PlayerLiveImageComponent.tsx +32 -24
  114. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +63 -8
  115. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +5 -10
  116. package/Components/VideoLive/animationUtils.ts +7 -4
  117. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +16 -12
  118. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +5 -1
  119. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +15 -14
  120. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +6 -13
  121. package/Components/VideoModal/ModalAnimation/index.ts +2 -1
  122. package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
  123. package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
  124. package/Components/VideoModal/OpaqueLayer.tsx +33 -0
  125. package/Components/VideoModal/PlayerDetails.tsx +9 -6
  126. package/Components/VideoModal/PlayerWrapper.tsx +17 -36
  127. package/Components/VideoModal/VideoModal.tsx +14 -23
  128. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
  129. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +13 -10
  130. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
  131. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +66 -156
  132. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +89 -0
  133. package/Components/VideoModal/hooks/index.ts +7 -0
  134. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +49 -0
  135. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +91 -0
  136. package/Components/VideoModal/hooks/utils/index.ts +33 -0
  137. package/Components/VideoModal/utils.ts +3 -5
  138. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  139. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  140. package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
  141. package/Components/Viewport/__tests__/utils.test.js +5 -4
  142. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  143. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  144. package/Components/ZappUIComponent/index.tsx +3 -16
  145. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  146. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  147. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  148. package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
  149. package/Contexts/ScreenContext/index.tsx +3 -2
  150. package/Decorators/Analytics/{index.js → index.tsx} +11 -11
  151. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  152. package/Decorators/Navigator/index.tsx +1 -1
  153. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
  154. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
  155. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
  156. package/Decorators/RiverFeedLoader/index.tsx +1 -1
  157. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
  158. package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
  159. package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
  160. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +27 -27
  161. package/Decorators/RiverResolver/index.tsx +1 -1
  162. package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
  163. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  164. package/Decorators/ZappPipesDataConnector/index.tsx +32 -2
  165. package/package.json +14 -8
  166. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  167. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  168. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  169. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  170. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  171. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  172. package/Decorators/RiverFeedLoader/utils.ts +0 -100
  173. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -1,13 +1,50 @@
1
1
  import React from "react";
2
- import { shallow } from "enzyme";
3
- import { shallowToJson } from "enzyme-to-json";
2
+ import { render, screen } from "@testing-library/react-native";
4
3
  import configureStore from "redux-mock-store";
4
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
5
+ import { Provider } from "react-redux";
5
6
 
6
- import { GeneralContentScreen } from "../../GeneralContentScreen";
7
- import { FeedLoader } from "../../FeedLoader";
8
- import { River } from "../index";
9
- import { RiverComponent } from "../River";
7
+ import { River } from "../";
10
8
  import { ScreenResolver } from "../../ScreenResolver";
9
+ import { RiverComponent } from "../River";
10
+
11
+ jest.mock(
12
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
13
+ () => ({
14
+ useIsScreenActive: jest.fn(() => true),
15
+ })
16
+ );
17
+
18
+ jest.mock(
19
+ "@applicaster/zapp-react-native-ui-components/Components/GeneralContentScreen",
20
+ () => {
21
+ const { View } = jest.requireActual("react-native");
22
+
23
+ return {
24
+ GeneralContentScreen: (props) => (
25
+ <View testID="general-content-screen" {...props} />
26
+ ),
27
+ };
28
+ }
29
+ );
30
+
31
+ jest.mock(
32
+ "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks",
33
+ () => ({
34
+ useScreenAnalytics: jest.fn(),
35
+ })
36
+ );
37
+
38
+ jest.mock(
39
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
40
+ () => ({
41
+ useNavigation: jest.fn(() => ({
42
+ videoModalState: {
43
+ mode: "test",
44
+ },
45
+ })),
46
+ })
47
+ );
11
48
 
12
49
  const river = {
13
50
  home: true,
@@ -55,24 +92,24 @@ const appData = { layoutVersion: "v1" };
55
92
  const store = configureStore()({ rivers, appData });
56
93
 
57
94
  describe("When River has a general_content type", () => {
58
- const wrapper = shallow(<RiverComponent {...riverProps} />);
59
-
60
- describe("<RiverComponent />", () => {
61
- it("renders correctly", () => {
62
- expect(shallowToJson(wrapper)).toMatchSnapshot();
63
- });
64
-
65
- it("it returns a GeneralContentScreen", () => {
66
- expect(wrapper.find(GeneralContentScreen).length).toBe(1);
67
- });
95
+ it("renders GeneralContentScreen correctly", () => {
96
+ const { getByTestId } = render(
97
+ <Provider store={store}>
98
+ <RiverComponent {...riverProps} />
99
+ </Provider>
100
+ );
101
+
102
+ expect(getByTestId("general-content-screen")).toBeTruthy();
68
103
  });
69
104
 
70
- describe("<River />", () => {
71
- const wrapper = shallow(<River screenId="A1234" store={store} />);
105
+ it("renders River component correctly", () => {
106
+ const wrapper = render(
107
+ <Provider store={store}>
108
+ <River screenId="A1234" />
109
+ </Provider>
110
+ );
72
111
 
73
- it("renders correctly", () => {
74
- expect(shallowToJson(wrapper)).toMatchSnapshot();
75
- });
112
+ expect(wrapper.toJSON()).toMatchSnapshot();
76
113
  });
77
114
  });
78
115
 
@@ -83,16 +120,10 @@ describe("When River has any other type other than general_content", () => {
83
120
  appData,
84
121
  };
85
122
 
86
- const wrapper = shallow(<RiverComponent {...riverPropsWithScreenPlugin} />);
87
-
88
- describe("<RiverComponent />", () => {
89
- it("renders correctly", () => {
90
- expect(shallowToJson(wrapper)).toMatchSnapshot();
91
- });
123
+ it("renders ScreenResolver correctly", () => {
124
+ renderWithProviders(<RiverComponent {...riverPropsWithScreenPlugin} />);
92
125
 
93
- it("it returns a ScreenResolver", () => {
94
- expect(wrapper.find(ScreenResolver).length).toBe(1);
95
- });
126
+ expect(screen.UNSAFE_getByType(ScreenResolver)).toBeDefined();
96
127
  });
97
128
  });
98
129
 
@@ -104,15 +135,19 @@ describe("When River has feed url", () => {
104
135
  appData: { layoutVersion: "v1" },
105
136
  };
106
137
 
107
- const wrapper = shallow(<RiverComponent {...riverPropsWithFeedUrl} />);
108
-
109
- describe("<RiverComponent />", () => {
110
- it("renders correctly", () => {
111
- expect(shallowToJson(wrapper)).toMatchSnapshot();
112
- });
113
-
114
- it("it returns a FeedLoader if it's a v1 layout", () => {
115
- expect(wrapper.find(FeedLoader).length).toBe(1);
116
- });
138
+ it("renders FeedLoader when layout is v1", () => {
139
+ const wrapper = renderWithProviders(
140
+ <RiverComponent {...riverPropsWithFeedUrl} />,
141
+ {
142
+ zappPipes: {
143
+ "https://some-feed-url.net": {
144
+ loading: false,
145
+ data: { entry: [] },
146
+ },
147
+ },
148
+ }
149
+ );
150
+
151
+ expect(wrapper.getByTestId("general-content-screen")).toBeDefined();
117
152
  });
118
153
  });
@@ -1,18 +1,25 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`<RouteManager /> renders correctly 1`] = `
4
- <TestId
5
- screenId="A1234"
4
+ <View
5
+ accessibilityLabel="A1234"
6
+ style={
7
+ {
8
+ "flex": 1,
9
+ }
10
+ }
11
+ testID="A1234"
6
12
  >
7
- <WithProvider
13
+ <View
8
14
  pathname="/river/A1234"
9
15
  screenData={
10
- Object {
16
+ {
11
17
  "id": "A1234",
12
18
  }
13
19
  }
14
20
  screenId="A1234"
15
21
  screenType="river"
22
+ testID="screen-resolver"
16
23
  />
17
- </TestId>
24
+ </View>
18
25
  `;
@@ -1,31 +1,46 @@
1
1
  import React from "react";
2
- import { shallow } from "enzyme";
3
- import { shallowToJson } from "enzyme-to-json";
2
+ import { render } from "@testing-library/react-native";
4
3
 
5
- const pathname = "/river/A1234";
6
- const screenData = { id: "A1234" };
4
+ import { RouteManager } from "../";
5
+
6
+ const mockPathname = "/river/A1234";
7
+ const mockScreenData = { id: "A1234" };
7
8
 
8
9
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
9
- useRoute: jest.fn(() => ({ pathname: pathname, screenData: screenData })),
10
+ useRoute: jest.fn(() => ({
11
+ pathname: mockPathname,
12
+ screenData: mockScreenData,
13
+ })),
10
14
  }));
11
15
 
12
- const {
13
- ScreenResolver,
14
- } = require("@applicaster/zapp-react-native-ui-components/Components/ScreenResolver");
16
+ jest.mock(
17
+ "@applicaster/zapp-react-native-ui-components/Components/ScreenResolver",
18
+ () => {
19
+ const { View } = jest.requireActual("react-native");
15
20
 
16
- const { RouteManager } = require("../index");
21
+ return {
22
+ ScreenResolver: (props) => <View testID="screen-resolver" {...props} />,
23
+ };
24
+ }
25
+ );
17
26
 
18
27
  describe("<RouteManager />", () => {
19
- const wrapper = shallow(
20
- <RouteManager pathname={pathname} screenData={screenData} />
21
- );
28
+ let wrapper;
29
+
30
+ beforeEach(() => {
31
+ jest.clearAllMocks();
32
+
33
+ wrapper = render(
34
+ <RouteManager pathname={mockPathname} screenData={mockScreenData} />
35
+ );
36
+ });
22
37
 
23
38
  it("renders correctly", () => {
24
- expect(shallowToJson(wrapper)).toMatchSnapshot();
39
+ expect(wrapper.toJSON()).toMatchSnapshot();
25
40
  });
26
41
 
27
42
  it("passes the correct props to ScreenResolver", () => {
28
- expect(wrapper.find(ScreenResolver).props()).toEqual({
43
+ expect(wrapper.getByTestId("screen-resolver").props).toMatchObject({
29
44
  pathname: "/river/A1234",
30
45
  screenType: "river",
31
46
  screenId: "A1234",
@@ -2,8 +2,8 @@
2
2
  /* eslint-disable react/prop-types */
3
3
  import React from "react";
4
4
  import { View, Text } from "react-native";
5
- import { shallow } from "enzyme";
6
- import { shallowToJson } from "enzyme-to-json";
5
+
6
+ import { render } from "@testing-library/react-native";
7
7
 
8
8
  import { TestId } from "../TestId";
9
9
 
@@ -17,14 +17,16 @@ const screenId = "A1234";
17
17
 
18
18
  describe("TestId", () => {
19
19
  it("renders correctly and assigns the testID to a wrapping view", () => {
20
- const wrapper = shallow(
20
+ const wrapper = render(
21
21
  <TestId screenId={screenId}>
22
22
  <TestComponent name="dev test" />
23
23
  </TestId>
24
24
  );
25
25
 
26
- expect(shallowToJson(wrapper)).toMatchSnapshot();
27
- expect(wrapper.find(View).prop("testID")).toEqual(screenId);
28
- expect(wrapper.find(View).prop("accessibilityLabel")).toEqual(screenId);
26
+ expect(wrapper.getByTestId(screenId)).toBeTruthy();
27
+
28
+ expect(wrapper.getByTestId(screenId).props.accessibilityLabel).toEqual(
29
+ screenId
30
+ );
29
31
  });
30
32
  });
@@ -46,27 +46,37 @@ jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
46
46
  })),
47
47
  }));
48
48
 
49
- const NavBar = jest.fn((props) => <View testID="navBar" {...props} />);
49
+ const mockNavBar = jest.fn((props) => {
50
+ const View = jest.requireActual("react-native").View;
51
+
52
+ return <View testID="navBar" {...props} />;
53
+ });
50
54
 
51
55
  jest.mock(
52
56
  "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers",
53
57
  () => ({
54
- getNavigationPluginModule: () => NavBar,
58
+ getNavigationPluginModule: () => mockNavBar,
55
59
  })
56
60
  );
57
61
 
58
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
59
- ...(jest.requireActual(
60
- "@applicaster/zapp-react-native-utils/reactHooks/screen"
61
- ) as any),
62
- useScreenData: jest.fn(() => ({
63
- id: "testId",
64
- navigations: [{ id: "testId", category: "nav_bar" }],
65
- })),
66
- useCurrentScreenData: jest.fn(() => ({
67
- id: "testId",
68
- })),
69
- }));
62
+ jest.mock(
63
+ "@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData",
64
+ () => ({
65
+ useCurrentScreenData: jest.fn(() => ({
66
+ id: "testId",
67
+ })),
68
+ })
69
+ );
70
+
71
+ jest.mock(
72
+ "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData",
73
+ () => ({
74
+ useScreenData: jest.fn(() => ({
75
+ id: "testId",
76
+ navigations: [{ id: "testId", category: "nav_bar" }],
77
+ })),
78
+ })
79
+ );
70
80
 
71
81
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
72
82
  isNavBarVisible: mockIsNavBarVisible,
@@ -84,20 +94,24 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
84
94
  useIsScreenActive: jest.fn().mockReturnValue(true),
85
95
  }));
86
96
 
87
- jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
88
- usePickFromState: () => ({
89
- plugins: [
90
- {
91
- name: "Offline Plugin",
92
- identifier: "offline-experience",
93
- type: "general",
94
- module: {
95
- OfflineFallbackScreen: ({ children }) => <View>{children}</View>, // eslint-disable-line
97
+ jest.mock("@applicaster/zapp-react-native-redux/hooks/usePickFromState", () => {
98
+ const View = jest.requireActual("react-native").View;
99
+
100
+ return {
101
+ usePickFromState: () => ({
102
+ plugins: [
103
+ {
104
+ name: "Offline Plugin",
105
+ identifier: "offline-experience",
106
+ type: "general",
107
+ module: {
108
+ OfflineFallbackScreen: ({ children }) => <View>{children}</View>, // eslint-disable-line
109
+ },
96
110
  },
97
- },
98
- ],
99
- }),
100
- }));
111
+ ],
112
+ }),
113
+ };
114
+ });
101
115
 
102
116
  const {
103
117
  allowedOrientationsForScreen,
@@ -3,7 +3,7 @@
3
3
  exports[`<Screen Component /> when the navbar should be hidden renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "backgroundColor": "blue",
8
8
  "flex": 1,
9
9
  "paddingTop": 0,
@@ -22,7 +22,7 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
22
22
  <View
23
23
  pathname="/river/testId"
24
24
  screenData={
25
- Object {
25
+ {
26
26
  "id": "testId",
27
27
  }
28
28
  }
@@ -35,7 +35,7 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
35
35
  exports[`<Screen Component /> when the navbar should show renders correctly 1`] = `
36
36
  <View
37
37
  style={
38
- Object {
38
+ {
39
39
  "backgroundColor": "blue",
40
40
  "flex": 1,
41
41
  "paddingTop": 0,
@@ -54,7 +54,7 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
54
54
  <View
55
55
  pathname="/river/testId"
56
56
  screenData={
57
- Object {
57
+ {
58
58
  "id": "testId",
59
59
  }
60
60
  }
@@ -0,0 +1,56 @@
1
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
2
+ import {
3
+ useGetScreenOrientation,
4
+ isOrientationCompatible,
5
+ } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
6
+ import {
7
+ useCurrentScreenData,
8
+ useDimensions,
9
+ useRoute,
10
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
11
+ import { useMemo, useEffect, useState } from "react";
12
+
13
+ export const useWaitForValidOrientation = () => {
14
+ const {
15
+ width: screenWidth,
16
+ height,
17
+ deviceInfo,
18
+ } = useDimensions("screen", {
19
+ fullDimensions: true,
20
+ updateForInactiveScreens: false,
21
+ });
22
+
23
+ const currentScreenData = useCurrentScreenData();
24
+
25
+ const { screenData } = useRoute();
26
+
27
+ const [readyState, setReadyState] = useState(false);
28
+
29
+ const isTablet = deviceInfo?.isTablet;
30
+
31
+ const { appData } = usePickFromState(["appData"]);
32
+ const isTabletPortrait = appData?.isTabletPortrait;
33
+
34
+ const layoutData = useMemo(
35
+ () => ({ isTablet, isTabletPortrait, width: screenWidth, height }),
36
+ [isTablet, isTabletPortrait, screenWidth, height]
37
+ );
38
+
39
+ const targetScreenData =
40
+ currentScreenData || (screenData as any)?.targetScreen || screenData;
41
+
42
+ const orientation = useGetScreenOrientation(targetScreenData);
43
+
44
+ const isReadyForDisplay = isOrientationCompatible({
45
+ orientation,
46
+ layoutData,
47
+ });
48
+
49
+ useEffect(() => {
50
+ if (isReadyForDisplay && !readyState) {
51
+ setReadyState(true);
52
+ }
53
+ }, [readyState, orientation, layoutData]);
54
+
55
+ return readyState;
56
+ };
@@ -2,31 +2,27 @@
2
2
  import React from "react";
3
3
  import { View } from "react-native";
4
4
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
5
- import {
6
- isOrientationCompatible,
7
- useGetScreenOrientation,
8
- } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
9
5
 
10
6
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
11
7
  import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
12
8
  import {
13
- shouldNavBarDisplayMenu,
14
9
  getNavBarProps,
15
10
  getScreenId,
11
+ shouldNavBarDisplayMenu,
16
12
  } from "@applicaster/zapp-react-native-utils/navigationUtils";
17
13
  import {
18
- useDimensions,
19
- useRoute,
20
14
  useCurrentScreenData,
21
15
  useNavbarState,
22
- useScreenData,
23
16
  useNavigation,
17
+ useRoute,
18
+ useScreenData,
24
19
  } from "@applicaster/zapp-react-native-utils/reactHooks";
25
20
  import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
26
21
 
27
22
  import { RouteManager } from "../RouteManager";
28
23
  import { useScreenConfiguration } from "../River/useScreenConfiguration";
29
24
  import { isValidColor } from "./utils";
25
+ import { useWaitForValidOrientation } from "./hooks";
30
26
 
31
27
  const screenStyles = {
32
28
  flex: 1,
@@ -50,14 +46,6 @@ export function Screen(_props: Props) {
50
46
  const currentScreenData = useCurrentScreenData();
51
47
  const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
52
48
 
53
- const {
54
- width: screenWidth,
55
- height,
56
- deviceInfo,
57
- } = useDimensions("screen", {
58
- fullDimensions: true,
59
- });
60
-
61
49
  const { screenData, pathname } = useRoute();
62
50
 
63
51
  const currentRiver = useScreenData(
@@ -66,13 +54,6 @@ export function Screen(_props: Props) {
66
54
 
67
55
  const { title } = useNavbarState();
68
56
 
69
- const isTablet = deviceInfo?.isTablet;
70
-
71
- const { appData } = usePickFromState(["appData"]);
72
- const isTabletPortrait = appData?.isTabletPortrait;
73
-
74
- const layoutData = { isTablet, isTabletPortrait, width: screenWidth, height };
75
-
76
57
  const hasMenu = shouldNavBarDisplayMenu(currentRiver, plugins);
77
58
 
78
59
  const navBarProps = React.useMemo<MobileNavBarPluginProps | null>(
@@ -108,30 +89,23 @@ export function Screen(_props: Props) {
108
89
  [theme.app_background_color, backgroundColor]
109
90
  );
110
91
 
111
- const targetScreenData =
112
- currentScreenData || (screenData as any)?.targetScreen || screenData;
113
-
114
- const orientation = useGetScreenOrientation(targetScreenData);
92
+ // Set ready state when screen is rotated to desired orientation
93
+ const isReady = useWaitForValidOrientation();
115
94
 
116
95
  // We prevent rendering of the screen until UI is actually rotated to screen desired orientation.
117
96
  // This saves unnecessary re-renders and user will not see distorted aspect screen.
118
- if (
119
- !isOrientationCompatible({
120
- orientation,
121
- layoutData,
122
- })
123
- ) {
124
- return <View style={style} />;
125
- }
126
-
127
97
  return (
128
98
  <View style={style}>
129
- {navBarProps && <NavBar {...navBarProps} hasMenu={hasMenu} />}
130
-
131
- <OfflineFallbackScreen>
132
- {/* @TODO RouteManager doesn't use props, can they be removed ? */}
133
- <RouteManager pathname={pathname} screenData={screenData} />
134
- </OfflineFallbackScreen>
99
+ {isReady ? (
100
+ <>
101
+ {navBarProps ? <NavBar {...navBarProps} hasMenu={hasMenu} /> : null}
102
+
103
+ <OfflineFallbackScreen>
104
+ {/* @TODO RouteManager doesn't use props, can they be removed ? */}
105
+ <RouteManager pathname={pathname} screenData={screenData} />
106
+ </OfflineFallbackScreen>
107
+ </>
108
+ ) : null}
135
109
  </View>
136
110
  );
137
111
  }