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

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 (166) 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 +22 -21
  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 +49 -47
  75. package/Components/River/ComponentsMap/ContextProviders/ComponentsMapHeightContext.ts +8 -0
  76. package/Components/River/ComponentsMap/ContextProviders/ComponentsMapRefContext.ts +8 -0
  77. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  78. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  79. package/Components/River/RefreshControl.tsx +11 -17
  80. package/Components/River/RiverItem.tsx +11 -8
  81. package/Components/River/TV/River.tsx +2 -17
  82. package/Components/River/TV/index.tsx +3 -1
  83. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  84. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  85. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  86. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -6
  87. package/Components/River/__tests__/river.test.js +12 -26
  88. package/Components/River/index.tsx +1 -1
  89. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  90. package/Components/Screen/__tests__/navigationHandler.test.ts +133 -22
  91. package/Components/Screen/navigationHandler.ts +20 -2
  92. package/Components/ScreenResolver/index.tsx +15 -0
  93. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  94. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  95. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  96. package/Components/ScreenRevealManager/index.ts +1 -0
  97. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  98. package/Components/Tabs/TV/Tabs.android.tsx +1 -3
  99. package/Components/Tabs/Tabs.tsx +2 -3
  100. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +13 -0
  101. package/Components/TextInputTv/index.tsx +11 -0
  102. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  103. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  104. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  105. package/Components/VideoLive/animationUtils.ts +3 -3
  106. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +6 -10
  107. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +294 -0
  108. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +93 -0
  109. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +73 -29
  110. package/Components/VideoModal/PlayerDetails.tsx +29 -7
  111. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  112. package/Components/VideoModal/VideoModal.tsx +3 -17
  113. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  114. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  115. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -180
  116. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +21 -51
  117. package/Components/VideoModal/hooks/index.ts +0 -2
  118. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +15 -1
  119. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  120. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +2 -2
  121. package/Components/VideoModal/hooks/utils/index.ts +4 -0
  122. package/Components/VideoModal/utils.ts +6 -0
  123. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  124. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  125. package/Components/Viewport/VisibilitySensor/VisibilitySensor.tsx +3 -3
  126. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/index.ts +3 -3
  127. package/Contexts/CellFocusedStateContext/index.tsx +27 -0
  128. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  129. package/Contexts/ScreenContext/index.tsx +46 -6
  130. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  131. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  132. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  133. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  134. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  135. package/Decorators/RiverFeedLoader/index.tsx +22 -4
  136. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +6 -10
  137. package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
  138. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  139. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  140. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  141. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  142. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  143. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  144. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  145. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  146. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  147. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  148. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +266 -0
  149. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  150. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  151. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  152. package/events/index.ts +3 -0
  153. package/package.json +5 -10
  154. package/Components/AudioPlayer/AudioPlayerLayout.tsx +0 -202
  155. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +0 -66
  156. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +0 -28
  157. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +0 -26
  158. package/Components/AudioPlayer/index.ts +0 -1
  159. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
  160. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
  161. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/Runtime.test.js +0 -0
  162. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/artWork.test.js.snap +0 -0
  163. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/artWork.test.js +0 -0
  164. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/channel.test.js +0 -0
  165. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/summary.test.js +0 -0
  166. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/title.test.js +0 -0
@@ -1,7 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { useEffect, useReducer } from "react";
3
- // @ts-ignore
4
- import { TVMenuControl, View, ViewStyle } from "react-native";
3
+ import { View, ViewStyle } from "react-native";
5
4
  import * as R from "ramda";
6
5
  import uuid from "uuid/v4";
