@applicaster/zapp-react-native-ui-components 14.0.0-rc.8 → 15.0.0-rc.1

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 (163) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AudioPlayer/index.tsx +15 -0
  3. package/Components/AudioPlayer/mobile/Layout.tsx +66 -0
  4. package/Components/AudioPlayer/{__tests__/__snapshots__/audioPlayer.test.js.snap → mobile/__tests__/__snapshots__/audioPlayerMobileLayout.test.js.snap} +2 -2
  5. package/Components/AudioPlayer/mobile/__tests__/audioPlayerMobileLayout.test.js +18 -0
  6. package/Components/AudioPlayer/mobile/index.tsx +18 -0
  7. package/Components/AudioPlayer/{Artwork.tsx → tv/Artwork.tsx} +3 -2
  8. package/Components/AudioPlayer/{Channel.tsx → tv/Channel.tsx} +7 -7
  9. package/Components/AudioPlayer/tv/Layout.tsx +168 -0
  10. package/Components/AudioPlayer/{Runtime.tsx → tv/Runtime.tsx} +7 -1
  11. package/Components/AudioPlayer/{Summary.tsx → tv/Summary.tsx} +6 -2
  12. package/Components/AudioPlayer/{Title.tsx → tv/Title.tsx} +6 -2
  13. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/Runtime.test.js.snap +2 -2
  14. package/Components/AudioPlayer/tv/__tests__/__snapshots__/audioPlayer.test.js.snap +164 -0
  15. package/Components/AudioPlayer/tv/__tests__/__snapshots__/channel.test.js.snap +19 -0
  16. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/summary.test.js.snap +1 -2
  17. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/title.test.js.snap +1 -2
  18. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/audioPlayer.test.js +7 -3
  19. package/Components/AudioPlayer/{helpers.tsx → tv/helpers.tsx} +11 -5
  20. package/Components/AudioPlayer/{AudioPlayer.tsx → tv/index.tsx} +17 -58
  21. package/Components/AudioPlayer/types.ts +40 -0
  22. package/Components/BaseFocusable/index.tsx +23 -12
  23. package/Components/Cell/Cell.tsx +91 -64
  24. package/Components/Cell/CellWithFocusable.tsx +3 -0
  25. package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
  26. package/Components/Cell/index.js +7 -3
  27. package/Components/ComponentResolver/index.ts +1 -1
  28. package/Components/FeedLoader/FeedLoader.tsx +7 -16
  29. package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
  30. package/Components/FeedLoader/index.js +2 -8
  31. package/Components/Focusable/Focusable.tsx +12 -3
  32. package/Components/Focusable/FocusableTvOS.tsx +5 -5
  33. package/Components/Focusable/FocusableiOS.tsx +2 -2
  34. package/Components/Focusable/Touchable.tsx +5 -3
  35. package/Components/Focusable/__tests__/index.android.test.tsx +3 -0
  36. package/Components/Focusable/index.android.tsx +19 -11
  37. package/Components/Focusable/index.tsx +1 -1
  38. package/Components/FocusableGroup/FocusableTvOS.tsx +1 -1
  39. package/Components/FocusableList/FocusableItem.tsx +4 -3
  40. package/Components/FocusableList/FocusableListItemWrapper.tsx +2 -1
  41. package/Components/FocusableList/hooks/useCellState.android.ts +13 -3
  42. package/Components/FocusableList/index.tsx +20 -9
  43. package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
  44. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  45. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
  46. package/Components/HandlePlayable/HandlePlayable.tsx +25 -9
  47. package/Components/HookRenderer/HookRenderer.tsx +5 -1
  48. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  49. package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
  50. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +6 -2
  51. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  52. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -39
  53. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  54. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  55. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +65 -17
  56. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/Image.test.tsx +21 -3
  57. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +6 -3
  58. package/Components/MasterCell/DefaultComponents/Text/index.tsx +26 -6
  59. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
  60. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
  61. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
  62. package/Components/MasterCell/elementMapper.tsx +1 -2
  63. package/Components/MasterCell/index.tsx +1 -1
  64. package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
  65. package/Components/MasterCell/utils/index.ts +11 -5
  66. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  67. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  68. package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
  69. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  70. package/Components/PlayerContainer/PlayerContainer.tsx +46 -33
  71. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  72. package/Components/PlayerContainer/index.ts +1 -1
  73. package/Components/PlayerImageBackground/index.tsx +1 -1
  74. package/Components/River/ComponentsMap/ComponentsMap.tsx +1 -6
  75. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  76. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  77. package/Components/River/RefreshControl.tsx +11 -17
  78. package/Components/River/RiverItem.tsx +11 -8
  79. package/Components/River/TV/River.tsx +2 -17
  80. package/Components/River/TV/index.tsx +3 -1
  81. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  82. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  83. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  84. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -6
  85. package/Components/River/__tests__/river.test.js +12 -26
  86. package/Components/River/index.tsx +1 -1
  87. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  88. package/Components/Screen/__tests__/navigationHandler.test.ts +133 -22
  89. package/Components/Screen/navigationHandler.ts +20 -2
  90. package/Components/ScreenResolver/index.tsx +15 -0
  91. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  92. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  93. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  94. package/Components/ScreenRevealManager/index.ts +1 -0
  95. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  96. package/Components/Tabs/TV/Tabs.android.tsx +1 -3
  97. package/Components/Tabs/Tabs.tsx +2 -3
  98. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +13 -0
  99. package/Components/TextInputTv/index.tsx +11 -0
  100. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  101. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  102. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  103. package/Components/VideoLive/animationUtils.ts +3 -3
  104. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
  105. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +294 -0
  106. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +93 -0
  107. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +73 -29
  108. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  109. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  110. package/Components/VideoModal/VideoModal.tsx +3 -17
  111. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  112. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  113. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -180
  114. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +21 -51
  115. package/Components/VideoModal/hooks/index.ts +0 -2
  116. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +15 -1
  117. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  118. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +2 -2
  119. package/Components/VideoModal/hooks/utils/index.ts +4 -0
  120. package/Components/VideoModal/utils.ts +6 -0
  121. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  122. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  123. package/Components/Viewport/VisibilitySensor/VisibilitySensor.tsx +3 -3
  124. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/index.ts +3 -3
  125. package/Contexts/CellFocusedStateContext/index.tsx +27 -0
  126. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  127. package/Contexts/ScreenContext/index.tsx +46 -6
  128. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  129. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  130. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  131. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  132. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  133. package/Decorators/RiverFeedLoader/index.tsx +22 -4
  134. package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
  135. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  136. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  137. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  138. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  139. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  140. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  141. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  142. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  143. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  144. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  145. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +266 -0
  146. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  147. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  148. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  149. package/events/index.ts +3 -0
  150. package/package.json +5 -10
  151. package/Components/AudioPlayer/AudioPlayerLayout.tsx +0 -202
  152. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +0 -66
  153. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +0 -28
  154. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +0 -26
  155. package/Components/AudioPlayer/index.ts +0 -1
  156. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
  157. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
  158. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/Runtime.test.js +0 -0
  159. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/artWork.test.js.snap +0 -0
  160. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/artWork.test.js +0 -0
  161. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/channel.test.js +0 -0
  162. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/summary.test.js +0 -0
  163. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/title.test.js +0 -0
