@applicaster/zapp-react-native-ui-components 12.0.5 → 13.0.0-alpha.1035032144

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 (105) hide show
  1. package/Components/AppContainer/__tests__/__snapshots__/AppContainer.test.js.snap +1 -1
  2. package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
  3. package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
  4. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +6 -6
  5. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +7 -7
  6. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
  7. package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
  8. package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
  9. package/Components/Cell/Cell.tsx +4 -8
  10. package/Components/Cell/CellWithFocusable.tsx +60 -44
  11. package/Components/Cell/TvOSCellComponent.tsx +3 -8
  12. package/Components/Cell/__tests__/CellWIthFocusable.test.js +6 -13
  13. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +20 -20
  14. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +5 -3
  15. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +5 -5
  16. package/Components/ComponentResolver/__tests__/componentResolver.test.js +11 -9
  17. package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
  18. package/Components/Focusable/FocusableTvOS.tsx +1 -1
  19. package/Components/FocusableList/index.tsx +0 -1
  20. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +9 -0
  21. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  22. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +1 -0
  23. package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
  24. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -3
  25. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +9 -9
  26. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  27. package/Components/Layout/TV/__tests__/index.test.tsx +7 -3
  28. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +66 -0
  29. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
  30. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -11
  31. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
  32. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
  33. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  34. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  35. package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
  36. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +7 -7
  37. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +34 -34
  38. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  39. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
  40. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  41. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
  42. package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
  43. package/Components/PlayerContainer/PlayerContainer.tsx +5 -11
  44. package/Components/River/ComponentsMap/ComponentsMap.tsx +39 -65
  45. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  46. package/Components/River/RefreshControl.tsx +1 -1
  47. package/Components/River/RiverFooter.tsx +39 -9
  48. package/Components/River/RiverItem.tsx +37 -2
  49. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +114 -45
  50. package/Components/River/__tests__/__snapshots__/river.test.js.snap +12 -12
  51. package/Components/River/__tests__/componentsMap.test.js +64 -17
  52. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -1
  53. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +1 -1
  54. package/Components/Screen/__tests__/Screen.test.tsx +41 -27
  55. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
  56. package/Components/Screen/hooks.ts +56 -0
  57. package/Components/Screen/index.tsx +13 -39
  58. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +2 -2
  59. package/Components/ScreenResolver/__tests__/screenResolver.test.js +31 -27
  60. package/Components/Tabs/Tab.tsx +1 -0
  61. package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
  62. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
  63. package/Components/TextInputTv/index.tsx +2 -2
  64. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
  65. package/Components/Transitioner/Scene.tsx +52 -23
  66. package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
  67. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +62 -46
  68. package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
  69. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +4 -4
  70. package/Components/Transitioner/index.js +8 -4
  71. package/Components/VideoLive/PlayerLiveImageComponent.tsx +5 -2
  72. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +14 -9
  73. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +5 -10
  74. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +1 -1
  75. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -10
  76. package/Components/VideoModal/ModalAnimation/index.ts +2 -1
  77. package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
  78. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
  79. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +12 -9
  80. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
  81. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +66 -66
  82. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +89 -0
  83. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +1 -1
  84. package/Components/VideoModal/utils.ts +2 -4
  85. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +2 -2
  86. package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
  87. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +11 -11
  88. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +30 -30
  89. package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
  90. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +2 -2
  91. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
  92. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
  93. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
  94. package/Decorators/RiverFeedLoader/index.tsx +1 -1
  95. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
  96. package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
  97. package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
  98. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +5 -5
  99. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +16 -10
  100. package/Decorators/ZappPipesDataConnector/index.tsx +32 -2
  101. package/README.md +1 -13
  102. package/package.json +12 -6
  103. package/Components/Cell/CellWithFocusable.ios.tsx +0 -126
  104. package/Decorators/RiverFeedLoader/utils.ts +0 -100
  105. /package/Decorators/Analytics/{index.js → index.tsx} +0 -0
@@ -16,6 +16,15 @@ import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Co
16
16
  import { Provider } from "react-redux";
17
17
  import configureStore from "redux-mock-store";
18
18
 
