@applicaster/zapp-react-native-ui-components 13.0.0-alpha.6523249552 → 13.0.0-alpha.6651373134

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 (132) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
  3. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  4. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +54 -111
  5. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +36 -20
  6. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  7. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  8. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  9. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  10. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  11. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  12. package/Components/AudioPlayer/helpers.tsx +1 -0
  13. package/Components/BaseFocusable/index.tsx +1 -2
  14. package/Components/Cell/Cell.tsx +4 -13
  15. package/Components/Cell/CellWithFocusable.tsx +48 -59
  16. package/Components/Cell/CellWrapper.ts +5 -0
  17. package/Components/Cell/TvOSCellComponent.tsx +20 -22
  18. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  19. package/Components/Cell/index.js +3 -1
  20. package/Components/Cell/styles.ts +17 -0
  21. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +46 -48
  22. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  23. package/Components/ComponentResolver/__tests__/componentResolver.test.js +16 -22
  24. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  25. package/Components/ErrorScreen/index.tsx +14 -6
  26. package/Components/Focusable/Focusable.tsx +1 -0
  27. package/Components/Focusable/FocusableTvOS.tsx +5 -1
  28. package/Components/Focusable/index.android.tsx +10 -3
  29. package/Components/FocusableCell/index.tsx +1 -1
  30. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
  31. package/Components/FocusableGroup/index.tsx +0 -3
  32. package/Components/FocusableList/index.tsx +26 -9
  33. package/Components/FocusableScrollView/index.tsx +43 -13
  34. package/Components/HandlePlayable/HandlePlayable.tsx +14 -27
  35. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  36. package/Components/Layout/TV/ScreenContainer.tsx +8 -1
  37. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  38. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +2 -1
  39. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -2
  40. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +3 -2
  41. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  42. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +4 -3
  43. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
  44. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  45. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  46. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +4 -12
  47. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +0 -229
  48. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  49. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  50. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  51. package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
  52. package/Components/MasterCell/utils/index.ts +8 -134
  53. package/Components/ModalComponent/Button/assets.ts +1 -1
  54. package/Components/ModalComponent/Button/index.tsx +6 -6
  55. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  56. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  57. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  58. package/Components/OfflineHandler/utils/index.ts +1 -1
  59. package/Components/PlayerContainer/PlayerContainer.tsx +17 -13
  60. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  61. package/Components/PlayerImageBackground/index.tsx +1 -1
  62. package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
  63. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  64. package/Components/River/RiverFooter.tsx +39 -9
  65. package/Components/River/RiverItem.tsx +37 -2
  66. package/Components/River/TV/index.tsx +6 -1
  67. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +100 -31
  68. package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
  69. package/Components/River/__tests__/componentsMap.test.js +3 -4
  70. package/Components/River/__tests__/river.test.js +75 -40
  71. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +11 -4
  72. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  73. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  74. package/Components/Screen/TV/index.web.tsx +5 -6
  75. package/Components/Screen/hooks.ts +53 -0
  76. package/Components/Screen/index.tsx +16 -43
  77. package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
  78. package/Components/Tabs/Tab.tsx +5 -3
  79. package/Components/TextInputTv/index.tsx +2 -1
  80. package/Components/TrackedView/index.tsx +1 -0
  81. package/Components/Transitioner/AnimationManager.js +15 -15
  82. package/Components/Transitioner/Scene.tsx +1 -1
  83. package/Components/Transitioner/Transitioner.tsx +3 -3
  84. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  85. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -68
  86. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
  87. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  88. package/Components/VideoLive/PlayerLiveImageComponent.tsx +7 -3
  89. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
  90. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
  91. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +44 -30
  92. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
  93. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +24 -11
  94. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -5
  95. package/Components/VideoModal/PlayerDetails.tsx +9 -6
  96. package/Components/VideoModal/PlayerWrapper.tsx +28 -5
  97. package/Components/VideoModal/VideoModal.tsx +2 -2
  98. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  99. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  100. package/Components/Viewport/__tests__/utils.test.js +5 -4
  101. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  102. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  103. package/Components/ZappUIComponent/index.tsx +3 -16
  104. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  105. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  106. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  107. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
  108. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  109. package/Contexts/ScreenContext/index.tsx +3 -10
  110. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  111. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  112. package/Decorators/Navigator/index.tsx +1 -1
  113. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
  114. package/Decorators/RiverResolver/index.tsx +6 -8
  115. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  116. package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
  117. package/package.json +7 -11
  118. package/tsconfig.json +2 -3
  119. package/.babelrc +0 -8
  120. package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
  121. package/Components/Cell/CellStyles/Hero/index.js +0 -111
  122. package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
  123. package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
  124. package/Components/Cell/CellStyles/colors.js +0 -40
  125. package/Components/Cell/CellStyles/index.js +0 -15
  126. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  127. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  128. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  129. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  130. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  131. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  132. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { shallow } from "enzyme";