@@ -10,11 +10,10 @@ import { useLocalizedStrings } from "@applicaster/zapp-react-native-utils/locali
10
10
  import { useAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils";
11
11
  import { useSendAnalyticsEventWithFunction } from "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks";
12
12
  import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData";
13
- import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
14
- import { useDispatch } from "react-redux";
15
13
  import { useShallow } from "zustand/react/shallow";
16
14
  import { useScreenContextV2 } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
17
15
  import { useSafeAreaInsets } from "react-native-safe-area-context";
16
+ import { useLoadPipesDataDispatch } from "@applicaster/zapp-react-native-utils/reactHooks";
18
17
 
19
18
  const BRIGHTNESS_THRESHOLD = 160;
20
19
  const ABOVE_DEFAULT_COLOR = "gray";
@@ -61,38 +60,33 @@ export const usePullToRefresh = (
61
60
  ) => {
62
61
  const isPipesV1 = !!pullToRefreshPipesV1RefreshingStateUpdater;
63
62
 
64
- const dispatch = useDispatch();
65
-
66
63
  const [refreshing, setRefreshing] = React.useState(false);
67
64
 
68
65
  const feeds: string[] =
69
66
  riverComponents?.map(R.path(["data", "source"])).filter((feed) => !!feed) ??
70
67
  [];
71
68
 
72
- const screenData = useCurrentScreenData();
73
-
74
69
  const feedsLength = feeds.length;
75
70
 
76
71
  const [requestsCompletedCounter, setRequestsCompletedCounter] =
77
72
  React.useState(0);
78
73
 
74
+ const loadPipesDataDispatcher = useLoadPipesDataDispatch();
75
+
79
76
  React.useEffect(() => {
80
77
  // will not work for pipes v1 on 1st level screens
81
78
  if (refreshing && !isPipesV1) {
82
79
  feeds.forEach((feed) => {
83
- dispatch(
84
- loadPipesData(feed, {
85
- silentRefresh: true,
86
- clearCache: true,
87
- callback: () => {
88
- setRequestsCompletedCounter(R.inc);
89
- },
90
- riverId: screenData.id,
91
- })
92
- );
80
+ loadPipesDataDispatcher(feed, {
81
+ silentRefresh: true,
82
+ clearCache: true,
83
+ callback: () => {
84
+ setRequestsCompletedCounter(R.inc);
85
+ },
86
+ });
93
87
  });
94
88
  }
95
- }, [refreshing, isPipesV1]);
89
+ }, [refreshing, isPipesV1, feeds, loadPipesDataDispatcher]);
96
90
 
