@applicaster/zapp-react-native-ui-components 13.0.0-alpha.2761483533 → 13.0.0-alpha.2807014304

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 (144) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
  3. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  4. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +54 -111
  5. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +36 -20
  6. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  7. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  8. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  9. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  10. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  11. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  12. package/Components/AudioPlayer/helpers.tsx +1 -0
  13. package/Components/BaseFocusable/index.ios.ts +1 -1
  14. package/Components/BaseFocusable/index.tsx +2 -3
  15. package/Components/Cell/Cell.tsx +4 -13
  16. package/Components/Cell/CellWithFocusable.tsx +48 -59
  17. package/Components/Cell/CellWrapper.ts +5 -0
  18. package/Components/Cell/TvOSCellComponent.tsx +20 -22
  19. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  20. package/Components/Cell/index.js +3 -1
  21. package/Components/Cell/styles.ts +17 -0
  22. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +46 -48
  23. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  24. package/Components/ComponentResolver/__tests__/componentResolver.test.js +16 -22
  25. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  26. package/Components/ErrorScreen/index.tsx +14 -6
  27. package/Components/Focusable/Focusable.tsx +1 -0
  28. package/Components/Focusable/FocusableTvOS.tsx +5 -1
  29. package/Components/Focusable/Touchable.tsx +19 -20
  30. package/Components/Focusable/index.android.tsx +10 -3
  31. package/Components/FocusableCell/index.tsx +1 -1
  32. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
  33. package/Components/FocusableGroup/index.tsx +0 -3
  34. package/Components/FocusableList/index.tsx +26 -9
  35. package/Components/FocusableScrollView/index.tsx +43 -13
  36. package/Components/HandlePlayable/HandlePlayable.tsx +14 -27
  37. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  38. package/Components/Layout/TV/ScreenContainer.tsx +8 -1
  39. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  40. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +2 -1
  41. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -2
  42. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +3 -2
  43. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  44. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +66 -0
  45. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
  46. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +9 -14
  47. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
  48. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
  49. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  50. package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
  51. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  52. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  53. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +4 -12
  54. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +0 -229
  55. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  56. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  57. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  58. package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
  59. package/Components/MasterCell/utils/index.ts +9 -135
  60. package/Components/ModalComponent/Button/assets.ts +1 -1
  61. package/Components/ModalComponent/Button/index.tsx +6 -6
  62. package/Components/ModalComponent/Header/index.tsx +3 -3
  63. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  64. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  65. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  66. package/Components/OfflineHandler/utils/index.ts +1 -1
  67. package/Components/PlayerContainer/PlayerContainer.tsx +17 -13
  68. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  69. package/Components/PlayerImageBackground/index.tsx +1 -1
  70. package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
  71. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  72. package/Components/River/RiverFooter.tsx +39 -9
  73. package/Components/River/RiverItem.tsx +37 -2
  74. package/Components/River/TV/index.tsx +6 -1
  75. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +100 -31
  76. package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
  77. package/Components/River/__tests__/componentsMap.test.js +3 -4
  78. package/Components/River/__tests__/river.test.js +75 -40
  79. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +11 -4
  80. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  81. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  82. package/Components/Screen/TV/index.web.tsx +5 -6
  83. package/Components/Screen/hooks.ts +53 -0
  84. package/Components/Screen/index.tsx +16 -42
  85. package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
  86. package/Components/Tabs/Tab.tsx +11 -9
  87. package/Components/TextInputTv/index.tsx +4 -3
  88. package/Components/TrackedView/index.tsx +1 -0
  89. package/Components/Transitioner/AnimationManager.js +15 -15
  90. package/Components/Transitioner/Scene.tsx +53 -24
  91. package/Components/Transitioner/Transitioner.tsx +3 -3
  92. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  93. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +9 -49
  94. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
  95. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  96. package/Components/Transitioner/index.js +8 -4
  97. package/Components/VideoLive/LiveImageManager.ts +27 -1
  98. package/Components/VideoLive/PlayerLiveImageComponent.tsx +18 -8
  99. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -5
  100. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
  101. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +44 -30
  102. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
  103. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +31 -17
  104. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -5
  105. package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
  106. package/Components/VideoModal/PlayerDetails.tsx +9 -6
  107. package/Components/VideoModal/PlayerWrapper.tsx +2 -2
  108. package/Components/VideoModal/VideoModal.tsx +2 -2
  109. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  110. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  111. package/Components/Viewport/__tests__/utils.test.js +5 -4
  112. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  113. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  114. package/Components/ZappUIComponent/index.tsx +3 -16
  115. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  116. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  117. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  118. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
  119. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  120. package/Contexts/ScreenContext/index.tsx +6 -12
  121. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  122. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  123. package/Decorators/Navigator/index.tsx +1 -1
  124. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
  125. package/Decorators/RiverResolver/index.tsx +6 -8
  126. package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
  127. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  128. package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
  129. package/package.json +7 -11
  130. package/tsconfig.json +2 -3
  131. package/.babelrc +0 -8
  132. package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
  133. package/Components/Cell/CellStyles/Hero/index.js +0 -111
  134. package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
  135. package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
  136. package/Components/Cell/CellStyles/colors.js +0 -40
  137. package/Components/Cell/CellStyles/index.js +0 -15
  138. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  139. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  140. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  141. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  142. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  143. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  144. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -5,13 +5,14 @@ exports[`NavBarContainer renders 1`] = `
5
5
  style={
6
6
  [
7
7
  {
8
+ "flex": 1,
8
9
  "position": "absolute",
9
10
  "top": 0,
10
- "width": 1920,
11
+ "width": "100%",
11
12
  "zIndex": 10,
12
13
  },
13
14
  {
14
- "maxHeight": 10,
15
+ "maxHeight": 1,
15
16
  },
16
17
  ]
17
18
  }
@@ -16,13 +16,14 @@ exports[`ScreenContainer renders 1`] = `
16
16
  style={
17
17
  [
18
18
  {
19
+ "flex": 1,
19
20
  "position": "absolute",
20
21
  "top": 0,
21
- "width": 1920,
22
+ "width": "100%",
22
23
  "zIndex": 10,
23
24
  },
24
25
  {
25
- "maxHeight": 10,
26
+ "maxHeight": 1,
26
27
  },
27
28
  ]
28
29
  }
