@applicaster/zapp-react-native-ui-components 14.0.0-alpha.4517121861 → 14.0.0-alpha.4596155133

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 (81) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AudioPlayer/mobile/Layout.tsx +1 -1
  3. package/Components/AudioPlayer/tv/helpers.tsx +10 -3
  4. package/Components/Cell/index.js +1 -1
  5. package/Components/ComponentResolver/index.ts +1 -1
  6. package/Components/FeedLoader/index.js +1 -1
  7. package/Components/Focusable/Focusable.tsx +5 -3
  8. package/Components/Focusable/FocusableTvOS.tsx +3 -3
  9. package/Components/Focusable/FocusableiOS.tsx +2 -2
  10. package/Components/Focusable/index.tsx +1 -1
  11. package/Components/FocusableList/index.tsx +4 -0
  12. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  13. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +12 -8
  14. package/Components/HandlePlayable/HandlePlayable.tsx +17 -10
  15. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  16. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  17. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -27
  18. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  19. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  20. package/Components/MasterCell/elementMapper.tsx +1 -2
  21. package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
  22. package/Components/MasterCell/utils/index.ts +27 -3
  23. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  24. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  25. package/Components/OfflineHandler/__tests__/index.test.tsx +20 -22
  26. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  27. package/Components/PlayerContainer/PlayerContainer.tsx +41 -28
  28. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  29. package/Components/PlayerContainer/index.ts +1 -1
  30. package/Components/River/ComponentsMap/ComponentsMap.tsx +0 -1
  31. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +379 -0
  32. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  33. package/Components/River/RefreshControl.tsx +6 -4
  34. package/Components/River/TV/River.tsx +2 -17
  35. package/Components/River/TV/index.tsx +3 -1
  36. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  37. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  38. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  39. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -0
  40. package/Components/River/index.tsx +1 -1
  41. package/Components/Screen/__tests__/Screen.test.tsx +23 -12
  42. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  43. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  44. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  45. package/Components/ScreenRevealManager/index.ts +1 -0
  46. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  47. package/Components/Tabs/TV/Tabs.android.tsx +0 -2
  48. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  49. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  50. package/Components/VideoLive/animationUtils.ts +3 -3
  51. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -8
  52. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  53. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  54. package/Components/VideoModal/VideoModal.tsx +3 -17
  55. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  56. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -240
  57. package/Components/VideoModal/hooks/index.ts +0 -2
  58. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  59. package/Components/VideoModal/utils.ts +6 -0
  60. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  61. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  62. package/Contexts/ScreenContext/index.tsx +44 -0
  63. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  64. package/Decorators/RiverFeedLoader/index.tsx +12 -2
  65. package/Decorators/RiverFeedLoader/utils/index.ts +19 -2
  66. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  67. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  68. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  69. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  70. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  71. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  72. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  73. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  74. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  75. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  76. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +268 -0
  77. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  78. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  79. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +162 -0
  80. package/package.json +5 -10
  81. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
@@ -4,9 +4,11 @@ import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/uti
4
4
  import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
5
5
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
6
6
 
7
- type AnimatedInterpolatedStyle =
8
- | Animated.AnimatedInterpolation
9
- | [{ [Key: string]: Animated.AnimatedInterpolation }];
7
+ type AnimatedInterpolatedStyle = any;
8
+
9
+ // type AnimatedInterpolatedStyle =
10
+ // | Animated.AnimatedInterpolation
11
+ // | [{ [Key: string]: Animated.AnimatedInterpolation }];
10
12
 