7
6
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
@@ -62,6 +61,11 @@ import {
62
61
  useModalAnimationContext,
63
62
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
64
63
 
64
+ import {
65
+ PlayerNativeCommandTypes,
66
+ PlayerNativeSendCommand,
67
+ } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/playerNativeCommand";
68
+
65
69
  type Props = {
66
70
  Player: React.ComponentType<any>;
67
71
  PlayerLoadingView?: React.ComponentType<any>; // 👀 we are not receiving this prop
@@ -88,7 +92,7 @@ export const VideoModalMode = {
88
92
  MAXIMIZED: "MAXIMIZED",
89
93
  MINIMIZED: "MINIMIZED",
90
94
  FULLSCREEN: "FULLSCREEN",
91
- };
95
+ } as const;
92
96
 
93
97
  export type PlayNextData = {
94
98
  state: PlayNextState;
@@ -127,7 +131,7 @@ const webStyles = {
127
131
  playerScreen: {
128
132
  flex: 1,
129
133
  height: "100vh",
130
- background: "black",
134
+ backgroundColor: "black",
131
135
  },
132
136
  playerWrapper: {
133
137
  height: "100%",
@@ -135,9 +139,6 @@ const webStyles = {
135
139
  },
136
140
  inlineRiver: {
137
141
  height: INLINE_CONTAINER_CONTENT_HEIGHT,
138
-
139
- borderWidth: 4,
140
- borderColor: "yellow",
141
142
  },
142
143
  };
143
144
 
@@ -148,7 +149,6 @@ const nativeStyles = {
148
149
  },
149
150
  playerScreen: {
150
151
  flex: 1,
151
- backgroundColor: "black",
152
152
  overflow: "hidden",
153
153
  },
154
154
  playerWrapper: {
@@ -263,9 +263,15 @@ const PlayerContainerComponent = (props: Props) => {
263
263
  return;
264
264
  }
265
265
 
266
+ // send command to clear and stop player
267
+ PlayerNativeSendCommand(
268
+ PlayerNativeCommandTypes.clearPlayerData,
269
+ state.playerId
270
+ );
271
+
266
272
  showNavBar(true);
267
273
  navigator.goBack();
268
- }, [isModal, navigator.goBack, showNavBar]);
274
+ }, [isModal, navigator.goBack, state.playerId, showNavBar]);
269
275
 
270
276
  const playEntry = (entry) => navigator.replaceTop(entry, { mode });
271
277
 
@@ -393,13 +399,17 @@ const PlayerContainerComponent = (props: Props) => {
393
399
  }
394
400
  };
395
401
 
396
- const playerRemoteHandler = (event, isLanguageOverlayVisible) => {
397
- const { eventType } = event;
402
+ const playerRemoteHandler = React.useCallback(
403
+ (isLanguageOverlayVisible = false) =>
404
+ (event) => {
405
+ const { eventType } = event;
398
406
 
399
- if (!isLanguageOverlayVisible && eventType === "menu") {
400
- close();
401
- }
402
- };
407
+ if (!isLanguageOverlayVisible && eventType === "menu") {
408
+ close();
409
+ }
410
+ },
411
+ [close]
412
+ );
403
413
 
404
414
  // Effects