@@ -4,7 +4,6 @@ import { TouchableOpacity, ViewStyle } from "react-native";
4
4
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
5
5
 
6
6
  import Image from "./Image";
7
-
8
7
  type Props = {
9
8
  item: ZappEntry | ZappFeed;
10
9
  flavour?: "flavour_1" | "flavour_2";
@@ -69,7 +68,7 @@ export function ActionButton(props: Props) {
69
68
  if (!((actionDisabled || !actionContext) && actionState !== null)) {
70
69
  setActionState(actionContext.initialEntryState(item));
71
70
  }
72
- }, [actionDisabled, item?.id, actionContext, action]);
71
+ }, [actionDisabled, item?.id, actionContext, action, setActionState]);
73
72
 
74
73
  const onPress = useCallback(() => {
75
74
  actionContext.invokeAction(item, {
@@ -85,7 +84,7 @@ export function ActionButton(props: Props) {
85
84
  setActionState(state);
86
85
  });
87
86
  }
88
- }, [item?.id]);
87
+ }, [item?.id, setActionState, actionContext]);
89
88
 
90
89
  if (actionDisabled || !actionContext) return null;
91
90
  const AssetComponent = actionState?.asset;
@@ -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;
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { Image as RnImage, ImageStyle } from "react-native";
3
- import * as R from "ramda";
3
+ import { equals, omit } from "ramda";
4
4
 