11
13
  type AnimationConfig = {
12
14
  duration: number;
@@ -27,7 +27,7 @@ export function AudioPlayerMobileLayout({
27
27
  }: Props) {
28
28
  const fadeAnimation = useRef(new Animated.Value(0)).current;
29
29
 
30
- const mainContainerStyles = platformSelect({
30
+ const mainContainerStyles: ViewStyle = platformSelect({
31
31
  native: {
32
32
  backgroundColor: "transparent",
33
33
  overflow: "hidden",
@@ -27,13 +27,20 @@ const LTR = {
27
27
  justifyContent: "flex-start",
28
28
  textAlign: "left",
29
29
  alignItems: "flex-end",
30
- };
30
+ } as const;
31
31
 
32
32
  const RTL = {
33
33
  flexDirection: "row-reverse",
34
34
  justifyContent: "flex-end",
35
35
  textAlign: "right",
36
36
  alignItems: "flex-start",
37
- };
37
+ } as const;
38
38
 
39
- export const directionStyles = (isRTL) => (isRTL ? RTL : LTR);
39
+ export const directionStyles = (
40
+ isRTL: boolean
41
+ ): {
42
+ flexDirection: "row" | "row-reverse";
43
+ justifyContent: "flex-start" | "flex-end";
44
+ textAlign: "left" | "right";
45
+ alignItems: "flex-end" | "flex-start";
46
+ } => (isRTL ? RTL : LTR);
@@ -1,6 +1,6 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
3
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
4
4
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
5
5
 
6
6
  import {
@@ -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 { ComponentResolverComponent } from "./ComponentResolver";
6
6
 
@@ -1,6 +1,6 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
3
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
4
4
  import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
5
5
 
6
6
  import { FeedLoaderComponent } from "./FeedLoader";
@@ -5,6 +5,7 @@ import { BaseFocusable } from "../BaseFocusable";
5
5
  import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focusManager";
6
6
  import { LONG_KEY_PRESS_TIMEOUT } from "@applicaster/quick-brick-core/const";
7
7
  import { withFocusableContext } from "../../Contexts/FocusableGroupContext/withFocusableContext";
8
+ import { StyleSheet, ViewStyle } from "react-native";
8
9
 
9
10
  type Props = {
10
11
  initialFocus?: boolean;
@@ -21,7 +22,7 @@ type Props = {
21
22
  handleFocus?: ({ mouse }: { mouse: boolean }) => void;
22
23
  children: (boolean, string) => React.ComponentType<any>;
23
24
  selected?: boolean;
24
- style?: React.CSSProperties;
25
+ style?: ViewStyle[] | ViewStyle;
25
26
  };
26
27
 
27
28
  class Focusable extends BaseFocusable<Props> {
@@ -122,7 +123,7 @@ class Focusable extends BaseFocusable<Props> {
122
123
  }
123
124
 
124
125
  render() {
125
- const { children, style } = this.props;
126
+ const { children, style, ...otherProps } = this.props;
126
127
  const { focused } = this.state;
127
128
 
128
129
  const id = this.getId();
@@ -139,7 +140,8 @@ class Focusable extends BaseFocusable<Props> {
139
140
  onMouseUp={this.pressOut}
140
141
  data-testid={focusableId}
141
142
  focused-teststate={focused ? "focused" : "default"}
142
- style={style}
143
+ style={StyleSheet.flatten(style) as any as React.CSSProperties}
144
+ {...otherProps}
143
145
  >
144
146
  {children(focused, { mouse: this.mouse })}
145
147
  </div>
@@ -16,9 +16,9 @@ function noop() {}
16
16
  type Props = {
17
17
  id: string;
18
18
  groupId: string;
19
- onPress?: (nativeEvent: React.SyntheticEvent) => void;
20
- onFocus?: (nativeEvent: React.SyntheticEvent) => void;
21
- onBlur?: (nativeEvent: React.SyntheticEvent) => void;
19
+ onPress?: (nativeEvent: any) => void;
20
+ onFocus?: (nativeEvent: any) => void;
21
+ onBlur?: (nativeEvent: any) => void;
22
22
  children: (focused?: boolean) => React.ReactNode;
23
23
  isParallaxDisabled: boolean;
24
24
  preferredFocus?: boolean;
@@ -2,7 +2,7 @@ import React from "react";
2
2
 
3
3
  type Props = {
4
4
  children: () => React.ReactNode;
5
- };
5
+ } & Record<string, any>;
6
6
 
7
7
  function FocusableiOSComponent({ children }: Props) {
8
8
  if (typeof children === "function") {
@@ -12,4 +12,4 @@ function FocusableiOSComponent({ children }: Props) {
12
12
  return children;
13
13
  }
14
14
 
15
- export const FocusableiOS = React.forwardRef(FocusableiOSComponent);
15
+ export const FocusableiOS = FocusableiOSComponent;
@@ -4,7 +4,7 @@ import { FocusableiOS } from "./FocusableiOS";
4
4
 
5
5
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
6
6
 
7
- export const Focusable = platformSelect({
7
+ export const Focusable: React.ComponentType<any> = platformSelect({
8
8
  tvos: FocusableTvOS,
9
9
  ios: FocusableiOS,
10
10
  default: FocusableDefault,
@@ -91,6 +91,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
91
91
  // eslint-disable-next-line unused-imports/no-unused-vars
92
92
  omitPropsPropagation = [],
93
93
  useScrollView = false,
94
+ onScrollToIndexFailed = noop,
94
95
  } = props;
95
96
 
96
97
  useCheckItemIdsForUnique({ componentId: props.id, items: data });
@@ -277,6 +278,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
277
278
  "withStateMemory",
278
279
  "useSequentialLoading",
279
280
  "useScrollView",
281
+ "onScrollToIndexFailed",
280
282
  ...omitPropsPropagation,
281
283
  ],
282
284
  R.__
@@ -305,6 +307,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
305
307
  {...getFlatListProps(props)}
306
308
  onEndReached={onEndReached}
307
309
  initialNumToRender={initialNumToRender}
310
+ onScrollToIndexFailed={onScrollToIndexFailed}
308
311
  renderItem={renderItem}
309
312
  focused={focused}
310
313
  data={data}
@@ -319,6 +322,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
319
322
  renderItem={renderItem}
320
323
  onEndReached={onEndReached}
321
324
  initialNumToRender={initialNumToRender}
325
+ onScrollToIndexFailed={onScrollToIndexFailed}
322
326
  />
323
327
  )}
324
328
  </ChildrenFocusDeactivatorView>
@@ -8,13 +8,10 @@ import {
8
8
  useCurationAPI,
9
9
  } from "../useCurationAPI";
10
10
  import * as redux from "react-redux";
11
- import * as layoutPresets from "@applicaster/zapp-react-native-redux/hooks/useLayoutPresets";
12
- import * as pipesFeeds from "@applicaster/zapp-react-native-redux/hooks/useZappPipesFeeds";
13
11
  import { NavigationContext } from "@applicaster/zapp-react-native-ui-components/Contexts/NavigationContext";
14
12
  import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
15
13
 
16
- import { Provider } from "react-redux";
17
- import configureStore from "redux-mock-store";
14
+ import { WrappedWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
18
15
 
19
16
  jest.mock(
20
17
  "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
@@ -42,19 +39,20 @@ const mainStackNavigator = {
42
39
  },
43
40
  };
44
41
 
45
- const store = configureStore()({});
46
-
47
- const wrapper = ({ children }) => (
48
- <Provider store={store}>
49
- <NavigationContext.Provider
50
- value={{ ...mainStackNavigator, currentRoute: homeStack.route }}
51
- >
52
- <PathnameContext.Provider value={homeStack.route}>
53
- {children}
54
- </PathnameContext.Provider>
55
- </NavigationContext.Provider>
56
- </Provider>
57
- );
42
+ const getWrapper =
43
+ (store) =>
44
+ // eslint-disable-next-line react/display-name, react/prop-types
45
+ ({ children }) => (
46
+ <WrappedWithProviders store={store}>
47
+ <NavigationContext.Provider
48
+ value={{ ...mainStackNavigator, currentRoute: homeStack.route }}
49
+ >
50
+ <PathnameContext.Provider value={homeStack.route}>
51
+ {children}
52
+ </PathnameContext.Provider>
53
+ </NavigationContext.Provider>
54
+ </WrappedWithProviders>
55
+ );
58
56
 
59
57
  describe("getTransformedPreset should return the passed components if smartComponents is empty", () => {
60
58
  describe("getTransformedPreset function", () => {
@@ -312,19 +310,10 @@ describe("getTransformedPreset should return the passed components if smartCompo
312
310
  { id: "02", component_type: "not_smart_another" },
313
311
  ];
314
312
 
315
- // mock the hooks
316
- const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
317
- mockUseZappPipesFeeds.mockReturnValue({});
318
-
319
- const mockUseLayoutPresets = jest.spyOn(
320
- layoutPresets,
321
- "useLayoutPresets"
322
- );
323
-
324
- mockUseLayoutPresets.mockReturnValue({});
325
-
326
313
  const { result } = renderHook(() => useCurationAPI(mockComponents), {
327
- wrapper,
314
+ wrapper: getWrapper({
315
+ zappPipes: {},
316
+ }),
328
317
  });
329
318
 
330
319
  // if there are no smart components, it should return the original array
@@ -366,18 +355,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
366
355
  "http://curation": { loading: false, data: { entry: mockPresetEntry } },
367
356
  };
368
357
 
369
- const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
370
- mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
371
-
372
- const mockUseLayoutPresets = jest.spyOn(
373
- layoutPresets,
374
- "useLayoutPresets"
375
- );
376
-
377
- mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
378
-
379
358
  const { result } = renderHook(() => useCurationAPI(mockComponents), {
380
- wrapper,
359
+ wrapper: getWrapper({
360
+ zappPipes: mockFeeds,
361
+ presetsMapping: {
362
+ presets_mappings: {
363
+ ...mockLayoutPresets,
364
+ },
365
+ },
366
+ }),
381
367
  });
382
368
 
383
369
  expect(result.current).toEqual(mockTransformedComponents);
@@ -437,19 +423,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
437
423
  },
438
424
  };
439
425
 
440
- // mock the hooks
441
- const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
442
- mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
443
-
444
- const mockUseLayoutPresets = jest.spyOn(
445
- layoutPresets,
446
- "useLayoutPresets"
447
- );
448
-
449
- mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
450
-
451
426
  const { result } = renderHook(() => useCurationAPI(mockComponents), {
452
- wrapper,
427
+ wrapper: getWrapper({
428
+ zappPipes: mockFeeds,
429
+ presetsMapping: {
430
+ presets_mappings: {
431
+ ...mockLayoutPresets,
432
+ },
433
+ },
434
+ }),
453
435
  });
454
436
 
455
437
  expect(result.current).toEqual(mockTransformedComponents);
@@ -495,14 +477,15 @@ describe("getTransformedPreset should return the passed components if smartCompo
495
477
  "http://curation": { loading: false, data: { entry: mockPresetEntry } },
496
478
  };
497
479
 
498
- // mock the hooks
499
- const mockUseZappPipesFeeds = jest.spyOn(pipesFeeds, "useZappPipesFeeds");
500
- mockUseZappPipesFeeds.mockReturnValue(mockFeeds);
501
- const mockUseLayoutPresets = jest.spyOn(layoutPresets, "useLayoutPresets");
502
- mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
503
-
504
480
  const { result } = renderHook(() => useCurationAPI(mockComponents), {
505
- wrapper,
481
+ wrapper: getWrapper({
482
+ zappPipes: mockFeeds,
483
+ presetsMapping: {
484
+ presets_mappings: {
485
+ ...mockLayoutPresets,
486
+ },
487
+ },
488
+ }),
506
489
  });
507
490
 
508
491
  expect(result.current).toEqual(mockTransformedComponents);
@@ -1,17 +1,18 @@
1
1
  import { all, equals, path, prop, isEmpty, pluck, values } from "ramda";
2
2
 
3
3
  import { useEffect, useMemo } from "react";
4
- import { useDispatch } from "react-redux";
5
4
 
6
5
  import {
6
+ ZappPipes,
7
+ useAppDispatch,
7
8
  useLayoutPresets,
8
- useZappPipesFeeds,
9
- } from "@applicaster/zapp-react-native-redux/hooks";
10
- import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
9
+ useZappPipesFeed,
10
+ } from "@applicaster/zapp-react-native-redux";
11
11
  import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
12
12
  import { Categories } from "./logger";
13
13
  import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
14
14
  import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
15
+
15
16
  import {
16
17
  ZappPipesEntryContext,
17
18
  ZappPipesScreenContext,
@@ -26,7 +27,10 @@ import {
26
27
  import { produce } from "immer";
27
28
  // types reference
28
29
 
29
- declare type CurationEntry = { preset_name: string; feed_url: string };
30
+ declare interface CurationEntry {
31
+ preset_name: string;
32
+ feed_url: string;
33
+ }
30
34
 
31
35
  type Feeds = Record<string, ZappPipesData>;
32
36
 
@@ -122,7 +126,7 @@ export const getFinalComponents = (
122
126
  export const useCurationAPI = (
123
127
  components: Array<ZappUIComponent>
124
128
  ): ZappUIComponent[] => {
125
- const dispatch = useDispatch();
129
+ const dispatch = useAppDispatch();
126
130
 
127
131
  const smartComponents = useMemo(
128
132
  () => components?.filter?.(isSmartComponent) ?? [],
@@ -162,7 +166,7 @@ export const useCurationAPI = (
162
166
  useEffect(() => {
163
167
  urls.forEach((url, index) => {
164
168
  if (url) {
165
- dispatch(loadPipesData(url, { clearCache: false }));
169
+ dispatch(ZappPipes.loadPipesData(url, { clearCache: false }));
166
170
  } else {
167
171
  logger.log_error("Curation url is empty", {
168
172
  componentId: smartComponents?.[index]?.id,
@@ -171,7 +175,7 @@ export const useCurationAPI = (
171
175
  });
172
176
  }, [urls]);
173
177
 
174
- const feeds = useZappPipesFeeds(urls);
178
+ const feeds = useZappPipesFeed(urls);
175
179
  const layoutPresets = useLayoutPresets();
176
180
 
177
181
  const enrichedComponents = useMemo(() => {
@@ -6,14 +6,15 @@ import {
6
6
  } from "@applicaster/zapp-react-native-utils/pluginUtils";
7
7
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
8
8
  import {
9
- isTablet,
10
9
  useDimensions,
10
+ useIsTablet as isTablet,
11
11
  useNavigation,
12
12
  } from "@applicaster/zapp-react-native-utils/reactHooks";
13
13
 
14
14
  import { BufferAnimation } from "../PlayerContainer/BufferAnimation";
15
15
  import { PlayerContainer } from "../PlayerContainer";
16
16
  import { useModalSize } from "../VideoModal/hooks";
17
+ import { ViewStyle } from "react-native";
17
18
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
18
19
 
19
20
  type Props = {
@@ -88,7 +89,8 @@ type PlayableComponent = {
88
89
  const dimensionsContext: "window" | "screen" = platformSelect({
89
90
  android_tv: "window",
90
91
  amazon: "window",
91
- default: isTablet(null, null) ? "window" : "screen", // on tablet, window represents correct values, on phone it's not as the screen could be rotated
92
+ // eslint-disable-next-line react-hooks/rules-of-hooks
93
+ default: isTablet() ? "window" : "screen", // on tablet, window represents correct values, on phone it's not as the screen could be rotated
92
94
  });
93
95
 
94
96
  export function HandlePlayable({
@@ -149,14 +151,19 @@ export function HandlePlayable({
149
151
  const modalSize = useModalSize();
150
152
 
151
153
  const style = React.useMemo(
152
- () => ({
153
- width: isModal ? modalSize.width : mode === "PIP" ? "100%" : screenWidth,
154
- height: isModal
155
- ? modalSize.height
156
- : mode === "PIP"
157
- ? "100%"
158
- : screenHeight,
159
- }),
154
+ () =>
155
+ ({
156
+ width: isModal
157
+ ? modalSize.width
158
+ : mode === "PIP"
159
+ ? "100%"
160
+ : screenWidth,
161
+ height: isModal
162
+ ? modalSize.height
163
+ : mode === "PIP"
164
+ ? "100%"
165
+ : screenHeight,
166
+ }) as ViewStyle,
160
167
  [screenWidth, screenHeight, modalSize, isModal, mode]
161
168
  );
162
169
 
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks/usePickFromState";
2
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
3
3
  import { getBackgroundImageUrl } from "../utils";
4
4
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
5
5
 
@@ -4,7 +4,7 @@ import * as R from "ramda";
4
4
  import { TouchableOpacity } from "react-native";
5
5
  // import { SvgUri } from "react-native-svg";
6
6
 
7
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
7
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
8
8
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
9
9
 
10
10
  import Image from "./Image";
@@ -2,7 +2,6 @@ import React, { useMemo } from "react";
2
2
  import { ImageStyle } from "react-native";
3
3
  import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable";
4
4
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
5
- import * as R from "ramda";
6
5
  import { getXray } from "@applicaster/zapp-react-native-utils/logger";
7
6
  import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
8
7
  import { useAccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager/hooks";
@@ -67,32 +66,10 @@ export function FocusableView({ style, children, item, ...otherProps }: Props) {
67
66
  const handleFocus = (focusable) => {
68
67
  const focusedButtonId = getFocusedButtonId(focusable);
69
68
 
70
- wrapperRef?.current?.measure((x, y, width, height, pageX, pageY) => {
71
- const top = pageY;
72
- const bottom = top + height;
73
- const left = pageX;
74
- const right = left + width;
75
-
76
- const boundingRect = {
77
- x,
78
- y,
79
- pageX,
80
- pageY,
81
- width,
82
- height,
83
- top,
84
- bottom,
85
- left,
86
- right,
87
- };
88
-
89
- otherProps?.onToggleFocus?.({
90
- focusable: {
91
- getRect: R.always(boundingRect),
92
- },
93
- focusedButtonId,
94
- mouse: focusable.mouse,
95
- });
69
+ otherProps?.onToggleFocus?.({
70
+ focusable: wrapperRef.current,
71
+ focusedButtonId,
72
+ mouse: focusable.mouse,
96
73
  });
97
74
 
98
75
  if (ttsLabel) {
@@ -20,7 +20,7 @@ const withAppliedDimensions = (style: Style) => (source: Source) => ({
20
20
  });
21
21
 
22
22
  export const withDimensionsHOC = (Component) => {
23
- return function WithDimensions(props: { style: any }) {
23
+ return function WithDimensions(props: Record<string, unknown>) {
24
24
  const theme = useTheme<BaseThemePropertiesMobile>();
25
25
 
26
26
  const useDownScalingImages = toBooleanWithDefaultFalse(
@@ -13,7 +13,7 @@ export const ImageContainer = (props: Props) => {
13
13
  const isActive = useIsScreenActive();
14
14
 
15
15
  const Component =
16
- isVideoPreviewEnabled(props) && isActive ? LiveImage : PureImage;
16
+ isVideoPreviewEnabled(props as Props) && isActive ? LiveImage : PureImage;
17
17
 
18
18
  return <Component {...props} />;
19
19
  };
@@ -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}