@applicaster/zapp-react-native-ui-components 15.0.0-rc.98 → 15.1.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 (115) hide show
  1. package/Components/BaseFocusable/index.ios.ts +2 -12
  2. package/Components/Cell/FocusableWrapper.tsx +0 -3
  3. package/Components/Cell/TvOSCellComponent.tsx +0 -5
  4. package/Components/Focusable/Focusable.tsx +2 -4
  5. package/Components/Focusable/FocusableTvOS.tsx +1 -18
  6. package/Components/Focusable/__tests__/__snapshots__/FocusableTvOS.test.tsx.snap +0 -1
  7. package/Components/FocusableGroup/FocusableTvOS.tsx +1 -30
  8. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +39 -28
  9. package/Components/GeneralContentScreen/__tests__/GeneralContentScreen.test.tsx +104 -0
  10. package/Components/GeneralContentScreen/utils/__tests__/getScreenDataSource.test.ts +19 -0
  11. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +1 -1
  12. package/Components/GeneralContentScreen/utils/getScreenDataSource.ts +9 -0
  13. package/Components/HandlePlayable/HandlePlayable.tsx +24 -42
  14. package/Components/HandlePlayable/utils.ts +31 -0
  15. package/Components/HookRenderer/HookRenderer.tsx +40 -10
  16. package/Components/HookRenderer/__tests__/HookRenderer.test.tsx +60 -0
  17. package/Components/Layout/TV/LayoutBackground.tsx +2 -5
  18. package/Components/Layout/TV/ScreenContainer.tsx +6 -2
  19. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +5 -0
  20. package/Components/Layout/TV/index.tsx +4 -3
  21. package/Components/Layout/TV/index.web.tsx +4 -3
  22. package/Components/LinkHandler/LinkHandler.tsx +2 -2
  23. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +10 -4
  24. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +1 -5
  25. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +3 -11
  26. package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +1 -9
  27. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +14 -15
  28. package/Components/MasterCell/DefaultComponents/LiveImage/__tests__/prepareEntry.test.ts +352 -0
  29. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +136 -0
  30. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +34 -16
  31. package/Components/MasterCell/DefaultComponents/SecondaryImage/hooks/__tests__/useGetImageDimensions.test.ts +6 -7
  32. package/Components/MasterCell/DefaultComponents/Text/index.tsx +2 -6
  33. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +2 -6
  34. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/getPluginIdentifier.test.ts +11 -233
  35. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +15 -19
  36. package/Components/Navigator/StackNavigator.tsx +6 -0
  37. package/Components/OfflineHandler/NotificationView/NotificationView.tsx +2 -2
  38. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +18 -17
  39. package/Components/OfflineHandler/__tests__/index.test.tsx +18 -27
  40. package/Components/PlayerContainer/PlayerContainer.tsx +14 -32
  41. package/Components/PreloaderWrapper/__tests__/index.test.tsx +26 -0
  42. package/Components/PreloaderWrapper/index.tsx +15 -0
  43. package/Components/River/ComponentsMap/ComponentsMap.tsx +15 -0
  44. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +1 -1
  45. package/Components/River/RefreshControl.tsx +9 -3
  46. package/Components/River/RiverItem.tsx +26 -20
  47. package/Components/River/TV/River.tsx +14 -31
  48. package/Components/River/TV/index.tsx +4 -8
  49. package/Components/River/TV/withTVEventHandler.tsx +36 -0
  50. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -0
  51. package/Components/Screen/TV/index.web.tsx +2 -4
  52. package/Components/Screen/__tests__/Screen.test.tsx +43 -65
  53. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +44 -68
  54. package/Components/Screen/hooks.ts +76 -5
  55. package/Components/Screen/index.tsx +10 -3
  56. package/Components/Screen/orientationHandler.ts +3 -3
  57. package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +46 -0
  58. package/Components/ScreenFeedLoader/__tests__/ScreenFeedLoader.test.tsx +94 -0
  59. package/Components/ScreenFeedLoader/index.ts +1 -0
  60. package/Components/ScreenResolver/__tests__/screenResolver.test.js +24 -0
  61. package/Components/ScreenResolver/hooks/index.ts +3 -0
  62. package/Components/ScreenResolver/hooks/useGetComponent.ts +15 -0
  63. package/Components/ScreenResolver/hooks/useScreenComponentResolver.tsx +90 -0
  64. package/Components/ScreenResolver/index.tsx +9 -115
  65. package/Components/ScreenResolver/utils/__tests__/getScreenTypeProps.test.ts +45 -0
  66. package/Components/ScreenResolver/utils/getScreenTypeProps.ts +43 -0
  67. package/Components/ScreenResolver/utils/index.ts +1 -0
  68. package/Components/ScreenResolver/withDefaultScreenContext.tsx +16 -0
  69. package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +25 -0
  70. package/Components/ScreenResolverFeedProvider/__tests__/ScreenResolverFeedProvider.test.tsx +44 -0
  71. package/Components/ScreenResolverFeedProvider/index.ts +1 -0
  72. package/Components/ScreenRevealManager/ScreenRevealManager.ts +8 -40
  73. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +69 -86
  74. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +4 -1
  75. package/Components/Tabs/TabContent.tsx +4 -7
  76. package/Components/Transitioner/Scene.tsx +9 -15
  77. package/Components/Transitioner/index.js +3 -3
  78. package/Components/VideoLive/LiveImageManager.ts +199 -54
  79. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -33
  80. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +2 -17
  81. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +5 -5
  82. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +7 -15
  83. package/Components/VideoModal/utils.ts +9 -12
  84. package/Components/Viewport/ViewportEvents/__tests__/viewportEvents.test.js +1 -1
  85. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +6 -4
  86. package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +2 -2
  87. package/Components/ZappUIComponent/index.tsx +12 -6
  88. package/Components/index.js +1 -1
  89. package/Contexts/ScreenContext/__tests__/index.test.tsx +57 -0
  90. package/Contexts/ScreenContext/index.tsx +64 -26
  91. package/Contexts/ScreenTrackedViewPositionsContext/__tests__/index.test.tsx +1 -1
  92. package/Contexts/ZappPipesContext/ZappPipesContextFactory.tsx +18 -7
  93. package/Decorators/Analytics/index.tsx +5 -6
  94. package/Decorators/ConfigurationWrapper/__tests__/__snapshots__/withConfigurationProvider.test.tsx.snap +0 -1
  95. package/Decorators/ConfigurationWrapper/const.ts +0 -1
  96. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -7
  97. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +212 -5
  98. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +1 -1
  99. package/Decorators/ZappPipesDataConnector/index.tsx +2 -2
  100. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +1 -1
  101. package/Helpers/DataSourceHelper/index.js +19 -0
  102. package/events/index.ts +2 -0
  103. package/events/scrollEndReached.ts +15 -0
  104. package/package.json +5 -5
  105. package/Components/MasterCell/DefaultComponents/Text/utils/__tests__/withAdjustedLineHeight.test.ts +0 -46
  106. package/Components/MasterCell/DefaultComponents/Text/utils/index.ts +0 -21
  107. package/Components/PlayerContainer/ErrorDisplay/ErrorDisplay.tsx +0 -57
  108. package/Components/PlayerContainer/ErrorDisplay/index.ts +0 -9
  109. package/Components/PlayerContainer/useRestrictMobilePlayback.tsx +0 -101
  110. package/Components/River/TV/utils/__tests__/toStringOrEmpty.test.ts +0 -30
  111. package/Components/River/TV/utils/index.ts +0 -4
  112. package/Components/River/TV/withFocusableGroupForContent.tsx +0 -71
  113. package/Helpers/DataSourceHelper/__tests__/itemLimitForData.test.ts +0 -80
  114. package/Helpers/DataSourceHelper/index.ts +0 -19
  115. /package/Components/HookRenderer/{index.tsx → index.ts} +0 -0