5
5
  import { useImageSource } from "./hooks";
6
6
 
@@ -17,7 +17,7 @@ type Props = Record<string, any> & {
17
17
  withDimensions: (source: Source) => Source;
18
18
  };
19
19
 
20
- const MemoizedImage = React.memo(RnImage, R.equals);
20
+ const MemoizedImage = React.memo(RnImage, equals);
21
21
 
22
22
  function Image({
23
23
  style,
@@ -38,23 +38,18 @@ 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
47
+ key={_source?.uri || "no-image"}
52
48
  style={style as ImageStyle}
53
49
  onError={React.useCallback(() => setErrorState(true), [])}
54
- source={
55
- shouldRenderImg ? withDimensions(source) : defaultPlaceHolderImage
56
- }
57
- {...R.omit(["source"], otherProps)}
50
+ // as we have defaults as "" for placeholder image, we need to pass undefined to source to not throw warnings
51
+ source={_source?.uri ? _source : undefined}
52
+ {...omit(["source"], otherProps)}
58
53
  />
59
54
  );
60
55
  }
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import * as R from "ramda";
2
+ import { path } from "ramda";
3
3
 
4
4
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
5
5
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
@@ -7,9 +7,13 @@ import { extractAsset } from "./utils";
7
7
 
8
8
  type Return = { uri: string } | null;
9
9
 