97
91
  React.useEffect(() => {
98
92
  if (requestsCompletedCounter === feedsLength) {
@@ -13,6 +13,7 @@ import { riverLogger } from "./logger";
13
13
  import { tvPluginsWithCellRenderer } from "../../const";
14
14
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
15
15
  import type { BehaviorSubject } from "rxjs";
16
+ import { useCallbackActions } from "@applicaster/zapp-react-native-utils/zappFrameworkUtils/HookCallback/useCallbackActions";
16
17
 
17
18
  export type RiverItemType = {
18
19
  item: ZappUIComponent;
@@ -39,6 +40,10 @@ function getFeedUrl(feed: ZappFeed, index: number) {
39
40
  }
40
41
  }
41
42
 
43
+ const isNextIndex = (index, readyIndex) => {
44
+ return readyIndex + 1 >= index;
45
+ };
46
+
42
47
  /**
43
48
  * useLoadingState for RiverItemComponent
44
49
  * takes currentIndex and loadingState as arguments
@@ -48,24 +53,20 @@ const useLoadingState = (
48
53
  loadingState: RiverItemType["loadingState"]
49
54
  ) => {
50
55
  const [readyToBeDisplayed, setReadyToBeDisplayed] = React.useState(
51
- loadingState.getValue().index + 1 >= currentIndex
56
+ isNextIndex(currentIndex, loadingState.getValue().index)
52
57
  );
53
58
 
54
59
  useEffect(() => {
55
60
  const subscription = loadingState.subscribe(({ index }) => {
56
- if (index + 1 >= currentIndex) {
61
+ if (isNextIndex(currentIndex, index)) {
57
62
  setReadyToBeDisplayed(true);
58
63
  }
59
64
  });
60
65
 
61
- if (loadingState.getValue().index + 1 >= currentIndex) {
62
- setReadyToBeDisplayed(true);
63
- }
64
-
65
66
  return () => {
66
67
  subscription.unsubscribe();
67
68
  };
68
- }, [loadingState, currentIndex]);
69
+ }, [currentIndex]);
69
70
 
70
71
  return readyToBeDisplayed;
71
72
  };
@@ -85,6 +86,7 @@ function RiverItemComponent(props: RiverItemType) {
85
86
  loadingState,
86
87
  } = props;
87
88
 
89
+ const callbackAction = useCallbackActions(item);
88
90
  const readyToBeDisplayed = useLoadingState(index, loadingState);
89
91
 
90
92
  const feedUrl = getFeedUrl(feed, index);
@@ -151,10 +153,11 @@ function RiverItemComponent(props: RiverItemType) {
151
153
  component={item}
152
154
  componentIndex={index}
153
155
  onLoadFailed={onLoadFailed}
154
- onLoadFinished={() => onLoadFinished(index)} // Keeping it here to don't break the plugins.
156
+ onLoadFinished={() => onLoadFinished(index)}
155
157
  groupId={groupId}
156
158
  feedUrl={feedUrl}
157
159
  isLast={isLast}
160
+ callback={callbackAction}
158
161
  />
159
162
  );
160
163
  }
@@ -4,10 +4,6 @@ import * as React from "react";
4
4
  import { Text } from "react-native";
5
5
  import * as R from "ramda";
6
6
 
7
- import {
8
- useFeedLoader,
9
- useLayoutVersion,
10
- } from "@applicaster/zapp-react-native-utils/reactHooks";
11
7
  import { GeneralContentScreen } from "../../GeneralContentScreen";
12
8
  import { ScreenResolver } from "@applicaster/zapp-react-native-ui-components/Components/ScreenResolver";
13
9
  import { utilsLogger } from "@applicaster/zapp-react-native-utils/logger";
@@ -21,6 +17,7 @@ type Props = {
21
17
  screenId: string;
22
18
  screenData: ZappRiver | ZappEntry;
23
19
  feedUrl?: string;
20
+ feedData?: PipesDataObject["data"];
24
21
  extraProps?: any;
25
22
  screenResolverExtraProps?: any;
26
23
  componentsMapExtraProps?: any;
@@ -32,7 +29,7 @@ type Props = {
32
29
  export const River = (props: Props) => {
33
30
  const {
34
31
  screenId,
35
- feedUrl,
32
+ feedData,
36
33
  extraProps,
37
34
  screenResolverExtraProps,
38
35
  componentsMapExtraProps,
@@ -46,7 +43,6 @@ export const River = (props: Props) => {
46
43
  useSetNavbarState();
47
44
 
48
45
  const rivers = useRivers();
49
- const isV2 = useLayoutVersion({ isV2: true });
50
46
 
51
47
  const river = React.useMemo(() => rivers?.[screenId], [screenId]);
52
48
 
@@ -55,17 +51,6 @@ export const River = (props: Props) => {
55
51
  [screenId]
56
52
  );
57
53
 
58
- const connectedScreenUrl = React.useMemo(() => {
59
- // Avoid using feedUrl or content.src on layouts v2
60
- if (isV2) return null;
61
-
62
- return feedUrl || R.path(["content", "src"], screenData);
63
- }, [feedUrl, screenData]);
64
-
65
- const { data: feedData } = useFeedLoader({
66
- feedUrl: connectedScreenUrl,
67
- });
68
-
69
54
  const stringOrEmpty = (value: string | number | undefined): string =>
70
55
  R.isNil(value) ? "" : String(value);
71
56
 
@@ -2,8 +2,10 @@ import { compose } from "ramda";
2
2
  import { River as RiverComponent } from "./River";
3
3
  import { withTvEventHandler } from "./withTVEventHandler";
4
4
  import { withComponentsMapOffsetContext } from "../../../Contexts/ComponentsMapOffsetContext";
5
+ import { withRiverDataLoader } from "./withRiverDataLoader";
5
6
 
6
7
  export const River = compose(
7
8
  withTvEventHandler,
8
- withComponentsMapOffsetContext
9
+ withComponentsMapOffsetContext,
10
+ withRiverDataLoader
9
11
  )(RiverComponent);
@@ -0,0 +1,43 @@
1
+ import React, { useMemo } from "react";
2
+ import { path } from "ramda";
3
+
4
+ import {
5
+ useFeedLoader,
6
+ useRivers,
7
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
8
+
9
+ type Props = {
10
+ screenId: string;
11
+ screenData: ZappRiver | ZappEntry;
12
+ feedUrl?: string;
13
+ river?: ZappRiver | ZappEntry;
14
+ };
15
+
16
+ export const withPipesV1DataLoader = (
17
+ WrappedComponent: React.ComponentType<any>
18
+ ) => {
19
+ return function WithPipesV1DataLoaderComponent(props: Props) {
20
+ const { screenId, feedUrl } = props;
21
+
22
+ const rivers = useRivers();
23
+
24
+ const river = React.useMemo(() => rivers?.[screenId], [screenId]);
25
+
26
+ const screenData = React.useMemo(
27
+ () => props.screenData || props.river || river,
28
+ [screenId]
29
+ );
30
+
31
+ const connectedScreenUrl = useMemo(() => {
32
+ // Avoid using feedUrl or content.src on layouts v2
33
+
34
+ return feedUrl || path(["content", "src"], screenData);
35
+ }, [feedUrl, screenData]);
36
+
37
+ const { data: feedData } = useFeedLoader({
38
+ feedUrl: connectedScreenUrl,
39
+ });
40
+
41
+ return <WrappedComponent {...props} feedData={feedData} />;
42
+ };
43
+ };
@@ -0,0 +1,17 @@
1
+ import { useLayoutVersion } from "@applicaster/zapp-react-native-utils/reactHooks";
2
+ import React from "react";
3
+ import { withPipesV1DataLoader } from "./withPipesV1DataLoader";
4
+
5
+ export const withRiverDataLoader = (
6
+ WrappedComponent: React.ComponentType<any>
7
+ ) => {
8
+ return function WithRiverDataLoaderComponent(props) {
9
+ const isV2 = useLayoutVersion({ isV2: true });
10
+
11
+ if (isV2) {
12
+ return <WrappedComponent {...props} />;
13
+ }
14
+
15
+ return withPipesV1DataLoader(WrappedComponent)(props);
16
+ };
17
+ };
@@ -8,7 +8,7 @@ export const withTvEventHandler = (Component) => {
8
8
  return function WithTVEventHandler(props) {
9
9
  const navigator = useNavigation();
10
10
 
11
- const remoteHandler = (_, event) => {
11
+ const remoteHandler = (event) => {
12
12
  const { eventType } = event;
13
13
 
14
14
  const canGoBack = navigator.canGoBack();
@@ -135,12 +135,6 @@ exports[`componentsMap renders renders components map correctly 1`] = `
135
135
  getItemCount={[Function]}
136
136
  initialNumToRender={3}
137
137
  keyExtractor={[Function]}
138
- maintainVisibleContentPosition={
139
- {
140
- "autoscrollToTopThreshold": 10,
141
- "minIndexForVisible": 0,
142
- }
143
- }
144
138
  maxToRenderPerBatch={10}
145
139
  onContentSizeChange={[Function]}
146
140
  onLayout={[Function]}
@@ -165,6 +159,7 @@ exports[`componentsMap renders renders components map correctly 1`] = `
165
159
  >
166
160
  <View>
167
161
  <View
162
+ onFocusCapture={[Function]}
168
163
  onLayout={[Function]}
169
164
  style={null}
170
165
  >
@@ -180,6 +175,7 @@ exports[`componentsMap renders renders components map correctly 1`] = `
180
175
  </View>
181
176
  </View>
182
177
  <View
178
+ onFocusCapture={[Function]}
183
179
  onLayout={[Function]}
184
180
  style={null}
185
181
  >
@@ -1,20 +1,10 @@
1
1
  import React from "react";
2
- import { render, screen } from "@testing-library/react-native";
3
- import configureStore from "redux-mock-store";
2
+ import { screen } from "@testing-library/react-native";
4
3
  import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
5
- import { Provider } from "react-redux";
6
4
 
7
- import { River } from "../";
8
5
  import { ScreenResolver } from "../../ScreenResolver";
9
6
  import { RiverComponent } from "../River";
10
7
 
11
- jest.mock(
12
- "@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
13
- () => ({
14
- useIsScreenActive: jest.fn(() => true),
15
- })
16
- );
17
-
18
8
  jest.mock(
19
9
  "@applicaster/zapp-react-native-ui-components/Components/GeneralContentScreen",
20
10
  () => {
@@ -46,6 +36,13 @@ jest.mock(
46
36
  })
47
37
  );
48
38
 
39
+ jest.mock(
40
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
41
+ () => ({
42
+ useIsScreenActive: jest.fn(() => true),
43
+ })
44
+ );
45
+
49
46
  const river = {
50
47
  home: true,
51
48
  id: "A1234",
@@ -89,28 +86,17 @@ const riverProps = {
89
86
 
90
87
  const appData = { layoutVersion: "v1" };
91
88
 
92
- const store = configureStore()({ rivers, appData });
89
+ const store = { rivers, appData };
93
90
 
94
91
  describe("When River has a general_content type", () => {
95
92
  it("renders GeneralContentScreen correctly", () => {
96
- const { getByTestId } = render(
97
- <Provider store={store}>
98
- <RiverComponent {...riverProps} />
99
- </Provider>
93
+ const { getByTestId } = renderWithProviders(
94
+ <RiverComponent {...riverProps} />,
95
+ store
100
96
  );
101
97
 
102
98
  expect(getByTestId("general-content-screen")).toBeTruthy();
103
99
  });
104
-
105
- it("renders River component correctly", () => {
106
- const wrapper = render(
107
- <Provider store={store}>
108
- <River screenId="A1234" />
109
- </Provider>
110
- );
111
-
112
- expect(wrapper.toJSON()).toMatchSnapshot();
113
- });
114
100
  });
115
101
 
116
102
  describe("When River has any other type other than general_content", () => {
@@ -1,5 +1,5 @@
1
1
  import * as R from "ramda";
2
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
2
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
3
3
 
4
4
  import { withRiver } from "../../Decorators/RiverResolver";
5
5
  import { withNavigator } from "../../Decorators/Navigator";
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { act, create } from "react-test-renderer";
3
+ import { render } from "@testing-library/react-native";
4
4
 
5
5
  const Mocked_RouteManager = jest.fn((props) => (
6
6
  <View testID="routeManager" {...props} />
@@ -68,12 +68,33 @@ jest.mock(
68
68
  })
69
69
  );
70
70
 
71
+ jest.mock(
72
+ "@applicaster/zapp-react-native-utils/reactHooks/state/useRivers",
73
+ () => ({
74
+ useRivers: jest.fn(() => ({
75
+ rivers: [{ id: "testId", name: "Test River" }],
76
+ })),
77
+ })
78
+ );
79
+
71
80
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
72
81
  isNavBarVisible: mockIsNavBarVisible,
73
82
  useIsScreenActive: jest.fn().mockReturnValue(true),
83
+ useNavigation: jest.fn(() => ({
84
+ canGoBack: () => false,
85
+ currentRoute: "/river/testId",
86
+ activeRiver: { id: "testId" },
87
+ screenData: { id: "testId" },
88
+ data: { screen: { id: "testId" } },
89
+ })),
90
+ useRoute: jest.fn(() => ({
91
+ pathname: "/river/testId",
92
+ screenData: { id: "testId" },
93
+ })),
74
94
  }));
75
95
 
76
96
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
97
+ ...jest.requireActual("@applicaster/zapp-react-native-utils/reactHooks"),
77
98
  useCurrentScreenData: jest.fn(() => ({
78
99
  id: "testId",
79
100
  })),
@@ -84,17 +105,6 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
84
105
  id: "testId",
85
106
  navigations: [{ id: "testId", category: "nav_bar" }],
86
107
  })),
87
- useNavigation: jest.fn(() => ({
88
- canGoBack: () => false,
89
- currentRoute: "/river/testId",
90
- activeRiver: { id: "testId" },
91
- screenData: { id: "testId" },
92
- data: { screen: { id: "testId" } },
93
- })),
94
- useRoute: jest.fn(() => ({
95
- pathname: "/river/testId",
96
- screenData: { id: "testId" },
97
- })),
98
108
  useDimensions: jest.fn(() => ({
99
109
  width: 1920,
100
110
  height: 1080,
@@ -102,10 +112,11 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
102
112
  useIsTablet: jest.fn(() => false),
103
113
  }));
104
114
 
105
- jest.mock("@applicaster/zapp-react-native-redux/hooks/usePickFromState", () => {
115
+ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => {
106
116
  const View = jest.requireActual("react-native").View;
107
117
 
108
118
  return {
119
+ ...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
109
120
  usePickFromState: () => ({
110
121
  plugins: [
111
122
  {
@@ -141,8 +152,6 @@ const screenProps = {
141
152
  const { Screen } = require("..");
142
153
 
143
154
  describe("<Screen Component />", () => {
144
- let wrapper;
145
-
146
155
  beforeEach(() => {
147
156
  allowedOrientationsForScreen.mockClear();
148
157
  getOrientation.mockClear();
@@ -150,26 +159,16 @@ describe("<Screen Component />", () => {
150
159
  });
151
160
 
152
161
  describe("when the navbar should show", () => {
153
- act(() => {
154
- wrapper = create(<Screen {...screenProps} />);
155
- });
156
-
157
162
  it("renders correctly", () => {
158
- expect(wrapper.toJSON()).toMatchSnapshot();
163
+ const { toJSON } = render(<Screen {...screenProps} />);
164
+ expect(toJSON()).toMatchSnapshot();
159
165
  });
160
166
  });
161
167
 
162
168
  describe("when the navbar should be hidden", () => {
163
- beforeEach(() => {
164
- wrapper = create(<Screen {...screenProps} />);
165
- });
166
-
167
169
  it("renders correctly", () => {
168
- act(() => {
169
- wrapper = create(<Screen {...screenProps} />);
170
- });
171
-
172
- expect(wrapper.toJSON()).toMatchSnapshot();
170
+ const { toJSON } = render(<Screen {...screenProps} />);
171
+ expect(toJSON()).toMatchSnapshot();
173
172
  });
174
173
  });
175
174
  });
@@ -3,61 +3,172 @@ import { isMenuVisible } from "../navigationHandler";
3
3
  describe("NavigationHandler", () => {
4
4
  describe("isMenuVisible", () => {
5
5
  it("returns false when the route is a player route", () => {
6
- const menuVisible = isMenuVisible("/playable/some_vod_item", {});
6
+ const menuVisible = isMenuVisible("/playable/some_vod_item", {}, [
7
+ {
8
+ identifier: "quick-brick-bottom-tabs",
9
+ category: "menu",
10
+ name: "Bottom Tabs",
11
+ },
12
+ ]);
13
+
7
14
  expect(menuVisible).toBe(false);
8
15
  });
9
16
 
10
17
  describe("when screen is a hook", () => {
11
18
  it("returns true if the `showNavBar` flag is set to true", () => {
12
- const menuVisible = isMenuVisible("", {
13
- hookPlugin: {
14
- module: {
15
- showNavBar: true,
19
+ const menuVisible = isMenuVisible(
20
+ "",
21
+ {
22
+ hookPlugin: {
23
+ module: {
24
+ showNavBar: true,
25
+ },
16
26
  },
27
+ navigations: [
28
+ {
29
+ navigation_type: "quick-brick-bottom-tabs",
30
+ identifier: "quick-brick-bottom-tabs",
31
+ category: "menu",
32
+ name: "Bottom Tabs",
33
+ },
34
+ ],
17
35
  },
18
- });
36
+ [
37
+ {
38
+ identifier: "quick-brick-bottom-tabs",
39
+ category: "menu",
40
+ name: "Bottom Tabs",
41
+ },
42
+ ]
43
+ );
19
44
 
20
45
  expect(menuVisible).toBe(true);
21
46
  });
22
47
 
23
48
  it("returns true if presentFullScreen flag is set to false", () => {
24
- const menuVisible = isMenuVisible("", {
25
- hookPlugin: {
26
- module: {
27
- presentFullScreen: false,
49
+ const menuVisible = isMenuVisible(
50
+ "",
51
+ {
52
+ hookPlugin: {
53
+ module: {
54
+ presentFullScreen: false,
55
+ },
28
56
  },
57
+ navigations: [
58
+ {
59
+ navigation_type: "quick-brick-bottom-tabs",
60
+ identifier: "quick-brick-bottom-tabs",
61
+ category: "menu",
62
+ name: "Bottom Tabs",
63
+ },
64
+ ],
29
65
  },
30
- });
66
+ [
67
+ {
68
+ identifier: "quick-brick-bottom-tabs",
69
+ category: "menu",
70
+ name: "Bottom Tabs",
71
+ },
72
+ ]
73
+ );
31
74
 
32
75
  expect(menuVisible).toBe(true);
33
76
  });
34
77
 
35
78
  it("returns false if presentFullScreen flag is set to true", () => {
36
- const menuVisible = isMenuVisible("", {
37
- hookPlugin: {
38
- module: {
39
- presentFullScreen: true,
79
+ const menuVisible = isMenuVisible(
80
+ "",
81
+ {
82
+ hookPlugin: {
83
+ module: {
84
+ presentFullScreen: true,
85
+ },
40
86
  },
87
+ navigations: [
88
+ {
89
+ navigation_type: "quick-brick-bottom-tabs",
90
+ identifier: "quick-brick-bottom-tabs",
91
+ category: "menu",
92
+ name: "Bottom Tabs",
93
+ },
94
+ ],
41
95
  },
42
- });
96
+ [
97
+ {
98
+ identifier: "quick-brick-bottom-tabs",
99
+ category: "menu",
100
+ name: "Bottom Tabs",
101
+ },
102
+ ]
103
+ );
43
104
 
44
105
  expect(menuVisible).toBe(false);
45
106
  });
46
107
  });
47
108
 
48
109
  it("returns false if the screen's general settings allow screen presentation", () => {
49
- const menuVisible = isMenuVisible("", {
50
- general: {
51
- allow_screen_plugin_presentation: true,
110
+ const menuVisible = isMenuVisible(
111
+ "",
112
+ {
113
+ general: {
114
+ allow_screen_plugin_presentation: true,
115
+ },
116
+ navigations: [
117
+ {
118
+ navigation_type: "quick-brick-bottom-tabs",
119
+ identifier: "quick-brick-bottom-tabs",
120
+ category: "menu",
121
+ name: "Bottom Tabs",
122
+ },
123
+ ],
52
124
  },
53
- });
125
+ [
126
+ {
127
+ identifier: "quick-brick-bottom-tabs",
128
+ category: "menu",
129
+ name: "Bottom Tabs",
130
+ },
131
+ ]
132
+ );
54
133
 
55
134
  expect(menuVisible).toBe(false);
56
135
  });
57
136
 
58
- it("returns true otherwise", () => {
59
- const menuVisible = isMenuVisible("", {});
137
+ it("returns false otherwise", () => {
138
+ const menuVisible = isMenuVisible(
139
+ "any",
140
+ {
141
+ navigations: [
142
+ {
143
+ navigation_type: "quick-brick-bottom-tabs",
144
+ identifier: "quick-brick-bottom-tabs",
145
+ category: "menu",
146
+ name: "Bottom Tabs",
147
+ },
148
+ ],
149
+ },
150
+ [
151
+ {
152
+ identifier: "quick-brick-bottom-tabs",
153
+ category: "menu",
154
+ name: "Bottom Tabs",
155
+ },
156
+ ]
157
+ );
158
+
60
159
  expect(menuVisible).toBe(true);
61
160
  });
161
+
162
+ it("returns false otherwise", () => {
163
+ const menuVisible = isMenuVisible("", {}, [
164
+ {
165
+ identifier: "quick-brick-bottom-tabs",
166
+ category: "menu",
167
+ name: "Bottom Tabs",
168
+ },
169
+ ]);
170
+
171
+ expect(menuVisible).toBe(false);
172
+ });
62
173
  });
63
174
  });