19
+ jest.mock(
20
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
21
+ () => ({
22
+ useRoute: jest.fn().mockReturnValue({
23
+ pathname: "/home",
24
+ }),
25
+ })
26
+ );
27
+
19
28
  const homeStack = {
20
29
  route: "/home",
21
30
  state: {
@@ -9,7 +9,7 @@ import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
9
9
  import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
10
10
  import { Categories } from "./logger";
11
11
  import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
12
- import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
12
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
13
13
  import {
14
14
  ZappPipesEntryContext,
15
15
  ZappPipesScreenContext,
@@ -39,6 +39,7 @@ jest.mock(
39
39
  );
40
40
 
41
41
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
42
+ ...jest.requireActual<any>("@applicaster/zapp-react-native-utils/theme"),
42
43
  useTheme: () => ({}),
43
44
  }));
44
45
 
@@ -3,7 +3,7 @@
3
3
  exports[`LayoutContainer renders 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "flex": 1,
8
8
  "height": 1080,
9
9
  "width": 1920,
@@ -3,14 +3,14 @@
3
3
  exports[`NavBarContainer renders 1`] = `
4
4
  <View
5
5
  style={
6
- Array [
7
- Object {
6
+ [
7
+ {
8
8
  "position": "absolute",
9
9
  "top": 0,
10
10
  "width": 1920,
11
11
  "zIndex": 10,
12
12
  },
13
- Object {
13
+ {
14
14
  "maxHeight": 10,
15
15
  },
16
16
  ]
@@ -4,8 +4,8 @@ exports[`ScreenContainer renders 1`] = `
4
4
  <RNCSafeAreaProvider
5
5
  onInsetsChange={[Function]}
6
6
  style={
7
- Array [
8
- Object {
7
+ [
8
+ {
9
9
  "flex": 1,
10
10
  },
11
11
  undefined,
@@ -14,14 +14,14 @@ exports[`ScreenContainer renders 1`] = `
14
14
  >
15
15
  <View
16
16
  style={
17
- Array [
18
- Object {
17
+ [
18
+ {
19
19
  "position": "absolute",
20
20
  "top": 0,
21
21
  "width": 1920,
22
22
  "zIndex": 10,
23
23
  },
24
- Object {
24
+ {
25
25
  "maxHeight": 10,
26
26
  },
27
27
  ]
@@ -30,7 +30,7 @@ exports[`ScreenContainer renders 1`] = `
30
30
  >
31
31
  <View
32
32
  isVisible={true}
33
- menuPlugin={Object {}}
33
+ menuPlugin={{}}
34
34
  navigationProps={null}
35
35
  />
36
36
  </View>
@@ -38,13 +38,13 @@ exports[`ScreenContainer renders 1`] = `
38
38
  `;
39
39
 
40
40
  exports[`ScreenContainer sets margins provided by the theme 1`] = `
41
- Array [
42
- Object {
41
+ [
42
+ {
43
43
  "flex": 1,
44
44
  "height": "100%",
45
45
  "width": "100%",
46
46
  },
47
- Object {
47
+ {
48
48
  "backgroundColor": "transparent",
49
49
  "marginBottom": 10,
50
50
  "paddingBottom": 0,
@@ -8,7 +8,7 @@ exports[`Layout TV renders 1`] = `
8
8
  >
9
9
  <View
10
10
  Components={
11
- Object {
11
+ {
12
12
  "Background": [Function],
13
13
  "NavBar": [Function],
14
14
  }
@@ -8,9 +8,13 @@ import configureStore from "redux-mock-store";
8
8
 
9
9
  const withoutChildren = omit(["children"]);
10
10
 
11
- jest.mock("../../../Screen/TV/index.web", () => ({
12
- Screen: View,
13
- }));
11
+ jest.mock("../../../Screen/TV/index.web", () => {
12
+ const View = jest.requireActual("react-native").View;
13
+
14
+ return {
15
+ Screen: View,
16
+ };
17
+ });
14
18
 
15
19
  const Layout = require("../index.web").default;
16
20
 
@@ -0,0 +1,66 @@
1
+ import {
2
+ BorderContainerView,
3
+ getBorderPadding, // Export for testing (using a double underscore prefix is a common convention)
4
+ } from "../index";
5
+ import * as React from "react";
6
+ import { render } from "@testing-library/react-native";
7
+ import { toNumberWithDefaultZero } from "@applicaster/zapp-react-native-utils/numberUtils";
8
+ import { View } from "react-native";
9
+
10
+ jest.mock("@applicaster/zapp-react-native-utils/numberUtils", () => ({
11
+ toNumberWithDefaultZero: jest.fn((value) => Number(value) || 0),
12
+ }));
13
+
14
+ describe("BorderContainerView", () => {
15
+ describe("getBorderPadding", () => {
16
+ it("returns 0 for inside", () => {
17
+ expect(getBorderPadding("inside", 10)).toBe(0);
18
+ });
19
+
20
+ it("returns borderWidth / 2 for center", () => {
21
+ expect(getBorderPadding("center", 10)).toBe(5);
22
+ });
23
+
24
+ it("returns borderWidth for outside", () => {
25
+ expect(getBorderPadding("outside", 10)).toBe(10);
26
+ });
27
+
28
+ it("returns borderWidth for invalid position", () => {
29
+ // @ts-ignore
30
+ expect(getBorderPadding("other_value", 10)).toBe(10);
31
+ });
32
+ });
33
+
34
+ it("Border component renders null if no borderPosition", () => {
35
+ const style = { borderWidth: 5, borderRadius: 10, borderColor: "red" };
36
+
37
+ const padding = {
38
+ paddingTop: 2,
39
+ paddingRight: 3,
40
+ paddingBottom: 4,
41
+ paddingLeft: 5,
42
+ };
43
+
44
+ const borderPosition = null;
45
+
46
+ const { queryByTestId } = render(
47
+ <BorderContainerView
48
+ style={style}
49
+ testID="border-container"
50
+ borderPosition={borderPosition}
51
+ borderPaddingTop={toNumberWithDefaultZero(padding.paddingTop)}
52
+ borderPaddingRight={toNumberWithDefaultZero(padding.paddingRight)}
53
+ borderPaddingBottom={toNumberWithDefaultZero(padding.paddingBottom)}
54
+ borderPaddingLeft={toNumberWithDefaultZero(padding.paddingLeft)}
55
+ >
56
+ <View testID="child" />
57
+ </BorderContainerView>
58
+ );
59
+
60
+ const children = queryByTestId("border-container").children;
61
+
62
+ expect(children[1].props.testID).toBe("child");
63
+
64
+ expect(children[0].children.length).toBe(0);
65
+ });
66
+ });
@@ -28,7 +28,10 @@ const styles = StyleSheet.create({
28
28
  },
29
29
  });
30
30
 
31
- const getBorderPadding = (borderPosition: BorderPosition, borderWidth) => {
31
+ export const getBorderPadding = (
32
+ borderPosition: BorderPosition,
33
+ borderWidth: number
34
+ ) => {
32
35
  switch (borderPosition) {
33
36
  case "inside":
34
37
  return 0;
@@ -38,22 +38,16 @@ function Image({
38
38
 
39
39
  const shouldRenderImg = source && !error;
40
40
 
41
- // Default placeholder image fallback is empty string because it won't rerender
42
- // in case of undefined or {uri: undefined} source
43
- // https://github.com/facebook/react-native/issues/9195
44
- const defaultPlaceHolderImage = React.useMemo(
45
- () => ({ uri: placeholderImage || "" }),
46
- [source, error]
47
- );
41
+ const _source = shouldRenderImg
42
+ ? withDimensions(source)
43
+ : { uri: placeholderImage };
48
44
 
49
45
  return (
50
- // @ts-ignore
51
46
  <MemoizedImage
52
47
  style={style as ImageStyle}
53
48
  onError={React.useCallback(() => setErrorState(true), [])}
54
- source={
55
- shouldRenderImg ? withDimensions(source) : defaultPlaceHolderImage
56
- }
49
+ // as we have defaults as "" for placeholder image, we need to pass undefined to source to not throw warnings
50
+ source={_source?.uri ? _source : undefined}
57
51
  {...R.omit(["source"], otherProps)}
58
52
  />
59
53
  );
@@ -0,0 +1,93 @@
1
+ import { ImageBorderContainer } from "../index";
2
+ import { getImageContainerMarginStyles } from "@applicaster/zapp-react-native-utils/cellUtils";
3
+
4
+ const mockValue = (key) => {
5
+ const values = {
6
+ cell_padding_top: 1,
7
+ cell_padding_left: 2,
8
+ cell_padding_right: 3,
9
+ cell_padding_bottom: 4,
10
+ image_border_size: 5,
11
+ image_focused_border_color: "red",
12
+ image_selected_border_color: "blue",
13
+ image_focused_selected_border_color: "green",
14
+ image_border_color: "black",
15
+ image_corner_radius: 10,
16
+ image_border_position: "outside",
17
+ image_border_padding_top: 6,
18
+ image_border_padding_right: 7,
19
+ image_border_padding_bottom: 8,
20
+ image_border_padding_left: 9,
21
+ image_margin_top: 11,
22
+ image_margin_left: 12,
23
+ image_margin_right: 13,
24
+ image_margin_bottom: 14,
25
+ };
26
+
27
+ return values[key] || 0;
28
+ };
29
+
30
+ describe("ImageBorderContainer", () => {
31
+ it("calculates style properties correctly", () => {
32
+ const marginStyles = getImageContainerMarginStyles({ value: mockValue });
33
+
34
+ expect(marginStyles.marginTop).toBe(11);
35
+ expect(marginStyles.marginLeft).toBe(12);
36
+ expect(marginStyles.marginRight).toBe(13);
37
+ expect(marginStyles.marginBottom).toBe(14);
38
+
39
+ const props = {
40
+ value: mockValue,
41
+ state: "default",
42
+ imageStyles: {},
43
+ };
44
+
45
+ const result = ImageBorderContainer(props);
46
+
47
+ expect(result.style.marginTop).toBe(12); // 11 + 1
48
+ expect(result.style.marginLeft).toBe(14); // 12 + 2
49
+ expect(result.style.marginRight).toBe(16); // 13 + 3
50
+ expect(result.style.marginBottom).toBe(18); // 14 + 4
51
+ expect(result.style.borderWidth).toBe(5);
52
+ expect(result.style.borderColor).toBe("black");
53
+ expect(result.style.borderRadius).toBe(10);
54
+ expect(result.additionalProps.borderPosition).toBe("outside");
55
+ expect(result.additionalProps.borderPaddingTop).toBe(6);
56
+ expect(result.additionalProps.borderPaddingRight).toBe(7);
57
+ expect(result.additionalProps.borderPaddingBottom).toBe(8);
58
+ expect(result.additionalProps.borderPaddingLeft).toBe(9);
59
+ });
60
+
61
+ it("handles focused state correctly", () => {
62
+ const props = {
63
+ value: mockValue,
64
+ state: "focused",
65
+ imageStyles: {},
66
+ };
67
+
68
+ const result = ImageBorderContainer(props);
69
+ expect(result.style.borderColor).toBe("red");
70
+ });
71
+
72
+ it("handles selected state correctly", () => {
73
+ const props = {
74
+ value: mockValue,
75
+ state: "selected",
76
+ imageStyles: {},
77
+ };
78
+
79
+ const result = ImageBorderContainer(props);
80
+ expect(result.style.borderColor).toBe("blue");
81
+ });
82
+
83
+ it("handles focused and selected state correctly", () => {
84
+ const props = {
85
+ value: mockValue,
86
+ state: "focused_selected",
87
+ imageStyles: {},
88
+ };
89
+
90
+ const result = ImageBorderContainer(props);
91
+ expect(result.style.borderColor).toBe("green");
92
+ });
93
+ });
@@ -6,7 +6,7 @@ exports[`SecondaryImage - Image SecondaryImage should render if known dimensions
6
6
  <View
7
7
  onLayout={[Function]}
8
8
  style={
9
- Object {
9
+ {
10
10
  "borderRadius": 10,
11
11
  "height": 100,
12
12
  "width": 100,
@@ -16,12 +16,12 @@ exports[`SecondaryImage - Image SecondaryImage should render if known dimensions
16
16
  <Image
17
17
  onAsyncRender={[Function]}
18
18
  source={
19
- Object {
19
+ {
20
20
  "uri": "",
21
21
  }
22
22
  }
23
23
  style={
24
- Object {
24
+ {
25
25
  "aspectRatio": 1,
26
26
  "borderRadius": 10,
27
27
  "height": 100,
@@ -39,6 +39,6 @@ describe("image with no source", () => {
39
39
  );
40
40
 
41
41
  const testInstance = testRenderer.root;
42
- expect(testInstance.findByType(Image).props.source).toEqual({ uri: "" });
42
+ expect(testInstance.findByType(Image).props.source).toBeUndefined();
43
43
  });
44
44
  });
@@ -3,7 +3,7 @@
3
3
  exports[`CollapsibleTextContainer render container+children when label is presented 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "backgroundColor": "#000000",
8
8
  }
9
9
  }