4
- import { shallowToJson } from "enzyme-to-json";
3
+
4
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
5
5
 
6
6
  import { ZappUIComponent } from "../index";
7
7
 
@@ -37,7 +37,13 @@ const ErrorComponent = (props) => <MockComponent name="error" {...props} />;
37
37
  const LoadingComponent = (props) => <MockComponent name="loading" {...props} />;
38
38
 
39
39
  function getProps(zappPipesData) {
40
- return { onLoadFinished, zappPipesData };
40
+ return {
41
+ component: {
42
+ rules: {},
43
+ },
44
+ onLoadFinished,
45
+ zappPipesData,
46
+ };
41
47
  }
42
48
 
43
49
  function getWrapper({ error, loading, props }) {
@@ -47,21 +53,28 @@ function getWrapper({ error, loading, props }) {
47
53
  LoadingComponent: loading ? LoadingComponent : null,
48
54
  });
49
55
 
50
- return shallow(<WrappedComponent {...props} />);
56
+ return renderWithProviders(
57
+ <View testID="outer-test-view">
58
+ <WrappedComponent testID="test-view" {...props} />
59
+ </View>
60
+ );
51
61
  }
52
62
 
53
63
  describe("ZappUIComponent", () => {
54
64
  describe("when zapp pipes data is loading", () => {
55
65
  const props = getProps(zappPipesData_loading);
56
66
 
57
- it("renders null if no loading component is provided", () => {
67
+ it("renders placeholder component if no loading component is provided", () => {
58
68
  const wrapper = getWrapper({ props });
59
- expect(shallowToJson(wrapper)).toMatchSnapshot();
69
+ const testView = wrapper.getByTestId("ZappUIComponent-placeholder");
70
+
71
+ expect(testView.props).toBeDefined();
60
72
  });
61
73
 
62
74
  it("renders correctly otherwise", () => {
63
75
  const wrapper = getWrapper({ props, loading: true });
64
- expect(shallowToJson(wrapper)).toMatchSnapshot();
76
+ const testView = wrapper.getByTestId("test-view");
77
+ expect(testView.props.name).toBe("loading");
65
78
  });
66
79
  });
67
80
 
@@ -70,12 +83,14 @@ describe("ZappUIComponent", () => {
70
83
 
71
84
  it("renders null if no error component is provided", () => {
72
85
  const wrapper = getWrapper({ props });
73
- expect(shallowToJson(wrapper)).toMatchSnapshot();
86
+
87
+ expect(wrapper.queryByTestId("test-view")).toBeNull();
74
88
  });
75
89
 
76
90
  it("renders correctly otherwise", () => {
77
91
  const wrapper = getWrapper({ props, error: true });
78
- expect(shallowToJson(wrapper)).toMatchSnapshot();
92
+ const testView = wrapper.getByTestId("test-view");
93
+ expect(testView.props.name).toBe("error");
79
94
  });
80
95
  });
81
96
 
@@ -84,7 +99,8 @@ describe("ZappUIComponent", () => {
84
99
 
85
100
  it("renders correctly", () => {
86
101
  const wrapper = getWrapper({ props });
87
- expect(shallowToJson(wrapper)).toMatchSnapshot();
102
+ const testView = wrapper.getByTestId("test-view");
103
+ expect(testView.props.name).toBe("success");
88
104
  });
89
105
  });
90
106
  });
@@ -1,8 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as R from "ramda";
3
3
  import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
4
- import { ifEmptyUseFallback } from "@applicaster/zapp-react-native-utils/cellUtils";
5
- import { isAndroidTVPlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
6
4
  import {
7
5
  UIComponentContext,
8
6
  useUIComponentContext,
@@ -10,7 +8,7 @@ import {
10
8
 
11
9
  import { Placeholder } from "./Placeholder";
12
10
  import { useInitialLoading } from "./hooks";
13
- import { useFocusable } from "../Focusable/index.android";
11
+ import { useIsFocusable } from "@applicaster/zapp-react-native-utils/focusManager";
14
12
 
15
13
  type ReactComponent = React.ComponentType<any>;
16
14
 
@@ -127,7 +125,6 @@ New signature: {Component, ErrorComponent, LoadingComponent, options}`
127
125
  props;
128
126
 
129
127
  const parent = useUIComponentContext();
130
- const { setIsFocusable } = useFocusable();
131
128
 
132
129
  const isLoading = toBooleanWithDefaultFalse(zappPipesData?.loading);
133
130
  const isInitialLoading = useInitialLoading(isLoading);
@@ -145,24 +142,14 @@ New signature: {Component, ErrorComponent, LoadingComponent, options}`
145
142
  [props, parent]
146
143
  );
147
144
 
145
+ useIsFocusable(componentProps);
146
+
148
147
  React.useEffect(() => {
149
148
  if (!skipOnLoadFinished && !isLoading) {
150
149
  onLoadFinished();
151
150
  }
152
151
  }, [isLoading]);
153
152
 
154
- React.useEffect(() => {
155
- const focusable = ifEmptyUseFallback(
156
- props.component?.rules?.component_cells_focusable,
157
- true
158
- );
159
-
160
- // Android TV only fix for focusable components - manually set focusable false
161
- if (!focusable && isAndroidTVPlatform()) {
162
- setIsFocusable(focusable);
163
- }
164
- }, [props.component?.rules?.component_cells_focusable]);
165
-
166
153
  if (isDataSourceEmpty(props) && allowsEmptyDataSource) {
167
154
  return RenderComponent(Component, componentProps);
168
155
  }
@@ -1,10 +1,10 @@
1
1
  import * as React from "react";
2
2
  import { Platform } from "react-native";
3
- import { shallow } from "enzyme";
4
- import { shallowToJson } from "enzyme-to-json";
3
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
5
4
 
6
5
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
7
6
  useRoute: jest.fn(() => ({ screenData: { id: "test" } })),
7
+ useIsScreenActive: jest.fn(() => true),
8
8
  }));
9
9
 
10
10
  jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
@@ -26,8 +26,16 @@ const cell_styles = "style";
26
26
  const configuration = { component, styles, cell_styles } as const;
27
27
 
28
28
  describe("DefaultCellRenderer", () => {
29
+ beforeEach(() => {
30
+ Platform.OS = "ios"; // Reset to default
31
+ });
32
+
33
+ afterEach(() => {
34
+ jest.clearAllMocks();
35
+ });
36
+
29
37
  it("is a function", () => {
30
- expect(DefaultCellRenderer).toBeFunction();
38
+ expect(typeof DefaultCellRenderer).toBe("function");
31
39
  });
32
40
 
33
41
  it("returns an error if component is missing in configuration", () => {
@@ -36,28 +44,23 @@ describe("DefaultCellRenderer", () => {
36
44
  );
37
45
  });
38
46
 
39
- it("returns a react component and it renders correctly", () => {
47
+ it("renders correctly", () => {
40
48
  const CellRenderer = DefaultCellRenderer(configuration);
41
- const wrapper = shallow(<CellRenderer store={null} />);
42
-
43
- expect(shallowToJson(wrapper)).toMatchSnapshot();
49
+ const result = renderWithProviders(<CellRenderer store={null} />);
50
+ expect(result).toBeTruthy();
44
51
  });
45
52
 
46
- it("returns a react component for LG TVs", () => {
53
+ it("renders correctly for LG TVs", () => {
47
54
  Platform.OS = "lg_tv";
48
-
49
55
  const CellRenderer = DefaultCellRenderer(configuration);
50
- const wrapper = shallow(<CellRenderer store={null} />);
51
-
52
- expect(shallowToJson(wrapper)).toMatchSnapshot();
56
+ const result = renderWithProviders(<CellRenderer store={null} />);
57
+ expect(result).toBeTruthy();
53
58
  });
54
59
 
55
- it("returns a react component for Samsung TVs", () => {
60
+ it("renders correctly for Samsung TVs", () => {
56
61
  Platform.OS = "samsung_tv";
57
-
58
62
  const CellRenderer = DefaultCellRenderer(configuration);
59
- const wrapper = shallow(<CellRenderer store={null} />);
60
-
61
- expect(shallowToJson(wrapper)).toMatchSnapshot();
63
+ const result = renderWithProviders(<CellRenderer store={null} />);
64
+ expect(result).toBeTruthy();
62
65
  });
63
66
  });
@@ -1,8 +1,12 @@
1
1
  import * as React from "react";
2
- import { shallow } from "enzyme";
2
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
3
+ import { DefaultCell } from "../";
4
+ import { masterCellBuilder } from "@applicaster/zapp-react-native-ui-components/Components/MasterCell";
5
+ import { View, Text, Image } from "react-native";
3
6
 
4
7
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
5
8
  useRoute: jest.fn(() => ({ screenData: { id: "test" } })),
9
+ useIsScreenActive: jest.fn(() => true),
6
10
  }));
7
11
 
8
12
  jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
@@ -12,12 +16,6 @@ jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
12
16
  })),
13
17
  }));