405
415
  useEffect(() => {
@@ -413,7 +423,10 @@ const PlayerContainerComponent = (props: Props) => {
413
423
  id: playerContainerId,
414
424
  listener: {
415
425
  onVideoEnd,
416
- onError,
426
+ onError: (err: Error) => {
427
+ // Adapt Error to the expected shape for onError
428
+ onError({ error: err });
429
+ },
417
430
  onLoad,
418
431
  onPlayerClose: close,
419
432
  onPlayerDetached: close,
@@ -512,16 +525,6 @@ const PlayerContainerComponent = (props: Props) => {
512
525
  }
513
526
  }, [isAudioContent]);
514
527
 
515
- // Needs to handle back button on Apple TV
516
- // https://github.com/facebook/react-native/issues/18930
517
- useEffect(() => {
518
- TVMenuControl?.enableTVMenuKey();
519
-
520
- return () => {
521
- TVMenuControl?.disableTVMenuKey();
522
- };
523
- }, []);
524
-
525
528
  useEffect(() => {
526
529
  playerEvent("source_changed", { item });
527
530
 
@@ -568,8 +571,9 @@ const PlayerContainerComponent = (props: Props) => {
568
571
  const isInlineTV = isInlineTVUtil(screenData);
569
572
 
570
573
  const inline =
571
- [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(mode) ||
572
- isInlineTV;
574
+ [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(
575
+ mode as any
576
+ ) || isInlineTV;
573
577
 
574
578
  const value = React.useMemo(
575
579
  () => ({ playerId: state.playerId }),
@@ -590,7 +594,11 @@ const PlayerContainerComponent = (props: Props) => {
590
594
  );
591
595
  }
592
596
 
593
- if (screen_background_color && mode !== VideoModalMode.FULLSCREEN) {
597
+ if (
598
+ screen_background_color &&
599
+ mode !== VideoModalMode.FULLSCREEN &&
600
+ isTV()
601
+ ) {
594
602
  updatedStyles.playerScreen.backgroundColor = screen_background_color;
595
603
  }
596
604
 
@@ -620,6 +628,8 @@ const PlayerContainerComponent = (props: Props) => {
620
628
  playNextData,
621
629
  };
622
630
 
631
+ const pointerEventsProp = mode === "MINIMIZED" ? "box-none" : "auto";
632
+
623
633
  return (
624
634
  <PlayerStateContext.Provider value={value}>
625
635
  <PlayerContainerContextProvider
@@ -630,9 +640,9 @@ const PlayerContainerComponent = (props: Props) => {
630
640
  <PlayerContainerContext.Consumer>
631
641
  {(context) => (
632
642
  <TVEventHandlerComponent
633
- tvEventHandler={(_component, event) =>
634
- playerRemoteHandler(event, context.isLanguageOverlayVisible)
635
- }
643
+ tvEventHandler={playerRemoteHandler(
644
+ context.isLanguageOverlayVisible
645
+ )}
636
646
  >
637
647
  <FocusableGroup
638
648
  id={FocusableGroupMainContainerId}
@@ -640,14 +650,17 @@ const PlayerContainerComponent = (props: Props) => {
640
650
  preferredFocus
641
651
  shouldUsePreferredFocus
642
652
  groupId={groupId}
653
+ pointerEvents={pointerEventsProp}
643
654
  >
644
655
  {/* Video player and components */}
645
656
  <View
646
657
  style={styles.playerScreen}
647
658
  testID={"player-screen-container"}
659
+ pointerEvents={pointerEventsProp}
648
660
  >
649
661
  {/* Player container */}
650
662
  <View
663
+ pointerEvents={pointerEventsProp}
651
664
  style={[
652
665
  styles.playerWrapper,
653
666
  // eslint-disable-next-line react-native/no-inline-styles, react-native/no-color-literals
@@ -719,7 +732,7 @@ const PlayerContainerComponent = (props: Props) => {
719
732
  key={item.id}
720
733
  groupId={FocusableGroupMainContainerId}
721
734
  cellTapAction={onCellTap}
722
- extraAnchorPointYOffset={-600}
735
+ extraAnchorPointYOffset={0}
723
736
  isScreenWrappedInContainer={true}
724
737
  containerHeight={styles.inlineRiver.height}
725
738
  componentsMapExtraProps={{
@@ -1,4 +1,4 @@
1
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
1
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
2
2
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
3
3
  import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
4
4
  import { transformColorCode as fixColorHexCode } from "@applicaster/zapp-react-native-utils/transform";
@@ -1,6 +1,6 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
3
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
4
4
  import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
5
5
 
6
6
  import { PlayerContainer as PlayerContainerComponent } from "./PlayerContainer";
@@ -28,7 +28,7 @@ const PlayerImageBackgroundComponent = ({
28
28
  defaultImageDimensions,
29
29
  }: Props) => {
30
30
  const source = React.useMemo(
31
- () => ({ uri: imageSrcFromMediaItem(entry, imageKey) }),
31
+ () => ({ uri: imageSrcFromMediaItem(entry, [imageKey]) }),
32
32
  [imageKey, entry]
33
33
  );
34
34
 
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as R from "ramda";
3
- import { View, StyleSheet, FlatList } from "react-native";
3
+ import { FlatList, StyleSheet, View } from "react-native";
4
4
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
5
5
  import { RiverItem } from "../RiverItem";
6
6
  import { RiverFooter } from "../RiverFooter";
@@ -9,8 +9,8 @@ import { useScreenConfiguration } from "../useScreenConfiguration";
9
9
  import { RefreshControl } from "../RefreshControl";
10
10
  import { ifEmptyUseFallback } from "@applicaster/zapp-react-native-utils/cellUtils";
11
11
  import {
12
- useProfilerLogging,
13
12
  usePipesCacheReset,
13
+ useProfilerLogging,
14
14
  } from "@applicaster/zapp-react-native-utils/reactHooks";
15
15
  import { useLoadingState } from "./hooks/useLoadingState";
16
16
  import { ViewportTracker } from "../../Viewport";
@@ -25,6 +25,8 @@ import { useScreenContextV2 } from "@applicaster/zapp-react-native-utils/reactHo
25
25
  import { useShallow } from "zustand/react/shallow";
26
26
 
27
27
  import { isAndroidPlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
28
+ import { ComponentsMapHeightContext } from "./ContextProviders/ComponentsMapHeightContext";
29
+ import { ComponentsMapRefContext } from "./ContextProviders/ComponentsMapRefContext";
28
30
 
29
31
  const isAndroid = isAndroidPlatform();
30
32
 
@@ -70,6 +72,7 @@ function ComponentsMapComponent(props: Props) {
70
72
  } = props;
71
73
 
72
74
  const flatListRef = React.useRef<FlatList | null>(null);
75
+ const flatListWrapperRef = React.useRef<View | null>(null);
73
76
  const screenConfig = useScreenConfiguration(riverId);
74
77
  const screenData = useScreenData(riverId);
75
78
  const pullToRefreshEnabled = screenData?.rules?.pull_to_refresh_enabled;
@@ -265,52 +268,51 @@ function ComponentsMapComponent(props: Props) {
265
268
  // The Screen Picker in Mobile is completly different than the TV
266
269
  // so the various offsets / margins in TV do not apply here.
267
270
  return (
268
- <View style={styles.container}>
269
- <ScreenLoadingMeasurements
270
- riverId={riverId}
271
- numberOfComponents={riverComponents.length}
272
- >
273
- <ViewportTracker>
274
- <FlatList
275
- ref={(ref) => {
276
- flatListRef.current = ref;
277
- }}
278
- // Fix for WebView rerender crashes on Android API 28+
279
- // https://github.com/react-native-webview/react-native-webview/issues/1915#issuecomment-964035468
280
- overScrollMode={isAndroid ? "never" : "auto"}
281
- scrollIndicatorInsets={scrollIndicatorInsets}
282
- extraData={feed}
283
- stickyHeaderIndices={stickyHeaderIndices}
284
- onLayout={handleOnLayout}
285
- removeClippedSubviews={isAndroid}
286
- initialNumToRender={3}
287
- maxToRenderPerBatch={10}
288
- windowSize={12}
289
- listKey={riverId}
290
- keyExtractor={keyExtractor}
291
- renderItem={renderRiverItem}
292
- data={riverComponents}
293
- contentContainerStyle={contentContainerStyle}
294
- ListFooterComponent={
295
- <RiverFooter
296
- flatListHeight={flatListHeight}
297
- loadingState={loadingState}
271
+ <View style={styles.container} ref={flatListWrapperRef}>
272
+ <ComponentsMapHeightContext.Provider value={flatListHeight}>
273
+ <ComponentsMapRefContext.Provider value={flatListWrapperRef}>
274
+ <ScreenLoadingMeasurements
275
+ riverId={riverId}
276
+ numberOfComponents={riverComponents.length}
277
+ >
278
+ <ViewportTracker>
279
+ <FlatList
280
+ ref={(ref) => {
281
+ flatListRef.current = ref;
282
+ }}
283
+ // Fix for WebView rerender crashes on Android API 28+
284
+ // https://github.com/react-native-webview/react-native-webview/issues/1915#issuecomment-964035468
285
+ overScrollMode={isAndroid ? "never" : "auto"}
286
+ scrollIndicatorInsets={scrollIndicatorInsets}
287
+ extraData={feed}
288
+ stickyHeaderIndices={stickyHeaderIndices}
289
+ removeClippedSubviews={isAndroid}
290
+ onLayout={handleOnLayout}
291
+ initialNumToRender={3}
292
+ maxToRenderPerBatch={10}
293
+ windowSize={12}
294
+ keyExtractor={keyExtractor}
295
+ renderItem={renderRiverItem}
296
+ data={riverComponents}
297
+ contentContainerStyle={contentContainerStyle}
298
+ ListFooterComponent={
299
+ <RiverFooter
300
+ flatListHeight={flatListHeight}
301
+ loadingState={loadingState}
302
+ />
303
+ }
304
+ refreshControl={refreshControl}
305
+ onScrollBeginDrag={onScrollBeginDrag}
306
+ onScroll={onScroll}
307
+ onMomentumScrollEnd={_onMomentumScrollEnd}
308
+ onScrollEndDrag={_onScrollEndDrag}
309
+ scrollEventThrottle={16}
310
+ {...scrollViewExtraProps}
298
311
  />
299
- }
300
- refreshControl={refreshControl}
301
- onScrollBeginDrag={onScrollBeginDrag}
302
- onScroll={onScroll}
303
- onMomentumScrollEnd={_onMomentumScrollEnd}
304
- onScrollEndDrag={_onScrollEndDrag}
305
- scrollEventThrottle={16}
306
- maintainVisibleContentPosition={{
307
- minIndexForVisible: 0,
308
- autoscrollToTopThreshold: 10,
309
- }}
310
- {...scrollViewExtraProps}
311
- />
312
- </ViewportTracker>
313
- </ScreenLoadingMeasurements>
312
+ </ViewportTracker>
313
+ </ScreenLoadingMeasurements>
314
+ </ComponentsMapRefContext.Provider>
315
+ </ComponentsMapHeightContext.Provider>
314
316
  </View>
315
317
  );
316
318
  }
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+
3
+ export const ComponentsMapHeightContext = React.createContext<number | null>(
4
+ null
5
+ );
6
+
7
+ export const useComponentsMapHeight = () =>
8
+ React.useContext(ComponentsMapHeightContext);
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import { View } from "react-native";
3
+
4
+ export const ComponentsMapRefContext =
5
+ React.createContext<React.RefObject<View | null> | null>(null);
6
+
7
+ export const useComponentsMapRef = () =>
8
+ React.useContext(ComponentsMapRefContext);