@applicaster/zapp-react-native-ui-components 14.0.0-alpha.1661204539 → 14.0.0-alpha.1740013076

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 (157) 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/tv/Artwork.tsx +41 -0
  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} +9 -2
  11. package/Components/AudioPlayer/{Summary.tsx → tv/Summary.tsx} +17 -10
  12. package/Components/AudioPlayer/tv/Title.tsx +46 -0
  13. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/Runtime.test.js.snap +4 -4
  14. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/artWork.test.js.snap +9 -4
  15. package/Components/AudioPlayer/tv/__tests__/__snapshots__/audioPlayer.test.js.snap +164 -0
  16. package/Components/AudioPlayer/tv/__tests__/__snapshots__/channel.test.js.snap +19 -0
  17. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/summary.test.js.snap +2 -3
  18. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/title.test.js.snap +2 -3
  19. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/audioPlayer.test.js +7 -3
  20. package/Components/AudioPlayer/{helpers.tsx → tv/helpers.tsx} +13 -7
  21. package/Components/AudioPlayer/{AudioPlayer.tsx → tv/index.tsx} +18 -57
  22. package/Components/AudioPlayer/types.ts +40 -0
  23. package/Components/BaseFocusable/index.tsx +23 -12
  24. package/Components/Cell/Cell.tsx +91 -64
  25. package/Components/Cell/CellWithFocusable.tsx +3 -0
  26. package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
  27. package/Components/Cell/index.js +7 -3
  28. package/Components/ComponentResolver/index.ts +1 -1
  29. package/Components/FeedLoader/FeedLoader.tsx +7 -16
  30. package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
  31. package/Components/FeedLoader/index.js +2 -8
  32. package/Components/Focusable/Focusable.tsx +12 -3
  33. package/Components/Focusable/FocusableTvOS.tsx +5 -5
  34. package/Components/Focusable/FocusableiOS.tsx +2 -2
  35. package/Components/Focusable/__tests__/index.android.test.tsx +3 -0
  36. package/Components/Focusable/index.android.tsx +12 -8
  37. package/Components/Focusable/index.tsx +1 -1
  38. package/Components/FocusableGroup/FocusableTvOS.tsx +1 -1
  39. package/Components/FocusableList/index.tsx +6 -2
  40. package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
  41. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +0 -2
  42. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  43. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
  44. package/Components/HandlePlayable/HandlePlayable.tsx +25 -9
  45. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  46. package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
  47. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +6 -2
  48. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  49. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -39
  50. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  51. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  52. package/Components/MasterCell/DefaultComponents/Text/index.tsx +27 -6
  53. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
  54. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
  55. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
  56. package/Components/MasterCell/elementMapper.tsx +1 -2
  57. package/Components/MasterCell/index.tsx +1 -1
  58. package/Components/MasterCell/utils/behaviorProvider.ts +19 -6
  59. package/Components/MasterCell/utils/index.ts +9 -13
  60. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  61. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  62. package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
  63. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  64. package/Components/PlayerContainer/PlayerContainer.tsx +66 -67
  65. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  66. package/Components/PlayerContainer/index.ts +1 -1
  67. package/Components/PlayerImageBackground/index.tsx +1 -1
  68. package/Components/River/ComponentsMap/ComponentsMap.tsx +1 -6
  69. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  70. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  71. package/Components/River/RefreshControl.tsx +11 -17
  72. package/Components/River/RiverItem.tsx +8 -8
  73. package/Components/River/TV/River.tsx +2 -20
  74. package/Components/River/TV/index.tsx +3 -1
  75. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  76. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  77. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  78. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -6
  79. package/Components/River/__tests__/river.test.js +12 -26
  80. package/Components/River/index.tsx +1 -1
  81. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  82. package/Components/Screen/__tests__/navigationHandler.test.ts +133 -22
  83. package/Components/Screen/navigationHandler.ts +20 -2
  84. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  85. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  86. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  87. package/Components/ScreenRevealManager/index.ts +1 -0
  88. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  89. package/Components/Tabs/TV/Tabs.android.tsx +1 -3
  90. package/Components/Tabs/Tabs.tsx +2 -3
  91. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +13 -0
  92. package/Components/TextInputTv/index.tsx +11 -0
  93. package/Components/TopMarginApplicator/TopMarginApplicator.tsx +16 -15
  94. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  95. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  96. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  97. package/Components/VideoLive/animationUtils.ts +3 -3
  98. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
  99. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +294 -0
  100. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +93 -0
  101. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -8
  102. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  103. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  104. package/Components/VideoModal/VideoModal.tsx +3 -17
  105. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  106. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  107. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -180
  108. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +17 -55
  109. package/Components/VideoModal/hooks/index.ts +0 -2
  110. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +15 -26
  111. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  112. package/Components/VideoModal/utils.ts +6 -0
  113. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  114. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  115. package/Components/Viewport/VisibilitySensor/VisibilitySensor.tsx +3 -3
  116. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/index.ts +3 -3
  117. package/Contexts/CellFocusedStateContext/index.tsx +27 -0
  118. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  119. package/Contexts/ScreenContext/index.tsx +46 -6
  120. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  121. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  122. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  123. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  124. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  125. package/Decorators/RiverFeedLoader/index.tsx +21 -9
  126. package/Decorators/RiverFeedLoader/utils/index.ts +0 -23
  127. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  128. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  129. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  130. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  131. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  132. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  133. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  134. package/Decorators/ZappPipesDataConnector/index.tsx +27 -308
  135. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  136. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  137. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +266 -0
  138. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  139. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  140. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  141. package/events/index.ts +1 -0
  142. package/index.d.ts +0 -1
  143. package/package.json +5 -10
  144. package/Components/AudioPlayer/Artwork.tsx +0 -35
  145. package/Components/AudioPlayer/AudioPlayerLayout.tsx +0 -202
  146. package/Components/AudioPlayer/Title.tsx +0 -39
  147. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +0 -66
  148. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +0 -28
  149. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +0 -26
  150. package/Components/AudioPlayer/index.ts +0 -1
  151. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
  152. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
  153. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/Runtime.test.js +0 -0
  154. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/artWork.test.js +0 -0
  155. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/channel.test.js +0 -0
  156. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/summary.test.js +0 -0
  157. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/title.test.js +0 -0
