@applicaster/zapp-react-native-ui-components 13.0.0-alpha.5033140607 → 13.0.0-alpha.5144285042

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 (179) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AppContainer/__tests__/__snapshots__/AppContainer.test.js.snap +1 -1
  3. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  4. package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
  5. package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
  6. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +56 -113
  7. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +39 -23
  8. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
  9. package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
  10. package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
  11. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  12. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  13. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  14. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  15. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  16. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  17. package/Components/BaseFocusable/index.ios.ts +1 -1
  18. package/Components/BaseFocusable/index.tsx +67 -31
  19. package/Components/Cell/Cell.tsx +15 -9
  20. package/Components/Cell/CellWithFocusable.tsx +44 -59
  21. package/Components/Cell/TvOSCellComponent.tsx +23 -30
  22. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  23. package/Components/Cell/index.js +3 -1
  24. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +50 -50
  25. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  26. package/Components/ComponentResolver/__tests__/componentResolver.test.js +26 -30
  27. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  28. package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
  29. package/Components/ErrorScreen/index.tsx +6 -6
  30. package/Components/Focusable/Focusable.tsx +1 -54
  31. package/Components/Focusable/FocusableTvOS.tsx +6 -2
  32. package/Components/Focusable/Touchable.tsx +19 -20
  33. package/Components/Focusable/index.android.tsx +10 -3
  34. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -83
  35. package/Components/FocusableGroup/index.tsx +1 -3
  36. package/Components/FocusableList/index.tsx +26 -10
  37. package/Components/FocusableScrollView/index.tsx +43 -13
  38. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +76 -7
  39. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +53 -9
  40. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  41. package/Components/Layout/TV/ScreenContainer.tsx +8 -1
  42. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  43. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +3 -1
  44. package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
  45. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +6 -5
  46. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +12 -11
  47. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  48. package/Components/Layout/TV/__tests__/index.test.tsx +7 -3
  49. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  50. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +66 -0
  51. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
  52. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +6 -12
  53. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
  54. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  55. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
  56. package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
  57. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  58. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  59. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  60. package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
  61. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +11 -19
  62. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +6 -235
  63. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  64. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  65. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  66. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
  67. package/Components/MasterCell/utils/behaviorProvider.ts +133 -0
  68. package/Components/MasterCell/utils/index.ts +4 -130
  69. package/Components/ModalComponent/Button/index.tsx +6 -6
  70. package/Components/ModalComponent/Header/index.tsx +3 -3
  71. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  72. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  73. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  74. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  75. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
  76. package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
  77. package/Components/PlayerContainer/PlayerContainer.tsx +13 -19
  78. package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
  79. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  80. package/Components/PlayerImageBackground/index.tsx +23 -3
  81. package/Components/River/ComponentsMap/ComponentsMap.tsx +39 -65
  82. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  83. package/Components/River/RefreshControl.tsx +1 -1
  84. package/Components/River/RiverFooter.tsx +39 -9
  85. package/Components/River/RiverItem.tsx +37 -2
  86. package/Components/River/TV/index.tsx +6 -1
  87. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +114 -45
  88. package/Components/River/__tests__/__snapshots__/river.test.js.snap +21 -83
  89. package/Components/River/__tests__/componentsMap.test.js +64 -17
  90. package/Components/River/__tests__/river.test.js +75 -40
  91. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +12 -5
  92. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  93. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  94. package/Components/Screen/__tests__/Screen.test.tsx +41 -27
  95. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
  96. package/Components/Screen/hooks.ts +56 -0
  97. package/Components/Screen/index.tsx +16 -42
  98. package/Components/ScreenResolver/__tests__/screenResolver.test.js +95 -70
  99. package/Components/Tabs/Tab.tsx +12 -9
  100. package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
  101. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
  102. package/Components/TextInputTv/index.tsx +6 -5
  103. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
  104. package/Components/TrackedView/index.tsx +1 -0
  105. package/Components/Transitioner/AnimationManager.js +15 -15
  106. package/Components/Transitioner/Scene.tsx +53 -24
  107. package/Components/Transitioner/Transitioner.tsx +3 -3
  108. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  109. package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
  110. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +10 -50
  111. package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
  112. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +4 -4
  113. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  114. package/Components/Transitioner/index.js +8 -4
  115. package/Components/VideoLive/LiveImageManager.ts +27 -1
  116. package/Components/VideoLive/PlayerLiveImageComponent.tsx +36 -24
  117. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +63 -8
  118. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +6 -10
  119. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +16 -12
  120. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +5 -1
  121. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +15 -14
  122. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +6 -13
  123. package/Components/VideoModal/ModalAnimation/index.ts +2 -1
  124. package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
  125. package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
  126. package/Components/VideoModal/OpaqueLayer.tsx +33 -0
  127. package/Components/VideoModal/PlayerDetails.tsx +9 -6
  128. package/Components/VideoModal/PlayerWrapper.tsx +17 -36
  129. package/Components/VideoModal/VideoModal.tsx +14 -23
  130. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
  131. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +13 -10
  132. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
  133. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +66 -156
  134. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +89 -0
  135. package/Components/VideoModal/hooks/index.ts +7 -0
  136. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +49 -0
  137. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +91 -0
  138. package/Components/VideoModal/hooks/utils/index.ts +33 -0
  139. package/Components/VideoModal/utils.ts +3 -5
  140. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  141. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  142. package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
  143. package/Components/Viewport/__tests__/utils.test.js +5 -4
  144. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  145. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  146. package/Components/ZappUIComponent/index.tsx +3 -16
  147. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  148. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  149. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  150. package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
  151. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
  152. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  153. package/Contexts/ScreenContext/index.tsx +6 -12
  154. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  155. package/Decorators/Analytics/{index.js → index.tsx} +11 -11
  156. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  157. package/Decorators/Navigator/index.tsx +1 -1
  158. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
  159. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
  160. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
  161. package/Decorators/RiverFeedLoader/index.tsx +1 -1
  162. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
  163. package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
  164. package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
  165. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +27 -27
  166. package/Decorators/RiverResolver/index.tsx +6 -8
  167. package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
  168. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  169. package/Decorators/ZappPipesDataConnector/index.tsx +5 -2
  170. package/package.json +13 -10
  171. package/tsconfig.json +2 -3
  172. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  173. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  174. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  175. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  176. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  177. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  178. package/Decorators/RiverFeedLoader/utils.ts +0 -100
  179. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -1,48 +1,7 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`ComponentResolver renders correctly 1`] = `
4
- <ContextProvider
5
- value={null}
6
- >
7
- <Memo(ComponentResolver)
8
- cellStyles={Object {}}
9
- component={
10
- Object {
11
- "component_type": "some_component",
12
- }
13
- }
14
- components={
15
- Object {
16
- "SomeComponent": [MockFunction],
17
- }
18
- }
19
- decorators={[MockFunction]}
20
- dispatch={[Function]}
21
- plugins={Array []}
22
- store={
23
- Object {
24
- "clearActions": [Function],
25
- "dispatch": [Function],
26
- "getActions": [Function],
27
- "getState": [Function],
28
- "replaceReducer": [Function],
29
- "subscribe": [Function],
30
- }
31
- }
32
- />
33
- </ContextProvider>
34
- `;
35
-
36
3
  exports[`ComponentResolverComponent initializes the cell renderer plugin module if matching plugin exists 1`] = `
37
- <mockConstructor
4
+ <View
38
5
  rendered={true}
39
6
  />
40
7
  `;