10
+ const getSourceContext = path(["source", "context"]);
11
+ const getSourceUri = path(["source", "uri"]);
12
+ const getState = path(["state"]);
13
+
10
14
  export const useImageSource = ({ uri, entry, otherProps }): Return => {
11
- const uriContext = R.path(["source", "context"], otherProps);
12
- const uriState = R.path(["state"], otherProps);
15
+ const uriContext = getSourceContext(otherProps);
16
+ const uriState = getState(otherProps);
13
17
 
14
18
  const action = useActions(uriContext);
15
19
 
@@ -34,7 +38,7 @@ export const useImageSource = ({ uri, entry, otherProps }): Return => {
34
38
  return { uri };
35
39
  }
36
40
 
37
- const uriFromSource = R.path(["source", "uri"], otherProps);
41
+ const uriFromSource = getSourceUri(otherProps);
38
42
 
39
43
  if (uriFromSource) {
40
44
  return { uri: uriFromSource };
@@ -56,7 +60,7 @@ const getSource = (uri, showDefault, placeholderImage, otherProps) => {
56
60
  return { uri };
57
61
  }
58
62
 
59
- const uriFromSource = R.path(["source", "uri"], otherProps);
63
+ const uriFromSource = getSourceUri(otherProps);
60
64
 
61
65
  if (uriFromSource) {
62
66
  return { uri: uriFromSource };
@@ -72,8 +76,8 @@ export const useImageSourceWithDefault = ({
72
76
  placeholderImage,
73
77
  otherProps,
74
78
  }): Return => {
75
- const uriContext = R.path(["source", "context"], otherProps);
76
- const uriState = R.path(["state"], otherProps);
79
+ const uriContext = getSourceContext(otherProps);
80
+ const uriState = getState(otherProps);
77
81
 
78
82
  const action = useActions(uriContext);
79
83
 
@@ -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
+ });
@@ -244,7 +244,7 @@ const LiveImageComponent = (props: LiveImageProps) => {
244
244
  return (
245
245
  <>
246
246
  <Image {...props} applyMaxSize />
247
- {isShouldRender && (
247
+ {isShouldRender ? (
248
248
  <View style={[style, positionAbsolute]}>
249
249
  <PlayerLiveImage
250
250
  uri={props.uri}
@@ -257,7 +257,7 @@ const LiveImageComponent = (props: LiveImageProps) => {
257
257
  audioMutedByDefault={audio_muted_by_default}
258
258
  />
259
259
  </View>
260
- )}
260
+ ) : null}
261
261
  </>
262
262
  );
263
263
  };
@@ -17,7 +17,7 @@ const SECONDARY_IMAGE_PREFIX = "secondary_image";
17
17
 
18
18
  type ImageSizing = typeof IMAGE_SIZING_FIT | typeof IMAGE_SIZING_FILL;
19
19
 
20
- type ImagePosition = typeof IMAGE_POSITION[keyof typeof IMAGE_POSITION];
20
+ type ImagePosition = (typeof IMAGE_POSITION)[keyof typeof IMAGE_POSITION];
21
21
 
22
22
  export type DisplayMode =
23
23
  | typeof DISPLAY_MODE_FIXED
@@ -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
  });
@@ -34,7 +34,6 @@ export const useFillInPercent = (entry: ZappEntry): number => {
34
34
  React.useState<number>(DEFAULT_FILL);
35
35
 
36
36
  React.useEffect(() => {
37
- // setup progress in UI on mount
38
37
  getProgressValue(action, entry, (progress) => {
39
38
  setFillInPercent(progress);
40
39
  });
@@ -45,17 +44,12 @@ export const useFillInPercent = (entry: ZappEntry): number => {
45
44
  return;
46
45
  }
47
46
 
48
- // refresh progress in UI when it was changed in CW
49
- const unsubscribe = action?.addDataSourceListener?.(() => {
47
+ return action?.addDataSourceListener?.(() => {
50
48
  getProgressValue(action, entry, (progress) => {
51
49
  setFillInPercent(progress);
52
50
  });
53
51
  });
54
-
55
- return () => {
56
- unsubscribe?.();
57
- };
58
- }, [isActive]);
52
+ }, [isActive, action, entry, setFillInPercent]);
59
53
 
60
54
  return fillInPercent;
61
55
  };
@@ -3,12 +3,10 @@
3
3
  exports[`elementMapper renders the nodes 1`] = `
4
4
  <View>
5
5
  <View
6
- key="View_0"
7
6
  testProp={true}
8
7
  viewProp={true}
9
8
  >
10
- <ImageContainer
11
- key="0"
9
+ <View
12
10
  style={
13
11
  {
14
12
  "borderTopLeftRadius": 4,
@@ -20,7 +18,6 @@ exports[`elementMapper renders the nodes 1`] = `
20
18
  uri="http://urlOfTheImage.net/img.png"
21
19
  />
22
20
  <View
23
- key="1"
24
21
  style={
25
22
  {
26
23
  "height": 30,
@@ -32,8 +29,7 @@ exports[`elementMapper renders the nodes 1`] = `
32
29
  testProp={true}
33
30
  viewProp={true}
34
31
  >
35
- <_Text
36
- key="0"
32
+ <View
37
33
  label="Test Entry"
38
34
  numberOfLines={1}
39
35
  style={
@@ -47,7 +43,6 @@ exports[`elementMapper renders the nodes 1`] = `
47
43
  />
48
44
  </View>
49
45
  <View
50
- key="2"
51
46
  style={
52
47
  {
53
48
  "height": 60,
@@ -58,8 +53,7 @@ exports[`elementMapper renders the nodes 1`] = `
58
53
  }
59
54
  testProp={true}
60
55
  >
61
- <_Text
62
- key="0"
56
+ <View
63
57
  label="Summary of the test entry"
64
58
  numberOfLines={2}
65
59
  style={
@@ -74,7 +68,6 @@ exports[`elementMapper renders the nodes 1`] = `
74
68
  />
75
69
  </View>
76
70
  <View
77
- key="3"
78
71
  style={
79
72
  {
80
73
  "height": 42,
@@ -85,8 +78,7 @@ exports[`elementMapper renders the nodes 1`] = `
85
78
  testProp={true}
86
79
  viewProp={true}
87
80
  >
88
- <ImageContainer
89
- key="0"
81
+ <View
90
82
  style={
91
83
  {
92
84
  "height": 42,