14
18
 
15
- const {
16
- masterCellBuilder,
17
- } = require("@applicaster/zapp-react-native-ui-components/Components/MasterCell");
18
-
19
- const { DefaultCell } = require("../");
20
-
21
19
  describe("DefaultCell", () => {
22
20
  it("is a function", () => {
23
21
  expect(DefaultCell).toBeFunction();
@@ -33,15 +31,21 @@ describe("DefaultCell", () => {
33
31
  } as const;
34
32
 
35
33
  const CellRenderer = masterCellBuilder({
34
+ components: {
35
+ View: View,
36
+ Text: Text,
37
+ Image: Image,
38
+ },
36
39
  containerStyle: {},
37
40
  cellConfiguration: DefaultCell(styles),
38
41
  });
39
42
 
40
- const wrapper = shallow(<CellRenderer />);
43
+ const { UNSAFE_getAllByType } = renderWithProviders(<CellRenderer />);
44
+ const textElement = UNSAFE_getAllByType(Text)[0];
41
45
 
42
- expect(wrapper.find("_Text").first().prop("style").color).toEqual(
43
- "rgba(239,239,239,1.0)"
44
- );
46
+ expect(textElement.props.style).toMatchObject({
47
+ color: "rgba(239,239,239,1.0)",
48
+ });
45
49
  });
46
50
 
47
51
  it.skip("matches snapshot", () => {
@@ -0,0 +1,49 @@
1
+ import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
2
+ import React, { PropsWithChildren, useMemo } from "react";
3
+
4
+ export const ComponentsMapOffsetContext = React.createContext({
5
+ setComponentsMapOffset: (_offset: number) => void 0,
6
+ componentsMapOffset: 0,
7
+ });
8
+
9
+ export const ComponentsMapOffsetContextProvider = ({
10
+ children,
11
+ }: PropsWithChildren<{}>) => {
12
+ const theme = useTheme<BaseThemePropertiesTV>();
13
+
14
+ const [componentsMapOffset, setComponentsMapOffset] = React.useState(
15
+ theme?.screen_margin_top
16
+ );
17
+
18
+ const contextValue = useMemo(
19
+ () => ({
20
+ componentsMapOffset,
21
+ setComponentsMapOffset,
22
+ }),
23
+ [componentsMapOffset]
24
+ );
25
+
26
+ return (
27
+ <ComponentsMapOffsetContext.Provider value={contextValue}>
28
+ {children}
29
+ </ComponentsMapOffsetContext.Provider>
30
+ );
31
+ };
32
+
33
+ export const withComponentsMapOffsetContext = (Component: any) =>
34
+ function ComponentsMapOffsetContextProviderWrapper(props: {}) {
35
+ return (
36
+ <ComponentsMapOffsetContextProvider>
37
+ <Component {...props} />
38
+ </ComponentsMapOffsetContextProvider>
39
+ );
40
+ };
41
+
42
+ export const withComponentsMapOffsetContextConsumer = (Component: any) =>
43
+ function ComponentsMapOffsetContextConsumerWrapper(props: {}) {
44
+ const { componentsMapOffset } = React.useContext(
45
+ ComponentsMapOffsetContext
46
+ );
47
+
48
+ return <Component {...props} componentsMapOffset={componentsMapOffset} />;
49
+ };
@@ -7,17 +7,11 @@ export const withFocusableContext = (Component) => {
7
7
  { groupId, ...props }: Record<string, any>,
8
8
  ref
9
9
  ) => {
10
- return (
11
- <FocusableGroupContext.Consumer>
12
- {(groupIdContext: string) => {
13
- // eslint-disable-next-line react/display-name
14
- const propsGroupId = groupId || null;
15
- const providedGroupId = propsGroupId || groupIdContext;
10
+ const groupIdContext = React.useContext(FocusableGroupContext);
11
+ const propsGroupId = groupId || null;
12
+ const providedGroupId = propsGroupId || groupIdContext;
16
13
 
17
- return <Component {...props} groupId={providedGroupId} ref={ref} />;
18
- }}
19
- </FocusableGroupContext.Consumer>
20
- );
14
+ return <Component {...props} groupId={providedGroupId} ref={ref} />;
21
15
  };
22
16
 
23
17
  return React.forwardRef(WithFocusableContext);
@@ -13,7 +13,7 @@ type ProviderProps = {
13
13
  };
14
14
  };
15
15
 
16
- const initialHeaderOffsetContext = () => ({
16
+ const initialHeaderOffsetContext: HeaderOffsetContextType = () => ({
17
17
  headerOffset: 0,
18
18
  headersAbove: null,
19
19
  });
@@ -24,11 +24,9 @@ export const HeaderOffsetContext = React.createContext<HeaderOffsetContextType>(
24
24
 
25
25
  export function withConsumer(Component) {
26
26
  return function WithConsumer(props) {
27
- return (
28
- <HeaderOffsetContext.Consumer>
29
- {(context) => <Component getHeaderOffset={context} {...props} />}
30
- </HeaderOffsetContext.Consumer>
31
- );
27
+ const getHeaderOffset = React.useContext(HeaderOffsetContext);
28
+
29
+ return <Component getHeaderOffset={getHeaderOffset} {...props} />;
32
30
  };
33
31
  }
34
32
 
@@ -176,15 +176,8 @@ export function ScreenContextProvider({
176
176
 
177
177
  export function withScreenContext(Component: React.ComponentType<any>) {
178
178
  return function WithScreenContextWrapper(props) {
179
- return (
180
- <ScreenContext.Consumer>
181
- {useCallback(
182
- (value) => (
183
- <Component {...props} screenContext={value} />
184
- ),
185
- [Component, props]
186
- )}
187
- </ScreenContext.Consumer>
188
- );
179
+ const screenContext = React.useContext(ScreenContext);
180
+
181
+ return <Component {...props} screenContext={screenContext} />;
189
182
  };
190
183
  }
@@ -8,10 +8,11 @@ type LayoutContext = {
8
8
  componentAnchorPointY: number | null;
9
9
  componentAvailableWidth: number | null;
10
10
  setScreenLayout?: (properties: {}) => void;
11
+ resetScreenLayout?: () => void;
11
12
  extraAnchorPointYOffset: number;
12
13
  };
13
14
 
14
- const screenLayoutContext: LayoutContext = {
15
+ const initialScreenLayoutContext: LayoutContext = {
15
16
  screenMarginTop: null,
16
17
  screenMarginBottom: null,
17
18
  screenHeight: null,
@@ -21,8 +22,9 @@ const screenLayoutContext: LayoutContext = {
21
22
  extraAnchorPointYOffset: 0,
22
23
  };
23
24
 
24
- export const ScreenLayoutContext =
25
- React.createContext<LayoutContext>(screenLayoutContext);
25
+ export const ScreenLayoutContext = React.createContext<LayoutContext>(
26
+ initialScreenLayoutContext
27
+ );
26
28
 
27
29
  export function ScreenLayoutContextConsumer(Component) {
28
30
  return function WithConsumer(props) {
@@ -1,4 +1,7 @@
1
- jest.mock("react-router-native", () => require("./react-router-native-mock"));
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
4
+ import { withNavigator } from "..";
2
5
 
3
6
  const navigatorMock = {
4
7
  push: jest.fn(),
@@ -12,27 +15,24 @@ const navigatorMock = {
12
15
 
13
16
  const mocked_context = navigatorMock;
14
17
 
15
- jest.mock("react", () => {
16
- return {
17
- ...jest.requireActual("react"),
18
- useContext: jest.fn(() => mocked_context),
19
- };
20
- });
21
-
22
- import { View } from "react-native";
23
- import { shallow } from "enzyme";
24
-
25
- const React = require("react");
26
- const { withNavigator } = require("../index");
18
+ jest.mock(
19
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
20
+ () => {
21
+ return {
22
+ useNavigation: jest.fn(() => mocked_context),
23
+ };
24
+ }
25
+ );
27
26
 
28
27
  describe("withNavigator Decorator", () => {
29
28
  it("renders correctly", () => {
30
29
  const Component = () => <View />;
31
30
  const WrappedComponent = withNavigator(Component);
32
31
 
33
- const wrapper = shallow(<WrappedComponent someProp="foo" />);
32
+ const wrapper = renderWithProviders(<WrappedComponent someProp="foo" />);
34
33
 
35
- expect(wrapper).toMatchSnapshot();
36
- expect(wrapper.prop("navigator")).toEqual(navigatorMock);
34
+ expect(wrapper.UNSAFE_getByType(Component).props.navigator).toEqual(
35
+ navigatorMock
36
+ );
37
37
  });
38
38
  });
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
 
3
- import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
3
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
4
4
  import { deprecationWarningWithIdentifier } from "@applicaster/zapp-react-native-utils/appUtils";
5
5
 
6
6
  export function withNavigator(Component) {
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
- import { shallow } from "enzyme";
3
2
  import { View } from "react-native";
4
- import { shallowToJson } from "enzyme-to-json";
5
- import * as usePathnameHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname";
3
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
4
+
5
+ import { withRiver } from "../";
6
6
 
7
7
  const rivers = {
8
8
  A123: {
@@ -20,37 +20,31 @@ jest.doMock(
20
20
  })
21
21
  );
22
22
 
23
- jest.mock(
24
- "@applicaster/zapp-react-native-utils/reactHooks/layout/useLayoutVersion",
23
+ jest.doMock(
24
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname",
25
25
  () => ({
26
- useLayoutVersion: jest.fn(() => true),
26
+ usePathname: jest.fn(() => "/home"),
27
27
  })
28
28
  );
29
29
 
30
- jest.spyOn(usePathnameHooks, "usePathname").mockReturnValue("/home");
31
-
32
- // mocks useNavigator to return currentRoute: "/home"
33
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
34
- useNavigation: jest.fn(() => ({ currentRoute: "/home" })),
35
- useRoute: jest.fn(() => ({ pathname: "/home" })),
36
- }));
37
-
38
- const { withRiver } = require("../index");
39
-
40
- const TestComponent = jest.fn(() => <View />);
30
+ const TestComponent = jest.fn((props) => <View {...props} />);
41
31
 
42
32
  describe("withRiver HoC", () => {
43
33
  const WrappedComponent = withRiver(TestComponent);
44
34
 
45
- const wrapper = shallow(
46
- <WrappedComponent screenId="A123" rivers={rivers} otherProp="otherProp" />
35
+ const wrapper = renderWithProviders(
36
+ <WrappedComponent
37
+ testID="test-view"
38
+ screenId="A123"
39
+ otherProp="otherProp"
40
+ />,
41
+ { rivers: rivers }
47
42
  );
48
43
 
49
- it("renders correctly", () => {
50
- expect(shallowToJson(wrapper)).toMatchSnapshot();
51
- });
52
-
53
44
  it("populates the river prop", () => {
54
- expect(wrapper.find(TestComponent).prop("river")).toEqual(rivers.A123);
45
+ const targetView = wrapper.getByTestId("test-view");
46
+
47
+ expect(targetView.props.river).toEqual(rivers.A123);
48
+ expect(targetView.props.screenData).toEqual(rivers.A123);
55
49
  });
56
50
  });
@@ -1,8 +1,8 @@
1
1
  import * as React from "react";
2
2
 
3
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
4
3
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
5
- import { usePathname } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
4
+ import { usePathname } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname";
5
+ import { useRivers } from "@applicaster/zapp-react-native-utils/reactHooks";
6
6
 
7
7
  type Props = ZappUIComponentProps & {
8
8
  rivers: ZappRivers;
@@ -12,27 +12,25 @@ type Props = ZappUIComponentProps & {
12
12
 
13
13
  export function withRiver(Component: ZappComponent): ZappComponent {
14
14
  const RiverWithData = ({ screenId, ...otherProps }: Props) => {
15
- const { rivers } = usePickFromState(["rivers"]);
15
+ const river = useRivers()?.[screenId];
16
16
  const pathname = usePathname();
17
- const river = rivers[screenId];
18
17
 
19
18
  if (!river) {
20
19
  return null;
21
20
  }
22
21
 
23
- if (!otherProps.screenData) {
24
- otherProps.screenData = river;
25
- }
26
-
27
22
  return (
28
23
  <Component
29
24
  screenId={screenId}
30
25
  river={river}
31
26
  key={isTV() ? pathname : undefined}
32
27
  {...otherProps}
28
+ screenData={otherProps.screenData || river}
33
29
  />
34
30
  );
35
31
  };
36
32
 
33
+ RiverWithData.displayName = `RiverWithData(${Component.displayName || Component.name})`;
34
+
37
35
  return RiverWithData;
38
36
  }