41
-
42
- exports[`ComponentResolverComponent renders the Component if it exists 1`] = `
43
- <mockConstructor
44
- rendered={true}
45
- />
46
- `;
47
-
48
- exports[`ComponentResolverComponent returns null if the component doesn't exist 1`] = `""`;
@@ -1,22 +1,23 @@
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
+ import { render } from "@testing-library/react-native";
5
4
  import configureStore from "redux-mock-store";
6
5
 
7
- const logger = {
6
+ const mockLogger = {
8
7
  warning: jest.fn(),
9
8
  };
10
9
 
11
10
  jest.mock("../../../Helpers/logger", () => ({
12
11
  componentsLogger: {
13
- addSubsystem: jest.fn(() => logger),
12
+ addSubsystem: jest.fn(() => mockLogger),
14
13
  },
15
14
  }));
16
15
 
17
- jest.mock("../../default-cell-renderer", () =>
18
- jest.fn((prop) => <View whoAmI="default renderer" someProp={prop} />)
19
- );
16
+ jest.mock("../../default-cell-renderer", () => {
17
+ const View = jest.requireActual("react-native").View;
18
+
19
+ return jest.fn((prop) => <View whoAmI="default renderer" someProp={prop} />);
20
+ });
20
21
 
21
22
  const mock_rtl_flag = false;
22
23
 
@@ -41,37 +42,36 @@ const store = configureStore()({
41
42
  });
42
43
 
43
44
  const component = { component_type: "some_component" };
44
- const decorators = jest.fn((x) => x);
45
+ const decorators = (x) => x;
45
46
  const renderFunction = jest.fn((Comp) => <Comp rendered />);
46
47
 
47
48
  function clearAllMocks() {
48
- SomeComponent.mockClear();
49
- decorators.mockClear();
50
- renderFunction.mockClear();
51
- logger.warning.mockClear();
49
+ jest.clearAllMocks();
52
50
  }
53
51
 
54
52
  describe("ComponentResolver", () => {
55
53
  beforeEach(clearAllMocks);
56
54
 
57
55
  it("renders correctly", () => {
58
- const wrapper = shallow(
56
+ const { toJSON } = render(
59
57
  <ComponentResolver
60
58
  component={component}
61
59
  decorators={decorators}
62
60
  store={store}
63
- />
61
+ >
62
+ {() => null}
63
+ </ComponentResolver>
64
64
  );
65
65
 
66
- expect(shallowToJson(wrapper)).toMatchSnapshot();
66
+ expect(toJSON()).toBeNull();
67
67
  });
68
68
  });
69
69
 
70
70
  describe("ComponentResolverComponent", () => {
71
71
  beforeEach(clearAllMocks);
72
72
 
73
- const getWrapper = (component, plugins) =>
74
- shallow(
73
+ const renderComponent = (component, plugins) =>
74
+ render(
75
75
  <ComponentResolverComponent
76
76
  components={components}
77
77
  component={component}
@@ -85,9 +85,9 @@ describe("ComponentResolverComponent", () => {
85
85
  );
86
86
 
87
87
  it("renders the Component if it exists", () => {
88
- const wrapper = getWrapper(component, plugins);
88
+ const { toJSON } = renderComponent(component, plugins);
89
89
 
90
- expect(shallowToJson(wrapper)).toMatchSnapshot();
90
+ expect(toJSON()).not.toBeNull();
91
91
 
92
92
  expect(renderFunction).toHaveBeenCalledWith(
93
93
  SomeComponent,
@@ -96,24 +96,22 @@ describe("ComponentResolverComponent", () => {
96
96
  });
97
97
 
98
98
  it("returns null if the component doesn't exist", () => {
99
- const wrapper = getWrapper({ component_type: "foo" }, plugins);
99
+ const { UNSAFE_root } = renderComponent({ component_type: "foo" }, plugins);
100
100
 
101
101
  const warningMessage =
102
102
  "Component foo cannot be found - it is skipped from rendering";
103
103
 
104
- expect(shallowToJson(wrapper)).toMatchSnapshot();
105
- expect(wrapper.isEmptyRender()).toBe(true);
104
+ expect(UNSAFE_root.children.length).toBe(0);
105
+ expect(mockLogger.warning).toHaveBeenCalledTimes(2);
106
106
 
107
- expect(logger.warning).toHaveBeenCalledTimes(2);
108
-
109
- expect(logger.warning).toHaveBeenNthCalledWith(
107
+ expect(mockLogger.warning).toHaveBeenNthCalledWith(
110
108
  1,
111
109
  expect.objectContaining({
112
110
  message: "Could not resolve cell builder plugin",
113
111
  })
114
112
  );
115
113
 
116
- expect(logger.warning).toHaveBeenNthCalledWith(
114
+ expect(mockLogger.warning).toHaveBeenNthCalledWith(
117
115
  2,
118
116
  expect.objectContaining({
119
117
  message: warningMessage,
@@ -122,11 +120,9 @@ describe("ComponentResolverComponent", () => {
122
120
  });
123
121
 
124
122
  it("initializes the cell renderer plugin module if matching plugin exists", () => {
125
- const plugins = [];
126
-
127
- const wrapper = getWrapper(component, plugins);
123
+ const { toJSON } = renderComponent(component, plugins);
128
124
 
129
- expect(shallowToJson(wrapper)).toMatchSnapshot();
125
+ expect(toJSON()).toMatchSnapshot();
130
126
 
131
127
  expect(renderFunction).toHaveBeenCalledWith(
132
128
  SomeComponent,
@@ -1,10 +1,10 @@
1
1
  import React from "react";
2
- import { shallow } from "enzyme";
2
+ import { render } from "@testing-library/react-native";
3
3
 
4
- import { ContentScreen } from "../index";
4
+ import { ContentScreen } from "../";
5
5
 
6
6
  describe("<ContentScreen />", () => {
7
7
  it("renders correctly", () => {
8
- expect(() => shallow(<ContentScreen />)).toThrowErrorMatchingSnapshot();
8
+ expect(() => render(<ContentScreen />)).toThrowErrorMatchingSnapshot();
9
9
  });
10
10
  });
@@ -1,7 +1,7 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`DISPLAY_STATES matches the snapshot 1`] = `
4
- Object {
4
+ {
5
5
  "CONTENT": "CONTENT",
6
6
  "CONTROLS": "CONTROLS",
7
7
  "DISCOVERY": "DISCOVERY",
@@ -9,7 +9,7 @@ Object {
9
9
  `;
10
10
 
11
11
  exports[`DisplayStateContext has the correct properties 1`] = `
12
- Object {
12
+ {
13
13
  "Consumer": [MockFunction],
14
14
  "Provider": [MockFunction],
15
15
  "withConsumer": [MockFunction],
@@ -1,13 +1,13 @@
1
1
  import React, { useMemo } from "react";
2
2
  import * as R from "ramda";
3
3
  import {
4
- View,
4
+ ImageStyle,
5
5
  StyleSheet,
6
6
  Text,
7
- ViewStyle,
8
- TextStyle,
9
- ImageStyle,
10
7
  TextProps,
8
+ TextStyle,
9
+ View,
10
+ ViewStyle,
11
11
  } from "react-native";
12
12
  import { defaultAsset } from "./defaultAsset";
13
13
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
@@ -150,13 +150,13 @@ export function ErrorScreen(props: Props) {
150
150
  return (
151
151
  <View style={[baseStyles.container, styles.screen]}>
152
152
  <View style={[baseStyles.container, styles.component]}>
153
- {assetEnabled && (
153
+ {assetEnabled ? (
154
154
  <Image
155
155
  fadeDuration={0}
156
156
  source={{ uri: asset }}
157
157
  style={styles.asset}
158
158
  />
159
- )}
159
+ ) : null}
160
160
  <Text style={styles.title} {...titleProps}>
161
161
  {title}
162
162
  </Text>
@@ -1,5 +1,5 @@
1
+ /* eslint-disable react/no-unknown-property */
1
2
  import * as React from "react";
2
- import * as R from "ramda";
3
3
 
4
4
  import { BaseFocusable } from "../BaseFocusable";
5
5
  import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focusManager";
@@ -42,8 +42,6 @@ class Focusable extends BaseFocusable<Props> {
42
42
  this.resetLongPressTimeout = this.resetLongPressTimeout.bind(this);
43
43
  this.longPress = this.longPress.bind(this);
44
44
  this.press = this.press.bind(this);
45
- this.focus = this.focus.bind(this);
46
- this.blur = this.blur.bind(this);
47
45
  }
48
46
 
49
47
  /**
@@ -55,37 +53,6 @@ class Focusable extends BaseFocusable<Props> {
55
53
  return this.preferredFocus();
56
54
  }
57
55
 
58
- /**
59
- * Sets the focus on this item. Will trigger sequentially a sequence of
60
- * functions (willReceiveFocus, focus, hasReceivedFocus). If these functions (defined in the Focusable
61
- * Item underlying component) return promises, execution will wait before it proceeds to the next. This
62
- * is useful for triggering sequential operations that specifically require to fully run before or after
63
- * focus is actually set on that item.
64
- * @param {string} scrollDirection string representation of the direction of the navigation which landed
65
- * to this item being focused
66
- */
67
- setFocus(scrollDirection) {
68
- const focusMethods = [
69
- this.willReceiveFocus,
70
- this.focus,
71
- this.hasReceivedFocus,
72
- ];
73
-
74
- const self = this;
75
-
76
- return R.reduce(
77
- (sequence, method) => {
78
- return sequence
79
- .then(() => method.apply(self, [scrollDirection]))
80
- .catch((e) => {
81
- throw e;
82
- });
83
- },
84
- Promise.resolve(),
85
- focusMethods
86
- );
87
- }
88
-
89
56
  startLongPressTimeout() {
90
57
  this.longPressTimeout = setTimeout(() => {
91
58
  this.longPress(null);
@@ -102,26 +69,6 @@ class Focusable extends BaseFocusable<Props> {
102
69
  }
103
70
  }
104
71
 
105
- /**
106
- * will invoke the underlying component's focus method
107
- * @param {Object} scrollDirection
108
- * @returns {Promise}
109
- */
110
- focus(scrollDirection) {
111
- return this.onFocus(this, scrollDirection); // invokeComponentMethod(this, "onFocus", scrollDirection);
112
- }
113
-
114
- /**
115
- * will invoke the underlying component's blur method
116
- * @param {Object} scrollDirection
117
- * @returns {Promise}
118
- */
119
- blur(
120
- scrollDirection?: FocusManager.Web.Direction | FocusManager.IOS.Direction
121
- ) {
122
- return this.onBlur(this, scrollDirection);
123
- }
124
-
125
72
  /**
126
73
  * will invoke the underlying component's press method
127
74
  * @param {Object} keyEvent
@@ -9,7 +9,7 @@ import {
9
9
  focusManager,
10
10
  forceFocusableFocus,
11
11
  } from "@applicaster/zapp-react-native-utils/appUtils/focusManager/index.ios";
12
- import { findNodeHandle } from "react-native";
12
+ import { findNodeHandle, ViewStyle } from "react-native";
13
13
 
14
14
  function noop() {}
15
15
 
@@ -35,6 +35,10 @@ type Props = {
35
35
  forceFocus?: boolean;
36
36
  initialFocus?: boolean;
37
37
  onLayout?: (e: any) => void;
38
+ willReceiveFocus: () => void;
39
+ hasReceivedFocus: () => void;
40
+ offsetUpdater: (arg1: string, arg2: number) => number;
41
+ style: ViewStyle;
38
42
  };
39
43
 
40
44
  export class Focusable extends BaseFocusable<Props> {
@@ -90,7 +94,7 @@ export class Focusable extends BaseFocusable<Props> {
90
94
  onBlur(nativeEvent);
91
95
  }
92
96
 
93
- setFocus(direction, callback) {
97
+ setFocus(_direction, callback) {
94
98
  const focusMethods = [
95
99
  { method: this.willReceiveFocus },
96
100
  { method: this.focus, args: [callback] },
@@ -1,25 +1,24 @@
1
1
  import * as React from "react";
2
2
 
3
- type Props =
4
- | {
5
- id: string;
6
- children: React.ReactNode;
7
- onPress?: (ref: FocusManager.TouchableRef) => void;
8
- onPressIn?: (ref: FocusManager.TouchableRef) => void;
9
- onPressOut?: (ref: FocusManager.TouchableRef) => void;
10
- onLongPress?: (ref: FocusManager.TouchableRef) => void;
11
- onFocus?: (
12
- ref: FocusManager.TouchableRef,
13
- options: FocusManager.Android.CallbackOptions
14
- ) => void;
15
- onBlur?: (
16
- ref: FocusManager.TouchableRef,
17
- options: FocusManager.Android.CallbackOptions
18
- ) => void;
19
-
20
- disableFocus?: boolean;
21
- blockFocus?: boolean;
22
- } & Partial<ParentFocus>;
3
+ type Props = {
4
+ id: string;
5
+ children: React.ReactNode;
6
+ onPress?: (ref: FocusManager.TouchableRef) => void;
7
+ onPressIn?: (ref: FocusManager.TouchableRef) => void;
8
+ onPressOut?: (ref: FocusManager.TouchableRef) => void;
9
+ onLongPress?: (ref: FocusManager.TouchableRef) => void;
10
+ onFocus?: (
11
+ ref: FocusManager.TouchableRef,
12
+ options: FocusManager.Android.CallbackOptions
13
+ ) => void;
14
+ onBlur?: (
15
+ ref: FocusManager.TouchableRef,
16
+ options: FocusManager.Android.CallbackOptions
17
+ ) => void;
18
+
19
+ disableFocus?: boolean;
20
+ blockFocus?: boolean;
21
+ } & Partial<ParentFocus>;
23
22
 
24
23
  export class Touchable extends React.Component<Props> {
25
24
  onPress(focusableRef: FocusManager.TouchableRef): void {
@@ -33,6 +33,8 @@ type Props = {
33
33
  onLongPress?: (ref: FocusManager.FocusableRef) => void;
34
34
  onRegister?: () => void;
35
35
  isFocusableCell?: boolean;
36
+ /** only for FocusableScrollView */
37
+ onSetIsFocusable?: (isFocusable: boolean) => void;
36
38
  } & ParentFocus;
37
39
 
38
40
  export const FocusableContext = React.createContext<
@@ -67,6 +69,7 @@ function FocusableComponent(props: Props, forwardedRef) {
67
69
  onLongPress,
68
70
  onRegister = noop,
69
71
  isFocusableCell = true,
72
+ onSetIsFocusable,
70
73
  } = props;
71
74
 
72
75
  const isRTL = useIsRTL();
@@ -137,9 +140,13 @@ function FocusableComponent(props: Props, forwardedRef) {
137
140
  [onBlur]
138
141
  );
139
142
 
140
- const setIsFocusable = React.useCallback((blockFocus) => {
141
- setDisableFocus(!blockFocus);
142
- }, []);
143
+ const setIsFocusable = React.useCallback(
144
+ (blockFocus) => {
145
+ onSetIsFocusable?.(blockFocus);
146
+ setDisableFocus(!blockFocus);
147
+ },
148
+ [onSetIsFocusable]
149
+ );
143
150
 
144
151
  const parentFocus = React.useMemo(
145
152
  () => ({
@@ -1,17 +1,31 @@
1
1
  import * as React from "react";
2
2
  import { FocusableGroupNative } from "@applicaster/zapp-react-native-ui-components/Components/NativeFocusables";
3
3
  import { BaseFocusable } from "@applicaster/zapp-react-native-ui-components/Components/BaseFocusable";
4
-
5
- function noop() {}
4
+ import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
5
+
6
+ const { log_verbose } = createLogger({
7
+ subsystem: "General",
8
+ category: "FocusableGroup",
9
+ });
10
+
11
+ type FocusableGroupNativeEvent = {
12
+ nativeEvent: {
13
+ focusHeading: FocusManager.Direction;
14
+ groupId: string;
15
+ isActive: boolean;
16
+ isFocusDisabled: boolean;
17
+ isFocusingByUser: boolean;
18
+ itemId: string;
19
+ target: number;
20
+ };
21
+ };
6
22
 
7
23
  type Props = {
8
24
  id: string;
9
25
  children: (arg1: boolean) => React.ComponentType<any>;
10
- onWillUpdateFocus: (nativeEvent: any) => void;
11
- onDidUpdateFocus: (nativeEvent: any) => void;
12
26
  isFocusDisabled: boolean;
13
27
  initialItemId: string;
14
- resetFocusToInitialValue: boolean;
28
+ isPreferredFocusDisabled: boolean;
15
29
  focusGroupRef: React.Component;
16
30
  shouldUsePreferredFocus: boolean;
17
31
  groupId: string;
@@ -21,86 +35,27 @@ type Props = {
21
35
  };
22
36
 
23
37
  export class FocusableGroup extends BaseFocusable<Props> {
24
- focusableGroupNativeRef: React.Component | null;
25
- constructor(props) {
26
- super(props);
27
- this.focusableGroupNativeRef = null;
28
-
29
- this.state = {
30
- isActive: false,
31
- };
32
-
33
- this.onWillUpdateFocus = this.onWillUpdateFocus.bind(this);
34
- this.onDidUpdateFocus = this.onDidUpdateFocus.bind(this);
35
- this.isGroup = true;
36
-
37
- this.shouldUsePreferredFocus = this.shouldUsePreferredFocus.bind(this);
38
- this.measureView = this.measureView.bind(this);
39
- }
40
-
41
- connectedScreenId() {
42
- const {
43
- screenData: { screenId, parentScreenId },
44
- } = this.props;
45
-
46
- if (screenId) {
47
- return null;
48
- }
49
-
50
- return parentScreenId ? `${parentScreenId}-${screenId}` : screenId;
51
- }
52
-
53
- /**
54
- * tells whether the group should give focus to a preferred item when it gains focus from another
55
- * group
56
- * @returns {boolean}
57
- */
58
- shouldUsePreferredFocus() {
59
- return this.props.shouldUsePreferredFocus || false;
60
- }
61
-
62
- /**
63
- * indicates whether the underlying component should claim preferred focus
64
- * when navigating into the group of this item
65
- * @returns {boolean}
66
- */
67
- isPreferredFocus() {
68
- return this.props.preferredFocus || false;
69
- }
70
-
71
- onWillUpdateFocus({ nativeEvent }) {
72
- const { isActive } = nativeEvent;
73
- this.setState({ isActive });
74
- const { onWillUpdateFocus = noop } = this.props;
75
- onWillUpdateFocus(nativeEvent);
76
- }
77
-
78
- onDidUpdateFocus({ nativeEvent }) {
79
- const { onDidUpdateFocus = noop } = this.props;
80
- onDidUpdateFocus(nativeEvent);
81
- }
82
-
83
- setFocusDisabled(isFocusDisabled) {
84
- if (this.ref) {
85
- this.ref.current.setNativeProps({
86
- isFocusDisabled,
87
- });
88
- }
89
- }
90
-
91
38
  render() {
92
39
  const {
93
40
  children,
94
41
  id,
95
42
  isFocusDisabled,
96
43
  initialItemId,
97
- resetFocusToInitialValue,
98
- style,
44
+ isPreferredFocusDisabled,
45
+ style = {},
99
46
  groupId,
100
47
  ...otherProps
101
48
  } = this.props;
102
49
 
103
- const focusableStyles = style || {};
50
+ const onGroupFocus = ({ nativeEvent }: FocusableGroupNativeEvent) => {
51
+ log_verbose("FOCUSABLE_GROUP: onGroupFocus", { nativeEvent });
52
+ this.onFocus(this.ref, nativeEvent.focusHeading);
53
+ };
54
+
55
+ const onGroupBlur = ({ nativeEvent }: FocusableGroupNativeEvent) => {
56
+ log_verbose("FOCUSABLE_GROUP: onGroupBlur", { nativeEvent });
57
+ this.onBlur(this.ref, nativeEvent.focusHeading);
58
+ };
104
59
 
105
60
  return (
106
61
  <FocusableGroupNative
@@ -109,15 +64,11 @@ export class FocusableGroup extends BaseFocusable<Props> {
109
64
  ref={this.ref}
110
65
  isFocusDisabled={isFocusDisabled}
111
66
  initialItemId={initialItemId}
112
- resetFocusToInitialValue={resetFocusToInitialValue}
113
- onLayout={this.measureView}
114
- onViewFocus={this.onFocus}
115
- onViewPress={this.onPress}
116
- onViewBlur={this.onBlur}
117
- style={focusableStyles}
67
+ isPreferredFocusDisabled={isPreferredFocusDisabled}
68
+ onGroupFocus={onGroupFocus}
69
+ onGroupBlur={onGroupBlur}
70
+ style={style}
118
71
  {...otherProps}
119
- onWillUpdateFocus={this.onWillUpdateFocus}
120
- onDidUpdateFocus={this.onDidUpdateFocus}
121
72
  >
122
73
  {children}
123
74
  </FocusableGroupNative>
@@ -16,12 +16,10 @@ type Props = {
16
16
  prioritiseFocusOn?: number;
17
17
  groupId?: string;
18
18
  hasTVPreferredFocus?: boolean;
19
- resetFocusToInitialValue?: boolean;
19
+ isPreferredFocusDisabled?: boolean;
20
20
  onFocus?: () => void;
21
21
  onBlur?: () => void;
22
- onWillUpdateFocus?: (event?: any) => void;
23
22
  willReceiveFocus?: (event?: any) => void;
24
- onDidUpdateFocus?: (event?: any) => void;
25
23
  hasLostFocus?: any;
26
24
  nextFocusUp?: any;
27
25
  nextFocusDown?: any;
@@ -15,6 +15,7 @@ import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
15
15
 
16
16
  import { useParentFocus, useCheckItemIdsForUnique } from "./hooks";
17
17
  import { FocusableListItemWrapper } from "./FocusableListItemWrapper";
18
+ import { FocusableScrollView } from "../FocusableScrollView";
18
19
 
19
20
  const mapIndexed = R.addIndex(R.map);
20
21
 
@@ -54,6 +55,7 @@ export type Props<ItemT> = FlatListProps<ItemT> & {
54
55
  disableNextFocusUp?: boolean;
55
56
  disableNextFocusLeft?: boolean;
56
57
  disableNextFocusRight?: boolean;
58
+ useScrollView?: boolean;
57
59
  } & ParentFocus;
58
60
 
59
61
  function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
@@ -87,8 +89,8 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
87
89
  initialFocusDirection = "down",
88
90
  data = [],
89
91
  // eslint-disable-next-line unused-imports/no-unused-vars
90
- onAllComponentsLoaded, // TODO: re-implement it
91
92
  omitPropsPropagation = [],
93
+ useScrollView = false,
92
94
  } = props;
93
95
 
94
96
  useCheckItemIdsForUnique({ componentId: props.id, items: data });
@@ -274,6 +276,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
274
276
  "initialFocusDirection",
275
277
  "withStateMemory",
276
278
  "useSequentialLoading",
279
+ "useScrollView",
277
280
  ...omitPropsPropagation,
278
281
  ],
279
282
  R.__
@@ -296,15 +299,28 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
296
299
  return (
297
300
  // @ts-ignore
298
301
  <ChildrenFocusDeactivatorView flex={1}>
299
- <FlatList
300
- focusable={false}
301
- scrollEnabled={false}
302
- ref={ref}
303
- {...getFlatListProps(props)}
304
- renderItem={renderItem}
305
- onEndReached={onEndReached}
306
- initialNumToRender={initialNumToRender}
307
- />
302
+ {useScrollView ? (
303
+ <FocusableScrollView
304
+ ref={ref}
305
+ {...getFlatListProps(props)}
306
+ onEndReached={onEndReached}
307
+ initialNumToRender={initialNumToRender}
308
+ renderItem={renderItem}
309
+ focused={focused}
310
+ data={data}
311
+ />
312
+ ) : (
313
+ <FlatList
314
+ testID="focusable-list-flat-list"
315
+ focusable={false}
316
+ scrollEnabled={false}
317
+ ref={ref}
318
+ {...getFlatListProps(props)}
319
+ renderItem={renderItem}
320
+ onEndReached={onEndReached}
321
+ initialNumToRender={initialNumToRender}
322
+ />
323
+ )}
308
324
  </ChildrenFocusDeactivatorView>
309
325
  );
310
326
  }