@@ -1,71 +0,0 @@
1
- import * as React from "react";
2
- import { View, StyleSheet } from "react-native";
3
-
4
- import { FocusableGroup } from "@applicaster/zapp-react-native-ui-components/Components/FocusableGroup";
5
- import { riverFocusManager } from "@applicaster/zapp-react-native-utils/appUtils/RiverFocusManager";
6
-
7
- import { topMenuLayoutChange$ } from "@applicaster/zapp-react-native-tvos-app/Layout/topMenu";
8
-
9
- const styles = StyleSheet.create({
10
- flexOne: {
11
- flex: 1,
12
- },
13
- });
14
-
15
- export const withFocusableGroupForContent = (Component) => {
16
- return function WithFocusableGroupForContent(props) {
17
- const { screenId, isInsideContainer } = props;
18
-
19
- const [topMenuHeight, setTopMenuHeight] = React.useState(0);
20
-
21
- React.useEffect(() => {
22
- const subscription = topMenuLayoutChange$.subscribe((layout) => {
23
- setTopMenuHeight(layout.height);
24
- });
25
-
26
- return () => {
27
- subscription.unsubscribe();
28
- };
29
- }, []);
30
-
31
- const focusableId = React.useMemo(
32
- () =>
33
- riverFocusManager.screenFocusableGroupId({
34
- screenId,
35
- isInsideContainer,
36
- }),
37
- [screenId, isInsideContainer]
38
- );
39
-
40
- if (isInsideContainer) {
41
- return <Component {...props} />;
42
- }
43
-
44
- return (
45
- <FocusableGroup
46
- key={focusableId}
47
- id={focusableId}
48
- // The top menu is rendered in its own FocusableGroup, anchored at the top of the screen.
49
- // When the "content" FocusableGroup starts at y = 0 as well, the two groups visually overlap.
50
- // On TvOS platform this overlap can confuse the focus engine, because the focusable bounds of
51
- // the top-menu group and the content group intersect, leading to erratic navigation between
52
- // the menu and the content (e.g. unexpected jumps or focus getting "stuck").
53
- //
54
- // To avoid this, we shift the entire content FocusableGroup down by the dynamic top menu
55
- // height (marginTop: topMenuHeight). This separates the focus regions of the two groups in
56
- // focus space, so they no longer intersect.
57
- //
58
- // The inner <View> below then applies the inverse margin (marginTop: -topMenuHeight) so that
59
- // the actual visual position of the content on screen does not change; only the focusable
60
- // bounds of the outer group are offset.
61
- style={[styles.flexOne, { marginTop: topMenuHeight }]}
62
- // this group does not have parent
63
- groupId={undefined}
64
- >
65
- <View style={[styles.flexOne, { marginTop: -1 * topMenuHeight }]}>
66
- <Component {...props} groupId={focusableId} />
67
- </View>
68
- </FocusableGroup>
69
- );
70
- };
71
- };
@@ -1,80 +0,0 @@
1
- import { itemLimitForData } from "..";
2
-
3
- describe("itemLimitForData (no mocks)", () => {
4
- test("returns full array when item_limit is undefined (default Infinity)", () => {
5
- // @ts-ignore
6
- const result = itemLimitForData([1, 2, 3], {
7
- rules: { item_limit: undefined },
8
- });
9
-
10
- expect(result).toEqual([1, 2, 3]);
11
- });
12
-
13
- test("enforces positive numeric item_limit", () => {
14
- // @ts-ignore
15
- const result = itemLimitForData([1, 2, 3, 4], {
16
- rules: { item_limit: 2 },
17
- });
18
-
19
- expect(result).toEqual([1, 2]);
20
- });
21
-
22
- test("returns empty array when entry is empty", () => {
23
- const result = itemLimitForData([], {
24
- rules: { item_limit: 3 },
25
- });
26
-
27
- expect(result).toEqual([]);
28
- });
29
-
30
- test("defaults entry to empty array when it is undefined", () => {
31
- const result = itemLimitForData(undefined, {
32
- rules: { item_limit: 5 },
33
- });
34
-
35
- expect(result).toEqual([]);
36
- });
37
-
38
- test("handles missing component", () => {
39
- // @ts-ignore
40
- const result = itemLimitForData([10, 20, 30], undefined);
41
- // missing component → item_limit = undefined → fallback to Infinity
42
- expect(result).toEqual([10, 20, 30]);
43
- });
44
-
45
- test("handles missing rules object", () => {
46
- // @ts-ignore
47
- const result = itemLimitForData([10, 20, 30], {});
48
-
49
- expect(result).toEqual([10, 20, 30]);
50
- });
51
-
52
- test("non-positive item_limit should fall back to Infinity", () => {
53
- // @ts-ignore
54
- const result = itemLimitForData([1, 2, 3], {
55
- rules: { item_limit: -10 },
56
- });
57
-
58
- // -10 → invalid → fallback to Infinity → no limit
59
- expect(result).toEqual([1, 2, 3]);
60
- });
61
-
62
- test("zero item_limit should fall back to Infinity", () => {
63
- // @ts-ignore
64
- const result = itemLimitForData([1, 2, 3], {
65
- rules: { item_limit: 0 },
66
- });
67
-
68
- // 0 → invalid → fallback to Infinity
69
- expect(result).toEqual([1, 2, 3]);
70
- });
71
-
72
- test("NaN item_limit should fall back to Infinity", () => {
73
- // @ts-ignore
74
- const result = itemLimitForData([1, 2, 3], {
75
- rules: { item_limit: NaN },
76
- });
77
-
78
- expect(result).toEqual([1, 2, 3]);
79
- });
80
- });
@@ -1,19 +0,0 @@
1
- import { toPositiveNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
2
-
3
- export function itemLimitForData(
4
- entry: ZappEntry[],
5
- component: {
6
- rules?: { item_limit?: number | string };
7
- }
8
- ) {
9
- if (!component?.rules?.item_limit) {
10
- return entry;
11
- }
12
-
13
- const itemLimit = toPositiveNumberWithDefault(
14
- Infinity,
15
- component?.rules?.item_limit
16
- );
17
-
18
- return (entry || []).slice(0, itemLimit);
19
- }
File without changes