@@ -11,6 +11,8 @@ import { withScaledLineHeight } from "./utils";
11
11
  import { toNumber } from "@applicaster/zapp-react-native-utils/numberUtils";
12
12
  import { MeasurementPortalContext } from "../../../MeasurmentsPortal";
13
13
  import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
14
+ import { CellFocusedStateContext } from "@applicaster/zapp-react-native-ui-components/Contexts/CellFocusedStateContext";
15
+ import { useAccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager/hooks";
14
16
 
15
17
  type Props = {
16
18
  style: any;
@@ -35,10 +37,9 @@ const _Text = ({
35
37
  }: Props) => {
36
38
  const _label = useTextLabel({ label, entry });
37
39
  const isMeasurement = React.useContext(MeasurementPortalContext);
40
+ const cellFocused = React.useContext(CellFocusedStateContext);
38
41
 
39
- if (isNilOrEmpty(_label)) {
40
- return null;
41
- }
42
+ const accessibilityManager = useAccessibilityManager({});
42
43
 
43
44
  // set maximum possible height for the text in case of measurement
44
45
  const height =
@@ -46,17 +47,37 @@ const _Text = ({
46
47
  ? toNumber(otherProps.numberOfLines) * toNumber(style.lineHeight)
47
48
  : undefined;
48
49
 
50
+ const textLabel = dateTransformEnabled
51
+ ? dateFormat(dateTransform, label)
52
+ : textTransform(transformText, _label);
53
+
54
+ React.useLayoutEffect(() => {
55
+ // For FocusableCells with action buttons
56
+ if (otherProps.state) {
57
+ if (otherProps.state === "focused" && cellFocused === true) {
58
+ accessibilityManager.addHeading(textLabel);
59
+ }
60
+ } else {
61
+ if (cellFocused === true) {
62
+ accessibilityManager.addHeading(textLabel);
63
+ }
64
+ }
65
+ }, [cellFocused, otherProps.state, textLabel]);
66
+
67
+ if (isNilOrEmpty(_label)) {
68
+ return null;
69
+ }
70
+
49
71
  return (
50
72
  <Text
51
73
  style={[
52
74
  withScaledLineHeight(withFocusedStyles({ style, otherProps })),
53
75
  { height },
54
76
  ]}
77
+ allowFontScaling={false}
55
78
  {...withoutLabel(otherProps)}
56
79
  >
57
- {dateTransformEnabled
58
- ? dateFormat(dateTransform, label)
59
- : textTransform(transformText, _label)}
80
+ {textLabel}
60
81
  </Text>
61
82
  );
62
83
  };
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import TestRenderer from "react-test-renderer";
2
+ import { render } from "@testing-library/react-native";
3
3
  import { Image } from "react-native";
4
4
 
5
5
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
@@ -10,35 +10,35 @@ const CustomImage = require("../Image").default;
10
10
 
11
11
  describe("image with no source", () => {
12
12
  it("Uses provided placeholder image string", () => {
13
- const testRenderer = TestRenderer.create(
13
+ const { UNSAFE_getByType } = render(
14
14
  <CustomImage placeholderImage={"foo"} />
15
15
  );
16
16
 
17
- const testInstance = testRenderer.root;
17
+ const imageComponent = UNSAFE_getByType(Image);
18
18
 
19
- expect(testInstance.findByType(Image).props.source).toEqual({
19
+ expect(imageComponent.props.source).toEqual({
20
20
  uri: "foo",
21
21
  });
22
22
  });
23
23
 
24
24
  it("Uses provided placeholder image object", () => {
25
- const testRenderer = TestRenderer.create(
25
+ const { UNSAFE_getByType } = render(
26
26
  <CustomImage placeholderImage={"foo"} />
27
27
  );
28
28
 
29
- const testInstance = testRenderer.root;
29
+ const imageComponent = UNSAFE_getByType(Image);
30
30
 
31
- expect(testInstance.findByType(Image).props.source).toEqual({
31
+ expect(imageComponent.props.source).toEqual({
32
32
  uri: "foo",
33
33
  });
34
34
  });
35
35
 
36
36
  it("Returns empty string if no image or placeholder defined", () => {
37
- const testRenderer = TestRenderer.create(
37
+ const { UNSAFE_getByType } = render(
38
38
  <CustomImage placeholderImage={null} />
39
39
  );
40
40
 
41
- const testInstance = testRenderer.root;
42
- expect(testInstance.findByType(Image).props.source).toBeUndefined();
41
+ const imageComponent = UNSAFE_getByType(Image);
42
+ expect(imageComponent.props.source).toBeUndefined();
43
43
  });
44
44
  });
@@ -1,8 +1,6 @@
1
1
  import React from "react";
2
2
  import RN from "react-native";
3
- import { Provider } from "react-redux";
4
- import TestRenderer from "react-test-renderer";
5
- import configureStoreFn from "redux-mock-store";
3
+ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
6
4
 
7
5
  const mockUseIsRTL = jest.fn(() => true);
8
6
  const mockGetIsRTL = jest.fn(() => true);
@@ -17,7 +15,6 @@ jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
17
15
  }));
18
16
 
19
17
  const CustomText = require("../Text").default;
20
- const mockStore = configureStoreFn();
21
18
 
22
19
  const defaultProps = {
23
20
  entry: {},
@@ -25,16 +22,15 @@ const defaultProps = {
25
22
  transformText: "default",
26
23
  };
27
24
 
28
- const getRenderedText = (label: string, store: any) => {
25
+ const getRenderedText = (label: string, storeConfig: any) => {
29
26
  const props = { ...{ ...defaultProps, label } };
30
27
 
31
- const testRenderer = TestRenderer.create(
32
- <Provider store={store}>
33
- <CustomText {...props} />
34
- </Provider>
28
+ const { UNSAFE_getByType } = renderWithProviders(
29
+ <CustomText {...props} />,
30
+ storeConfig
35
31
  );
36
32
 
37
- return testRenderer.root.findByType(RN.Text).props.children;
33
+ return UNSAFE_getByType(RN.Text).props.children;
38
34
  };
39
35
 
40
36
  describe("RTL app: Hebrew text contains english word", () => {
@@ -42,28 +38,32 @@ describe("RTL app: Hebrew text contains english word", () => {
42
38
  const textWithNotFirstEnglishWord = "השיר של נועה נועה קירל באירוויזיון Word";
43
39
  const textWithoutEnglishWord = "השיר של נועה נועה קירל באירוויזיון";
44
40
 
45
- const store = mockStore({
41
+ const storeConfig = {
46
42
  remoteConfigurations: { localizations: { he: {} } },
47
43
  appData: {
48
44
  languageCode: "he",
49
45
  countryCode: "IL",
50
46
  },
51
- });
47
+ };
52
48
 
53
49
  it("Hebrew text contains first english word", () => {
54
- const renderedText = getRenderedText(textWithFirstEnglishWord, store);
50
+ const renderedText = getRenderedText(textWithFirstEnglishWord, storeConfig);
55
51
  const desiredText = "\u200fWord\u202c השיר של נועה נועה קירל באירוויזיון";
56
52
 
57
53
  expect(renderedText).toEqual(desiredText);
58
54
  });
59
55
 
60
56
  it("Hebrew text contains not first english word", () => {
61
- const renderedText = getRenderedText(textWithNotFirstEnglishWord, store);
57
+ const renderedText = getRenderedText(
58
+ textWithNotFirstEnglishWord,
59
+ storeConfig
60
+ );
61
+
62
62
  expect(renderedText).toEqual(textWithNotFirstEnglishWord);
63
63
  });
64
64
 
65
65
  it("Hebrew text doesn't contain english word", () => {
66
- const renderedText = getRenderedText(textWithoutEnglishWord, store);
66
+ const renderedText = getRenderedText(textWithoutEnglishWord, storeConfig);
67
67
  expect(renderedText).toEqual(textWithoutEnglishWord);
68
68
  });
69
69
  });
@@ -77,16 +77,16 @@ describe("LTR app: English text", () => {
77
77
 
78
78
  const englishText = "Test sentence";
79
79
 
80
- const store = mockStore({
80
+ const storeConfig = {
81
81
  remoteConfigurations: { localizations: { en: {} } },
82
82
  appData: {
83
83
  languageCode: "en",
84
84
  countryCode: "US",
85
85
  },
86
- });
86
+ };
87
87
 
88
88
  it("English text", () => {
89
- const renderedText = getRenderedText(englishText, store);
89
+ const renderedText = getRenderedText(englishText, storeConfig);
90
90
  expect(renderedText).toEqual(englishText);
91
91
  });
92
92
  });
@@ -1,12 +1,12 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import ReactTestRenderer from "react-test-renderer";
3
+ import { render } from "@testing-library/react-native";
4
4
 
5
5
  import { CollapsibleTextContainer } from "../CollapsibleTextContainer";
6
6
 
7
7
  describe("CollapsibleTextContainer", () => {
8
8
  it("render container+children when label is presented", () => {
9
- const renderer = ReactTestRenderer.create(
9
+ const { toJSON } = render(
10
10
  <CollapsibleTextContainer
11
11
  backgroundColor="#000000"
12
12
  label={"label"}
@@ -16,36 +16,36 @@ describe("CollapsibleTextContainer", () => {
16
16
  </CollapsibleTextContainer>
17
17
  );
18
18
 
19
- const result = renderer.toJSON();
19
+ const result = toJSON();
20
20
 
21
21
  expect(result).not.toBeNull();
22
- expect(renderer.toJSON()).toMatchSnapshot();
22
+ expect(toJSON()).toMatchSnapshot();
23
23
  });
24
24
 
25
25
  it("render nothing when label is empty", () => {
26
- const renderer = ReactTestRenderer.create(
26
+ const { toJSON } = render(
27
27
  <CollapsibleTextContainer backgroundColor="#000000" label={""} style={{}}>
28
28
  <View />
29
29
  </CollapsibleTextContainer>
30
30
  );
31
31
 
32
- const result = renderer.toJSON();
32
+ const result = toJSON();
33
33
  expect(result).toBeNull();
34
34
  });
35
35
 
36
36
  it("render nothing when label is not passed", () => {
37
- const renderer = ReactTestRenderer.create(
37
+ const { toJSON } = render(
38
38
  <CollapsibleTextContainer backgroundColor="#000000" label={""} style={{}}>
39
39
  <View />
40
40
  </CollapsibleTextContainer>
41
41
  );
42
42
 
43
- const result = renderer.toJSON();
43
+ const result = toJSON();
44
44
  expect(result).toBeNull();
45
45
  });
46
46
 
47
47
  it("render nothing when label is undefined", () => {
48
- const renderer = ReactTestRenderer.create(
48
+ const { toJSON } = render(
49
49
  <CollapsibleTextContainer
50
50
  backgroundColor="#000000"
51
51
  label={undefined}
@@ -55,7 +55,7 @@ describe("CollapsibleTextContainer", () => {
55
55
  </CollapsibleTextContainer>
56
56
  );
57
57
 
58
- const result = renderer.toJSON();
58
+ const result = toJSON();
59
59
  expect(result).toBeNull();
60
60
  });
61
61
  });
@@ -73,7 +73,6 @@ export function elementMapper(
73
73
  : {};
74
74
 
75
75
  const componentProps = {
76
- key,
77
76
  style,
78
77
  skipButtons: otherProps?.skipButtons,
79
78
  emitAsyncElementRegistrate: otherProps?.emitAsyncElementRegistrate,
@@ -91,7 +90,7 @@ export function elementMapper(
91
90
  const fn = mapElementWithKey(elementMapper(components, otherProps));
92
91
 
93
92
  return (
94
- <Component {...componentProps}>
93
+ <Component key={key} {...componentProps}>
95
94
  {focusableTypes.has(type) && elements.length > 0
96
95
  ? elements.map(fn)
97
96
  : null}
@@ -86,7 +86,7 @@ export function masterCellBuilder({
86
86
  entry: item,
87
87
  state: getEntryState(state, entryIsSelected),
88
88
  }),
89
- [state, item?.id, entryIsSelected] // Assuming that item won't mutate
89
+ [state, item, entryIsSelected] // Assuming that item won't mutate
90
90
  );
91
91
 
92
92
  const wrapperRef = React.useRef(null);
@@ -10,6 +10,7 @@ import get from "lodash/get";
10
10
  import { ScreenMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenStateMultiSelectProvider";
11
11
  import { ScreenSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenSingleValueProvider";
12
12
  import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
13
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
13
14
 
14
15
  const parseContextKey = (
15
16
  key: string,
@@ -22,7 +23,8 @@ const parseContextKey = (
22
23
 
23
24
  const getDataSourceProvider = (
24
25
  behavior: Behavior,
25
- screenRoute: string
26
+ screenRoute: string,
27
+ screenStateStore: ReturnType<typeof useScreenStateStore>
26
28
  ): BehaviorSubject<string[] | string> | null => {
27
29
  if (!behavior) return null;
28
30
 
@@ -33,14 +35,16 @@ const getDataSourceProvider = (
33
35
  if (behavior.select_mode === "multi") {
34
36
  return ScreenMultiSelectProvider.getProvider(
35
37
  screenKey,
36
- screenRoute
38
+ screenRoute,
39
+ screenStateStore
37
40
  ).getObservable();
38
41
  }
39
42
 
40
43
  if (behavior.select_mode === "single") {
41
44
  return ScreenSingleValueProvider.getProvider(
42
45
  screenKey,
43
- screenRoute
46
+ screenRoute,
47
+ screenStateStore
44
48
  ).getObservable();
45
49
  }
46
50
  }
@@ -68,6 +72,7 @@ const getDataSourceProvider = (
68
72
  export const useBehaviorUpdate = (behavior: Behavior) => {
69
73
  const [lastUpdate, setLastUpdate] = React.useState<number | null>(null);
70
74
  const screenRoute = useRoute()?.pathname || "";
75
+ const screenStateStore = useScreenStateStore();
71
76
  const player = usePlayer();
72
77
 
73
78
  const triggerUpdate = () => setLastUpdate(Date.now());
@@ -75,7 +80,11 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
75
80
  useEffect(() => {
76
81
  if (!behavior) return;
77
82
 
78
- const dataSource = getDataSourceProvider(behavior, screenRoute);
83
+ const dataSource = getDataSourceProvider(
84
+ behavior,
85
+ screenRoute,
86
+ screenStateStore
87
+ );
79
88
 
80
89
  if (dataSource) {
81
90
  const subscription = dataSource.subscribe(triggerUpdate);
@@ -102,10 +111,12 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
102
111
  export const isCellSelected = ({
103
112
  item,
104
113
  screenRoute,
114
+ screenStateStore,
105
115
  behavior,
106
116
  }: {
107
117
  item: ZappEntry;
108
118
  screenRoute: string;
119
+ screenStateStore: ReturnType<typeof useScreenStateStore>;
109
120
  behavior?: Behavior;
110
121
  }): boolean => {
111
122
  if (!behavior) return false;
@@ -138,7 +149,8 @@ export const isCellSelected = ({
138
149
  if (behavior.select_mode === "single") {
139
150
  const selectedItem = ScreenSingleValueProvider.getProvider(
140
151
  screenKey,
141
- screenRoute
152
+ screenRoute,
153
+ screenStateStore
142
154
  ).getValue();
143
155
 
144
156
  return selectedItem === String(id);
@@ -147,7 +159,8 @@ export const isCellSelected = ({
147
159
  if (behavior.select_mode === "multi") {
148
160
  const selectedItems = ScreenMultiSelectProvider.getProvider(
149
161
  screenKey,
150
- screenRoute
162
+ screenRoute,
163
+ screenStateStore
151
164
  ).getSelectedItems();
152
165
 
153
166
  return selectedItems?.includes(String(id));
@@ -9,6 +9,7 @@ import { getCellState } from "../../Cell/utils";
9
9
  import { getColorFromData } from "@applicaster/zapp-react-native-utils/cellUtils";
10
10
  import { isCellSelected, useBehaviorUpdate } from "./behaviorProvider";
11
11
  import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
12
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
12
13
 
13
14
  const hasElementSpecificViewType = (viewType) => (element) => {
14
15
  if (R.isNil(element)) {
@@ -191,18 +192,6 @@ export const getFocusedButtonId = (focusable) => {
191
192
  });
192
193
  };
193
194
 
194
- export const isSelected = ({
195
- item,
196
- screenRoute,
197
- behavior,
198
- }: {
199
- item: ZappEntry;
200
- screenRoute: string;
201
- behavior?: Behavior;
202
- }) => {
203
- return isCellSelected({ item, screenRoute, behavior });
204
- };
205
-
206
195
  export const useCellState = ({
207
196
  item,
208
197
  behavior,
@@ -214,9 +203,16 @@ export const useCellState = ({
214
203
  }): CellState => {
215
204
  const lastUpdate = useBehaviorUpdate(behavior);
216
205
  const router = useRoute();
206
+ const screenStateStore = useScreenStateStore();
217
207
 
218
208
  const _isSelected = useMemo(
219
- () => isSelected({ item, screenRoute: router?.pathname, behavior }),
209
+ () =>
210
+ isCellSelected({
211
+ item,
212
+ screenRoute: router?.pathname,
213
+ screenStateStore,
214
+ behavior,
215
+ }),
220
216
  [behavior, item, lastUpdate]
221
217
  );
222
218
 
@@ -1,9 +1,12 @@
1
1
  import React from "react";
2
2
  import { Text, Animated } from "react-native";
3
+ import { render } from "@testing-library/react-native";
3
4
 
4
- import renderer from "react-test-renderer";
5
-
6
- jest.useFakeTimers();
5
+ import {
6
+ NotificationView,
7
+ onlinePhrase,
8
+ offlinePhrase,
9
+ } from "../NotificationView";
7
10
 
8
11
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
9
12
  usePickFromState: () => ({
@@ -32,39 +35,31 @@ jest.mock("react-native-safe-area-context", () => ({
32
35
 
33
36
  const dismiss = jest.fn();
34
37
 
35
- const {
36
- NotificationView,
37
- onlinePhrase,
38
- offlinePhrase,
39
- } = require("../NotificationView");
40
-
41
38
  describe("NotificationView", () => {
42
39
  it("Show online message when Online", () => {
43
- const component = renderer.create(
44
- <NotificationView online dismiss={dismiss} />
45
- );
40
+ const component = render(<NotificationView online dismiss={dismiss} />);
46
41
 
47
- expect(component.root.findByType(Text).props.children).toBe(onlinePhrase);
42
+ expect(component.UNSAFE_getByType(Text).props.children).toBe(onlinePhrase);
48
43
  });
49
44
 
50
45
  it("Show offline message when Online", () => {
51
- const component = renderer.create(
46
+ const component = render(
52
47
  <NotificationView online={false} dismiss={dismiss} />
53
48
  );
54
49
 
55
- expect(component.root.findByType(Text).props.children).toBe(offlinePhrase);
50
+ expect(component.UNSAFE_getByType(Text).props.children).toBe(offlinePhrase);
56
51
  });
57
52
 
58
53
  it("When hidden is false to true notification is visible", () => {
59
- const component = renderer.create(
54
+ const component = render(
60
55
  <NotificationView online={false} hidden={false} dismiss={dismiss} />
61
56
  );
62
57
 
63
- component.update(
58
+ component.rerender(
64
59
  <NotificationView online={false} hidden={true} dismiss={dismiss} />
65
60
  );
66
61
 
67
- const animatedView = component.root.findByType(Animated.View);
62
+ const animatedView = component.UNSAFE_getByType(Animated.View);
68
63
  const animatedViewStyles = animatedView.props.style;
69
64
 
70
65
  expect(animatedViewStyles.opacity).toBe(1);
@@ -21,6 +21,15 @@ exports[`OfflineHandler renders 1`] = `
21
21
  }
22
22
  >
23
23
  <View
24
+ accessibilityState={
25
+ {
26
+ "busy": undefined,
27
+ "checked": undefined,
28
+ "disabled": undefined,
29
+ "expanded": undefined,
30
+ "selected": undefined,
31
+ }
32
+ }
24
33
  accessible={true}
25
34
  collapsable={false}
26
35
  focusable={true}
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
-
3
- import renderer, { act } from "react-test-renderer";
2
+ import { render } from "@testing-library/react-native";
4
3
 
5
4
  jest.useFakeTimers({ legacyFakeTimers: true });
6
5
 
@@ -19,29 +18,27 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => {
19
18
  };
20
19
  });
21
20
 
22
- jest.mock(
23
- "@applicaster/zapp-react-native-redux/hooks/usePickFromState",
24
- () => ({
25
- usePickFromState: () => ({
26
- plugins: [
27
- {
28
- name: "offline experience",
29
- identifier: "offline-experience",
30
- type: "general",
31
- module: {
32
- useOfflineExperienceConfiguration: () => ({
33
- configurationFields: {},
34
- localizations: {
35
- offline_toast_message: "No internet connection",
36
- online_toast_message: "You are back online",
37
- },
38
- }),
39
- },
21
+ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
22
+ ...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
23
+ usePickFromState: () => ({
24
+ plugins: [
25
+ {
26
+ name: "offline experience",
27
+ identifier: "offline-experience",
28
+ type: "general",
29
+ module: {
30
+ useOfflineExperienceConfiguration: () => ({
31
+ configurationFields: {},
32
+ localizations: {
33
+ offline_toast_message: "No internet connection",
34
+ online_toast_message: "You are back online",
35
+ },
36
+ }),
40
37
  },
41
- ],
42
- }),
43
- })
44
- );
38
+ },
39
+ ],
40
+ }),
41
+ }));
45
42
 
46
43
  jest.mock("react-native-safe-area-context", () => ({
47
44
  useSafeAreaInsets: () => ({ top: 44 }),
@@ -51,24 +48,18 @@ describe("OfflineHandler", () => {
51
48
  const { OfflineHandler, NotificationView } = require("../");
52
49
 
53
50
  it("renders", () => {
54
- const instance = renderer.create(<OfflineHandler />);
55
- expect(instance.toJSON()).toMatchSnapshot();
51
+ const { toJSON } = render(<OfflineHandler />);
52
+ expect(toJSON()).toMatchSnapshot();
56
53
  });
57
54
 
58
55
  it("renders Notification mode if component was rendered while online", () => {
59
56
  mockConnectionStatus = true;
60
57
 
61
- let instance;
62
-
63
- act(() => {
64
- instance = renderer.create(<OfflineHandler />);
65
- });
58
+ const { rerender, UNSAFE_getByType } = render(<OfflineHandler />);
66
59
 
67
- act(() => {
68
- instance.update(<OfflineHandler />);
69
- });
60
+ rerender(<OfflineHandler />);
70
61
 
71
- const notificationsView = instance.root.findByType(NotificationView);
62
+ const notificationsView = UNSAFE_getByType(NotificationView);
72
63
  expect(notificationsView).toBeDefined();
73
64
  });
74
65
  });
@@ -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
 
5
5
  import { ErrorDisplayComponent } from "./ErrorDisplay";
6
6