@applicaster/zapp-react-native-ui-components 12.0.0-alpha.4440903139 → 12.0.0-alpha.4484269996

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 (32) hide show
  1. package/Components/Focusable/index.android.tsx +9 -15
  2. package/Components/FocusableList/FocusableChild.ts +4 -2
  3. package/Components/FocusableList/index.tsx +12 -11
  4. package/Components/FocusableScrollView/index.tsx +1 -1
  5. package/Components/Image/Image.android.tsx +1 -1
  6. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +0 -12
  7. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -6
  8. package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +2 -2
  9. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  10. package/Components/PlayerContainer/PlayerContainer.tsx +8 -14
  11. package/Components/Transitioner/Transitioner.tsx +3 -13
  12. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +0 -5
  13. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +1 -2
  14. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +3 -11
  15. package/Components/VideoModal/PlayerDetails.tsx +2 -16
  16. package/Components/VideoModal/PlayerWrapper.tsx +10 -40
  17. package/Components/VideoModal/VideoModal.tsx +27 -33
  18. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -7
  19. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +0 -2
  20. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +10 -56
  21. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +1 -4
  22. package/Components/ZappFrameworkComponents/BarView/Buttons/BackButton.tsx +2 -7
  23. package/Components/ZappFrameworkComponents/BarView/Buttons/CloseButton.tsx +2 -7
  24. package/Components/ZappFrameworkComponents/Buttons/ActionButton.tsx +4 -9
  25. package/Contexts/CachedDimensionsContext/index.ts +9 -13
  26. package/Contexts/ConfirmDialogState/index.ts +1 -1
  27. package/Contexts/ScreenContext/index.tsx +1 -6
  28. package/const.ts +0 -6
  29. package/index.js +0 -3
  30. package/package.json +5 -5
  31. package/Components/Focusable/__tests__/index.android.test.tsx +0 -72
  32. package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +0 -87
@@ -128,10 +128,7 @@ function FocusableComponent(props: Props, forwardedRef) {
128
128
 
129
129
  const _onBlur = React.useCallback(
130
130
  (ref, options = {}) => {
131
- if (ref.props.id !== focusManager.focusedId) {
132
- setFocused(false);
133
- }
134
-
131
+ setFocused(false);
135
132
  onBlur?.(ref, options);
136
133
  },
137
134
  [onBlur]
@@ -151,14 +148,15 @@ function FocusableComponent(props: Props, forwardedRef) {
151
148
  [isRTL, nextFocusDown, nextFocusUp, nextFocusLeft, nextFocusRight]
152
149
  );
153
150
 
154
- const contextState = React.useMemo(() => {
155
- return {
151
+ const contextState = React.useMemo(
152
+ () => ({
156
153
  focused,
157
154
  ...parentFocus,
158
155
  ref: touchableRef,
159
156
  setIsFocusable,
160
- };
161
- }, [parentFocus, focused]);
157
+ }),
158
+ [parentFocus, focused]
159
+ );
162
160
 
163
161
  return (
164
162
  <Touchable
@@ -175,13 +173,9 @@ function FocusableComponent(props: Props, forwardedRef) {
175
173
  {...parentFocus}
176
174
  >
177
175
  <FocusableContext.Provider value={contextState}>
178
- {React.useMemo(
179
- () =>
180
- typeof children === "function"
181
- ? children(focused, parentFocus, touchableRef)
182
- : children,
183
- [children, focused, parentFocus]
184
- )}
176
+ {typeof children === "function"
177
+ ? children(focused, parentFocus, touchableRef)
178
+ : children}
185
179
  </FocusableContext.Provider>
186
180
  </Touchable>
187
181
  );
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { isEqual } from "@applicaster/zapp-react-native-utils/equalUtils";
3
3
  import { useFocusable } from "../Focusable/index.android";
4
+ import { useCellState } from "./hooks/useCellState.android";
4
5
 
5
6
  /**
6
7
  * returns parent focus from prop or from context
@@ -29,14 +30,15 @@ const useParentFocus = (
29
30
  );
30
31
 
31
32
  function FocusableChildComponent(props) {
32
- const { setIsFocusable, focused, ...focusableContext } = useFocusable();
33
-
33
+ const { setIsFocusable, ...focusableContext } = useFocusable();
34
34
  const parentFocus = useParentFocus(props, focusableContext);
35
35
 
36
36
  const onLoadFailed = React.useCallback(() => {
37
37
  setIsFocusable(false);
38
38
  }, []);
39
39
 
40
+ const focused = useCellState(props.id);
41
+
40
42
  return props.renderItem({
41
43
  ...props,
42
44
  focused,
@@ -88,7 +88,6 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
88
88
  data = [],
89
89
  // eslint-disable-next-line unused-imports/no-unused-vars
90
90
  onAllComponentsLoaded, // TODO: re-implement it
91
- omitPropsPropagation = [],
92
91
  } = props;
93
92
 
94
93
  useCheckItemIdsForUnique({ componentId: props.id, items: data });
@@ -253,9 +252,9 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
253
252
  ]
254
253
  );
255
254
 
256
- const getFlatListProps = React.useCallback(
257
- R.omit(
258
- [
255
+ const flatListProps = React.useMemo(
256
+ () =>
257
+ R.omit([
259
258
  "onListElementFocus",
260
259
  "onListElementPress",
261
260
  "onListElementPressOut",
@@ -268,17 +267,17 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
268
267
  "focusableItemProps",
269
268
  "renderItem",
270
269
  "extraChildrenData",
270
+ "extraData",
271
+ "keyExtractor",
271
272
  "onAllComponentsLoaded",
272
273
  "focused",
273
274
  "id",
274
275
  "initialFocusDirection",
275
276
  "withStateMemory",
276
277
  "useSequentialLoading",
277
- ...omitPropsPropagation,
278
- ],
279
- R.__
280
- ),
281
- [omitPropsPropagation]
278
+ ...(props.omitPropsPropagation || []),
279
+ ])(props),
280
+ [props]
282
281
  );
283
282
 
284
283
  const onEndReached = React.useCallback(
@@ -290,7 +289,7 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
290
289
 
291
290
  const initialNumToRender = toFiniteNumberWithDefault(
292
291
  10,
293
- props.initialNumToRender
292
+ flatListProps.initialNumToRender
294
293
  );
295
294
 
296
295
  return (
@@ -299,10 +298,12 @@ function FocusableListComponent<ItemT>(props: Props<ItemT>, ref) {
299
298
  <FlatList
300
299
  focusable={false}
301
300
  scrollEnabled={false}
301
+ extraData={props.extraData}
302
302
  ref={ref}
303
- {...getFlatListProps(props)}
303
+ {...flatListProps}
304
304
  renderItem={renderItem}
305
305
  onEndReached={onEndReached}
306
+ keyExtractor={props.keyExtractor}
306
307
  initialNumToRender={initialNumToRender}
307
308
  />
308
309
  </ChildrenFocusDeactivatorView>
@@ -284,7 +284,7 @@ function FocusableScrollViewComponent(props: Props, ref) {
284
284
  };
285
285
 
286
286
  return (
287
- <View key={id} onLayout={onItemLayout}>
287
+ <View onLayout={onItemLayout}>
288
288
  <Focusable
289
289
  {...nextFocus}
290
290
  onFocus={(element, direction) =>
@@ -8,5 +8,5 @@ import { useImageSource } from "./utils";
8
8
  export const QBImage = (props: FastImageProps) => {
9
9
  const source = useImageSource(props.source);
10
10
 
11
- return <FastImage useLastImageAsDefaultSource {...props} source={source} />;
11
+ return <FastImage {...props} source={source} />;
12
12
  };
@@ -5,7 +5,6 @@ import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/acti
5
5
  import * as R from "ramda";
6
6
  import { getXray } from "@applicaster/zapp-react-native-utils/logger";
7
7
  import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
8
- import { useAccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager/hooks";
9
8
 
10
9
  const { Logger } = getXray();
11
10
 
@@ -45,11 +44,6 @@ export function FocusableView({ style, children, item, ...otherProps }: Props) {
45
44
 
46
45
  const actionContext = useActions(pluginIdentifier);
47
46
 
48
- const accessibilityManager = useAccessibilityManager({});
49
-
50
- const { ttsLabel = "" } =
51
- actionContext?.initialEntryState(item)?.getAccessibility?.(item) || {};
52
-
53
47
  const onPress = (event) => {
54
48
  event?.preventDefault?.();
55
49
 
@@ -94,12 +88,6 @@ export function FocusableView({ style, children, item, ...otherProps }: Props) {
94
88
  mouse: focusable.mouse,
95
89
  });
96
90
  });
97
-
98
- if (ttsLabel) {
99
- accessibilityManager.readText({
100
- text: ttsLabel,
101
- });
102
- }
103
91
  };
104
92
 
105
93
  const handleBlur = (_focusable, _direction) => {
@@ -38,22 +38,21 @@ 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
41
  const defaultPlaceHolderImage = React.useMemo(
45
42
  () => ({ uri: placeholderImage || "" }),
46
43
  [source, error]
47
44
  );
48
45
 
46
+ const _source = shouldRenderImg
47
+ ? withDimensions(source)
48
+ : defaultPlaceHolderImage;
49
+
49
50
  return (
50
51
  // @ts-ignore
51
52
  <MemoizedImage
52
53
  style={style as ImageStyle}
53
54
  onError={() => setErrorState(true)}
54
- source={
55
- shouldRenderImg ? withDimensions(source) : defaultPlaceHolderImage
56
- }
55
+ source={_source?.uri ? _source : undefined}
57
56
  {...R.omit(["source"], otherProps)}
58
57
  />
59
58
  );
@@ -31,10 +31,10 @@ function Image({
31
31
 
32
32
  return (
33
33
  <RnImage
34
- defaultSource={placeholderImage || null}
34
+ defaultSource={placeholderImage || ""}
35
35
  style={style}
36
36
  source={updatedSource}
37
- {...R.omit(["source", "placeholderImage"], otherProps)}
37
+ {...R.omit(["source"], otherProps)}
38
38
  />
39
39
  );
40
40
  }
@@ -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
  });
@@ -362,15 +362,13 @@ const PlayerContainerComponent = (props: Props) => {
362
362
  const toggleFullscreen = (event) => {
363
363
  const { fullscreen = false } = event || {};
364
364
 
365
- setTimeout(() => {
366
- if (fullscreen) {
367
- navigator.fullscreenVideoModal();
368
- playerEvent("onFullscreenPlayerWillPresent");
369
- } else {
370
- navigator.maximiseVideoModal();
371
- playerEvent("onFullscreenPlayerWillDismiss");
372
- }
373
- });
365
+ if (fullscreen) {
366
+ playerEvent("onFullscreenPlayerWillPresent");
367
+ navigator.fullscreenVideoModal();
368
+ } else {
369
+ playerEvent("onFullscreenPlayerWillDismiss");
370
+ navigator.maximiseVideoModal();
371
+ }
374
372
  };
375
373
 
376
374
  const onCellTap = (entry) => {
@@ -465,10 +463,6 @@ const PlayerContainerComponent = (props: Props) => {
465
463
 
466
464
  if (mode === VideoModalMode.FULLSCREEN) {
467
465
  toggleFullscreen({ fullscreen: false });
468
-
469
- if (!isModal) {
470
- playerManager.closeNativePlayer();
471
- }
472
466
  }
473
467
 
474
468
  return !!(
@@ -525,7 +519,7 @@ const PlayerContainerComponent = (props: Props) => {
525
519
  }
526
520
 
527
521
  return () => {
528
- playerEvent("player_did_close", { item });
522
+ playerEvent("player_did_close");
529
523
 
530
524
  if (!isModal) {
531
525
  showNavBar(true);
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { update, compose, tail, append, take, identity, isNil } from "ramda";
3
+ import { update, compose, tail, append, take, identity } from "ramda";
4
4
 
5
5
  import { AnimationManager } from "./AnimationManager";
6
6
  import { Scene } from "./Scene";
@@ -50,10 +50,6 @@ function scenesForBackTransition(props: SceneProps, { scenes }) {
50
50
  : [prepareScene(props.children), scenes[0]];
51
51
  }
52
52
 
53
- const isModalClosed = (navigator) => {
54
- return !!isNil(navigator?.modalData);
55
- };
56
-
57
53
  type Props = {
58
54
  transitionConfig: any;
59
55
  children: React.ReactNode;
@@ -317,10 +313,7 @@ export class TransitionerComponent extends React.PureComponent<Props, State> {
317
313
  <Scene
318
314
  key={scenes[from.index].key}
319
315
  pathname={scenes[from.index].key}
320
- isActive={
321
- scenes[from.index].key === this.props.navigator.currentRoute &&
322
- isModalClosed(this.props.navigator)
323
- }
316
+ isActive={scenes[from.index].key === this.props.navigator.currentRoute}
324
317
  style={from.style}
325
318
  pointerEvents="none"
326
319
  overlayStyle={from.overlayStyle}
@@ -336,10 +329,7 @@ export class TransitionerComponent extends React.PureComponent<Props, State> {
336
329
  const toScene = scenes[to.index] && (
337
330
  <Scene
338
331
  pathname={scenes[to.index].key}
339
- isActive={
340
- scenes[to.index].key === this.props.navigator.currentRoute &&
341
- isModalClosed(this.props.navigator)
342
- }
332
+ isActive={scenes[to.index].key === this.props.navigator.currentRoute}
343
333
  key={scenes[to.index].key}
344
334
  style={to.style}
345
335
  overlayStyle={to.overlayStyle}
@@ -31,11 +31,6 @@ exports[`PlayerLiveImageComponent should render correctly with default props 1`]
31
31
  playerId="player1"
32
32
  resizeMode="cover"
33
33
  screenConfig={Object {}}
34
- source={
35
- Object {
36
- "uri": "",
37
- }
38
- }
39
34
  style={Object {}}
40
35
  />
41
36
  </View>
@@ -223,8 +223,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
223
223
  (videoModalState.mode === "MAXIMIZED" &&
224
224
  videoModalState.previousMode === "MINIMIZED" &&
225
225
  previousItemId === videoModalState.item?.id) ||
226
- (previousItemId !== videoModalState.item?.id &&
227
- videoModalState.mode !== "FULLSCREEN")
226
+ previousItemId !== videoModalState.item?.id
228
227
  ) {
229
228
  setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
230
229
  setTimeout(() => resetPlayerAnimationState());
@@ -60,10 +60,7 @@ export const AnimationView = ({
60
60
  const {
61
61
  width: screenWidth,
62
62
  deviceInfo: { isTablet, isTabletLandscape },
63
- } = useDimensions("window", {
64
- deviceInfo: true,
65
- updateForInactiveScreens: true,
66
- });
63
+ } = useDimensions("window", { deviceInfo: true });
67
64
 
68
65
  const { videoModalState } = useNavigation();
69
66
  const insets = useSafeAreaInsets();
@@ -304,18 +301,13 @@ export const AnimationView = ({
304
301
  typeof additionalData.height === "number" && additionalData.height;
305
302
  }
306
303
 
307
- if (
308
- videoModalState.mode === "MAXIMIZED" &&
309
- defaultValue.x !== screenWidth &&
310
- width &&
311
- height
312
- ) {
304
+ if (defaultValue.x === 0 && width && height) {
313
305
  const value = { x: width, y: height };
314
306
  setDefaultValue(value);
315
307
  animatedValue.setValue(value);
316
308
  }
317
309
  }
318
- }, [screenWidth]);
310
+ }, [additionalData, screenWidth]);
319
311
 
320
312
  React.useEffect(() => {
321
313
  if (
@@ -1,17 +1,9 @@
1
1
  import React, { useEffect, useRef } from "react";
2
- import {
3
- StyleProp,
4
- ViewStyle,
5
- Animated,
6
- Easing,
7
- Dimensions,
8
- } from "react-native";
2
+ import { StyleProp, ViewStyle, Animated, Easing } from "react-native";
9
3
  import { useTargetScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
10
4
  import { ComponentsMap } from "@applicaster/zapp-react-native-ui-components/Components/River/ComponentsMap";
11
5
  import { useSafeAreaInsets } from "react-native-safe-area-context";
12
6
 
13
- const { width: SCREEN_WIDTH } = Dimensions.get("screen");
14
-
15
7
  type Configuration = {
16
8
  [key: string]: any;
17
9
  modal_background_color?: string;
@@ -23,7 +15,6 @@ type Props = {
23
15
  configuration: Configuration;
24
16
  isTabletLandscape: boolean;
25
17
  isAudioPlayer?: boolean;
26
- isTablet: boolean;
27
18
  };
28
19
 
29
20
  const containerStyle = ({
@@ -40,7 +31,6 @@ export const PlayerDetails = ({
40
31
  configuration,
41
32
  isTabletLandscape,
42
33
  isAudioPlayer,
43
- isTablet,
44
34
  }: Props) => {
45
35
  const screenData = useTargetScreenData(entry);
46
36
  const insets = useSafeAreaInsets();
@@ -87,11 +77,7 @@ export const PlayerDetails = ({
87
77
  transform: [{ translateY }],
88
78
  opacity,
89
79
  },
90
- {
91
- // workaround for avoid wrong text-height after going back to portrait rotation
92
- // we don't see this view in landscape mode, so we are able to use fixed width from portrait mode
93
- width: isTablet ? undefined : SCREEN_WIDTH,
94
- },
80
+ // isAudioPlayer && audioMarginStyle,
95
81
  ]}
96
82
  >
97
83
  {screenData && (
@@ -7,6 +7,7 @@ import {
7
7
  ViewStyle,
8
8
  } from "react-native";
9
9
  import { Edge, SafeAreaView } from "react-native-safe-area-context";
10
+
10
11
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
11
12
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
12
13
  import { PlayerDetails } from "./PlayerDetails";
@@ -22,8 +23,6 @@ import {
22
23
  ComponentAnimationType,
23
24
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
24
25
 
25
- const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get("screen");
26
-
27
26
  type DimensionsT = {
28
27
  width: number | string;
29
28
  height: number | string | undefined;
@@ -70,8 +69,10 @@ const directionStyles = (isTabletLandscape: boolean): ViewStyle => {
70
69
  };
71
70
 
72
71
  const getScreenAspectRatio = () => {
73
- const longEdge = Math.max(SCREEN_WIDTH, SCREEN_HEIGHT);
74
- const shortEdge = Math.min(SCREEN_WIDTH, SCREEN_HEIGHT);
72
+ const { width, height } = Dimensions.get("screen");
73
+
74
+ const longEdge = Math.max(width, height);
75
+ const shortEdge = Math.min(width, height);
75
76
 
76
77
  return longEdge / shortEdge;
77
78
  };
@@ -124,37 +125,10 @@ const getTabletWidth = (
124
125
  return Number(width) - sidebarWidth;
125
126
  };
126
127
 
127
- const getStyles = (baseStyle, isMobile, isPortrait) => {
128
- if (isMobile && isPortrait) {
129
- return { width: SCREEN_WIDTH, height: SCREEN_HEIGHT };
130
- }
131
-
132
- if (isMobile && !isPortrait) {
133
- return { width: SCREEN_HEIGHT, height: SCREEN_WIDTH };
134
- }
135
-
136
- return baseStyle;
137
- };
138
-
139
- const showDetails = (isMobile: boolean, docked: boolean): boolean => {
140
- // for mobile we always show details. Mounting of it very heavy operation.
141
- if (isMobile) {
142
- return true;
143
- }
144
-
145
- // workaround for tablets we need to mount/unmount in order to avoid PlayerDetails content dissappearing
146
- // FIXME - find out the reason of dissapearing of content
147
- if (docked) {
148
- return false;
149
- }
150
-
151
- return true;
152
- };
153
-
154
- const PlayerWrapperComponent = (props: Props) => {
128
+ export const PlayerWrapper = (props: Props) => {
155
129
  const {
156
130
  entry,
157
- style: baseStyle,
131
+ style,
158
132
  containerStyle,
159
133
  inline,
160
134
  docked,
@@ -169,8 +143,6 @@ const PlayerWrapperComponent = (props: Props) => {
169
143
 
170
144
  const isInlineModal = inline && isModal;
171
145
 
172
- const style = getStyles(baseStyle, !isTablet, isInlineModal);
173
-
174
146
  const isTabletLandscape = !isTV() && isTablet && !isTabletPortrait;
175
147
 
176
148
  const tabletWidth = getTabletWidth(configuration, style);
@@ -252,9 +224,8 @@ const PlayerWrapperComponent = (props: Props) => {
252
224
  </AnimatedVideoPlayerComponent>
253
225
  </AnimationComponent>
254
226
  </View>
255
-
256
227
  <AnimatedScrollModal>
257
- {showDetails(!isTablet, docked) && (
228
+ {isInlineModal && !docked ? (
258
229
  <AnimationComponent
259
230
  animationType={ComponentAnimationType.componentFade}
260
231
  style={defaultStyles.flex}
@@ -264,9 +235,10 @@ const PlayerWrapperComponent = (props: Props) => {
264
235
  style={defaultStyles.playerDetails}
265
236
  entry={entry}
266
237
  isTabletLandscape={isTabletLandscape}
267
- isTablet={isTablet}
268
238
  />
269
239
  </AnimationComponent>
240
+ ) : (
241
+ <View style={defaultStyles.playerDetails} />
270
242
  )}
271
243
  </AnimatedScrollModal>
272
244
  </ScreenContextProvider>
@@ -277,5 +249,3 @@ const PlayerWrapperComponent = (props: Props) => {
277
249
  </PathnameContext.Provider>
278
250
  );
279
251
  };
280
-
281
- export const PlayerWrapper = PlayerWrapperComponent;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import * as R from "ramda";
3
- import { StyleSheet, View, StatusBar } from "react-native";
3
+ import { StyleSheet, View } from "react-native";
4
4
 
5
5
  import { HandlePlayable } from "@applicaster/zapp-react-native-ui-components/Components/HandlePlayable";
6
6
  import {
@@ -129,38 +129,32 @@ const VideoModalComponent = () => {
129
129
  const pathname = `${ROUTE_TYPES.VIDEO_MODAL}/${item?.id}`;
130
130
 
131
131
  return (
132
- <>
133
- {/* TODO: Workaround to avoid unnecessary UI effect when switching from portrait to fullscreen */}
134
- <StatusBar hidden={false} />
135
- {/* TODO: Workaround to avoid unnecessary UI effect when switching from portrait to fullscreen */}
136
-
137
- <PathnameContext.Provider value={pathname}>
138
- <ScreenContextProvider pathname={pathname}>
139
- {itemIdHooksFinished === item?.id ? (
140
- <AnimatedPlayerModalWrapper
141
- style={[
142
- styles.container,
143
- {
144
- backgroundColor,
145
- },
146
- ]}
147
- >
148
- <HandlePlayable
149
- item={item}
150
- isModal={mode !== "PIP"}
151
- modalHeight={modalSize.height}
152
- modalWidth={modalSize.width}
153
- mode={mode}
154
- />
155
- </AnimatedPlayerModalWrapper>
156
- ) : (
157
- <View style={styles.loaderContainer}>
158
- <Spinner />
159
- </View>
160
- )}
161
- </ScreenContextProvider>
162
- </PathnameContext.Provider>
163
- </>
132
+ <PathnameContext.Provider value={pathname}>
133
+ <ScreenContextProvider pathname={pathname}>
134
+ {itemIdHooksFinished === item?.id ? (
135
+ <AnimatedPlayerModalWrapper
136
+ style={[
137
+ styles.container,
138
+ {
139
+ backgroundColor,
140
+ },
141
+ ]}
142
+ >
143
+ <HandlePlayable
144
+ item={item}
145
+ isModal={mode !== "PIP"}
146
+ modalHeight={modalSize.height}
147
+ modalWidth={modalSize.width}
148
+ mode={mode}
149
+ />
150
+ </AnimatedPlayerModalWrapper>
151
+ ) : (
152
+ <View style={styles.loaderContainer}>
153
+ <Spinner />
154
+ </View>
155
+ )}
156
+ </ScreenContextProvider>
157
+ </PathnameContext.Provider>
164
158
  );
165
159
  };
166
160
 
@@ -8,13 +8,6 @@ const props = {
8
8
  configuration: { modal_background_color: "transparent" },
9
9
  };
10
10
 
11
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/layout", () => ({
12
- useDimensions: jest.fn(() => ({
13
- width: 20,
14
- height: 30,
15
- })),
16
- }));
17
-
18
11
  jest.mock("react-native-safe-area-context", () => ({
19
12
  useSafeAreaInsets: jest.fn(() => ({
20
13
  top: 20,
@@ -9,7 +9,6 @@ exports[`PlayerDetails renders properly 1`] = `
9
9
  "flex": 1,
10
10
  "marginTop": -8,
11
11
  "paddingTop": -8,
12
- "width": 750,
13
12
  }
14
13
  }
15
14
  >
@@ -30,7 +29,6 @@ exports[`PlayerDetails renders properly on tablet in landscape orientation 1`] =
30
29
  "flex": 1,
31
30
  "marginTop": -20,
32
31
  "paddingTop": 40,
33
- "width": 750,
34
32
  }
35
33
  }
36
34
  >
@@ -27,8 +27,8 @@ exports[`PlayerWrapper renders inline 1`] = `
27
27
  "backgroundColor": "transparent",
28
28
  },
29
29
  Object {
30
- "height": 1334,
31
- "width": 750,
30
+ "height": 800,
31
+ "width": 300,
32
32
  },
33
33
  Object {},
34
34
  ]
@@ -91,7 +91,6 @@ exports[`PlayerWrapper renders inline 1`] = `
91
91
  "id": "test",
92
92
  }
93
93
  }
94
- isTablet={false}
95
94
  isTabletLandscape={false}
96
95
  style={
97
96
  Object {
@@ -133,8 +132,8 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
133
132
  "backgroundColor": "transparent",
134
133
  },
135
134
  Object {
136
- "height": 1334,
137
- "width": 750,
135
+ "height": undefined,
136
+ "width": 300,
138
137
  },
139
138
  Object {},
140
139
  ]
@@ -178,35 +177,13 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
178
177
  testID="test-player-container"
179
178
  />
180
179
  <View
181
- animationType="componentFade"
182
180
  style={
183
181
  Object {
184
182
  "flex": 1,
183
+ "paddingTop": 20,
185
184
  }
186
185
  }
187
- >
188
- <View
189
- configuration={
190
- Object {
191
- "tablet_landscape_player_container_background_color": "red",
192
- "tablet_landscape_sidebar_width": "35%",
193
- }
194
- }
195
- entry={
196
- Object {
197
- "id": "test",
198
- }
199
- }
200
- isTablet={false}
201
- isTabletLandscape={false}
202
- style={
203
- Object {
204
- "flex": 1,
205
- "paddingTop": 20,
206
- }
207
- }
208
- />
209
- </View>
186
+ />
210
187
  </View>
211
188
  </RNCSafeAreaView>
212
189
  </RNCSafeAreaProvider>
@@ -319,7 +296,6 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
319
296
  "id": "test",
320
297
  }
321
298
  }
322
- isTablet={true}
323
299
  isTabletLandscape={true}
324
300
  style={
325
301
  Object {
@@ -361,8 +337,8 @@ exports[`PlayerWrapper renders properly 1`] = `
361
337
  "backgroundColor": "transparent",
362
338
  },
363
339
  Object {
364
- "height": 750,
365
- "width": 1334,
340
+ "height": 800,
341
+ "width": 300,
366
342
  },
367
343
  Object {},
368
344
  ]
@@ -406,35 +382,13 @@ exports[`PlayerWrapper renders properly 1`] = `
406
382
  testID="test-player-container"
407
383
  />
408
384
  <View
409
- animationType="componentFade"
410
385
  style={
411
386
  Object {
412
387
  "flex": 1,
388
+ "paddingTop": 20,
413
389
  }
414
390
  }
415
- >
416
- <View
417
- configuration={
418
- Object {
419
- "tablet_landscape_player_container_background_color": "red",
420
- "tablet_landscape_sidebar_width": "35%",
421
- }
422
- }
423
- entry={
424
- Object {
425
- "id": "test",
426
- }
427
- }
428
- isTablet={false}
429
- isTabletLandscape={false}
430
- style={
431
- Object {
432
- "flex": 1,
433
- "paddingTop": 20,
434
- }
435
- }
436
- />
437
- </View>
391
+ />
438
392
  </View>
439
393
  </RNCSafeAreaView>
440
394
  </RNCSafeAreaProvider>
@@ -45,10 +45,7 @@ const BarView = ({ screenStyles, barState = defaultState }: Props) => {
45
45
  );
46
46
 
47
47
  return (
48
- <SafeAreaView
49
- style={[style.view, isRTL ? style.rtlStyle : {}]}
50
- testID="BarView-safeAreaView"
51
- >
48
+ <SafeAreaView style={[style.view, isRTL ? style.rtlStyle : {}]}>
52
49
  {backButton}
53
50
  <BarTitle title={barState.title} screenStyles={screenStyles} />
54
51
  {closeButton}
@@ -11,16 +11,12 @@ const renderEmptyView = () => {
11
11
  return <View style={emptyViewStyle} />;
12
12
  };
13
13
 
14
- type FloatingButtonProps = Testable & {
14
+ type FloatingButtonProps = {
15
15
  onPress: () => void;
16
16
  screenStyles: any;
17
17
  };
18
18
 
19
- const BackButton = ({
20
- onPress,
21
- screenStyles,
22
- testID = "backButton",
23
- }: FloatingButtonProps) => {
19
+ const BackButton = ({ onPress, screenStyles }: FloatingButtonProps) => {
24
20
  const containerStyle: any = {};
25
21
 
26
22
  if (!onPress) {
@@ -29,7 +25,6 @@ const BackButton = ({
29
25
 
30
26
  return (
31
27
  <ActionButton
32
- testID={`${testID}-actionButton`}
33
28
  onPress={onPress}
34
29
  buttonStyles={containerStyle}
35
30
  imageUrl={screenStyles.back_button_image}
@@ -11,16 +11,12 @@ const renderEmptyView = () => {
11
11
  return <View style={emptyViewStyle} />;
12
12
  };
13
13
 
14
- type CloseButtonProps = Testable & {
14
+ type CloseButtonProps = {
15
15
  onPress: () => void;
16
16
  screenStyles?: any;
17
17
  };
18
18
 
19
- const CloseButton = ({
20
- onPress,
21
- screenStyles,
22
- testID = "closeButton",
23
- }: CloseButtonProps) => {
19
+ const CloseButton = ({ onPress, screenStyles }: CloseButtonProps) => {
24
20
  const containerStyle: any = {};
25
21
 
26
22
  if (!onPress) {
@@ -29,7 +25,6 @@ const CloseButton = ({
29
25
 
30
26
  return (
31
27
  <ActionButton
32
- testID={`${testID}-actionButton`}
33
28
  onPress={onPress}
34
29
  buttonStyles={containerStyle}
35
30
  imageUrl={screenStyles.close_button_image}
@@ -28,7 +28,7 @@ styles: {
28
28
  }
29
29
  */
30
30
 
31
- type ActionButtonProps = Testable & {
31
+ type ActionButtonProps = {
32
32
  onPress: () => void;
33
33
  buttonStyles: any;
34
34
  imageUrl: string;
@@ -46,16 +46,11 @@ const ActionButton = ({
46
46
  buttonStyles,
47
47
  imageUrl,
48
48
  imageStyle = closeButtonStyle,
49
- testID,
50
49
  }: ActionButtonProps) => {
51
50
  return (
52
- <View style={buttonStyles} testID={testID}>
53
- <TouchableOpacity onPress={onPress} testID={`${testID}-touchable`}>
54
- <Image
55
- source={{ uri: imageUrl }}
56
- style={imageStyle}
57
- testID={`${testID}-image`}
58
- />
51
+ <View style={buttonStyles}>
52
+ <TouchableOpacity onPress={onPress}>
53
+ <Image source={{ uri: imageUrl }} style={imageStyle} />
59
54
  </TouchableOpacity>
60
55
  </View>
61
56
  );
@@ -1,6 +1,5 @@
1
1
  import { create, useStore } from "zustand";
2
2
  import { produce } from "immer";
3
- import { useCallback, useMemo } from "react";
4
3
 
5
4
  type Dimensions = {
6
5
  width: Option<number>;
@@ -32,19 +31,16 @@ export const useCachedDimensions = (id: string) => {
32
31
  dimensionsStore
33
32
  ) as DimensionsState;
34
33
 
35
- const getCachedDimensions = useCallback(() => {
34
+ const getCachedDimensions = () => {
36
35
  return dimensions[id] || initialDimensions();
37
- }, [dimensions?.[id], id]);
36
+ };
38
37
 
39
- const handleSetCachedDimensions = useCallback((newDimensions) => {
38
+ const handleSetCachedDimensions = (newDimensions) => {
40
39
  setCachedDimensions(id, newDimensions);
41
- }, []);
42
-
43
- return useMemo(
44
- () => ({
45
- getCachedDimensions,
46
- setCachedDimensions: handleSetCachedDimensions,
47
- }),
48
- [getCachedDimensions, handleSetCachedDimensions]
49
- );
40
+ };
41
+
42
+ return {
43
+ getCachedDimensions,
44
+ setCachedDimensions: handleSetCachedDimensions,
45
+ };
50
46
  };
@@ -2,7 +2,7 @@ import { createStore } from "zustand/vanilla";
2
2
  import { useStore } from "zustand";
3
3
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
4
4
 
5
- export interface ConfirmationDialogState {
5
+ interface ConfirmationDialogState {
6
6
  isDialogVisible: boolean;
7
7
  messages: string;
8
8
  confirmAction: () => void;
@@ -177,12 +177,7 @@ export function withScreenContext(Component: React.ComponentType<any>) {
177
177
  return function WithScreenContextWrapper(props) {
178
178
  return (
179
179
  <ScreenContext.Consumer>
180
- {useCallback(
181
- (value) => (
182
- <Component {...props} screenContext={value} />
183
- ),
184
- [Component, props]
185
- )}
180
+ {(value) => <Component {...props} screenContext={value} />}
186
181
  </ScreenContext.Consumer>
187
182
  );
188
183
  };
package/const.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { ViewStyle } from "react-native";
2
-
3
1
  export const tvPluginsWithCellRenderer = [
4
2
  "group-qb",
5
3
  "gallery-qb",
@@ -7,7 +5,3 @@ export const tvPluginsWithCellRenderer = [
7
5
  "hero-qb",
8
6
  "list-qb",
9
7
  ];
10
-
11
- // Can't be used in StyleSheet.create, need to be inline/defined as a constant
12
- // https://github.com/necolas/react-native-web/issues/1427
13
- export const flatListOverflowStyle: ViewStyle = { overflow: "visible" };
package/index.js CHANGED
@@ -1,6 +1,3 @@
1
1
  import * as QuickBrickComponents from "./Components";
2
- import { flatListOverflowStyle } from "./const";
3
-
4
- export { flatListOverflowStyle };
5
2
 
6
3
  export default QuickBrickComponents;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "12.0.0-alpha.4440903139",
3
+ "version": "12.0.0-alpha.4484269996",
4
4
  "description": "Applicaster Zapp React Native ui components for the Quick Brick App",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -34,10 +34,10 @@
34
34
  "redux-mock-store": "^1.5.3"
35
35
  },
36
36
  "dependencies": {
37
- "@applicaster/applicaster-types": "12.0.0-alpha.4440903139",
38
- "@applicaster/zapp-react-native-bridge": "12.0.0-alpha.4440903139",
39
- "@applicaster/zapp-react-native-redux": "12.0.0-alpha.4440903139",
40
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.4440903139",
37
+ "@applicaster/applicaster-types": "12.0.0-alpha.4484269996",
38
+ "@applicaster/zapp-react-native-bridge": "12.0.0-alpha.4484269996",
39
+ "@applicaster/zapp-react-native-redux": "12.0.0-alpha.4484269996",
40
+ "@applicaster/zapp-react-native-utils": "12.0.0-alpha.4484269996",
41
41
  "promise": "^8.3.0",
42
42
  "react-router-native": "^5.1.2",
43
43
  "url": "^0.11.0",
@@ -1,72 +0,0 @@
1
- import React from "react";
2
- import { render, act } from "@testing-library/react-native";
3
- import { Touchable } from "../../Touchable";
4
-
5
- const mockUseIsRTL = jest.fn();
6
-
7
- jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
8
- useIsRTL: mockUseIsRTL,
9
- }));
10
-
11
- const mockUseFocusManager = jest.fn();
12
-
13
- jest.mock("@applicaster/zapp-react-native-utils/focusManager", () => ({
14
- useFocusManager: mockUseFocusManager,
15
- }));
16
-
17
- const mockUsePrevious = jest.fn();
18
-
19
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => ({
20
- usePrevious: mockUsePrevious,
21
- }));
22
-
23
- const { Focusable } = require("../index.android");
24
-
25
- describe("Focusable", () => {
26
- const mockFocusManager = {
27
- isFocused: jest.fn(),
28
- onDisableFocusChange: jest.fn(),
29
- registerFocusable: jest.fn(),
30
- focusedId: "test-id",
31
- };
32
-
33
- beforeEach(() => {
34
- jest.clearAllMocks();
35
- mockUseIsRTL.mockReturnValue(false);
36
- mockUseFocusManager.mockReturnValue(mockFocusManager);
37
- mockUsePrevious.mockReturnValue(false);
38
- });
39
-
40
- it("updates disableFocus state when disableFocus prop changes", () => {
41
- const { rerender } = render(
42
- <Focusable id="test-id" disableFocus={false}>
43
- <Touchable testID="touchable" />
44
- </Focusable>
45
- );
46
-
47
- rerender(
48
- <Focusable id="test-id" disableFocus={true}>
49
- <Touchable testID="touchable" />
50
- </Focusable>
51
- );
52
-
53
- expect(mockFocusManager.onDisableFocusChange).toHaveBeenCalledWith(
54
- "test-id"
55
- );
56
- });
57
-
58
- it("calls focusManager.registerFocusable on mount and unregisters on unmount", () => {
59
- const unregister = jest.fn();
60
- mockFocusManager.registerFocusable.mockReturnValue(unregister);
61
-
62
- const { unmount } = render(
63
- <Focusable id="test-id">
64
- <Touchable testID="touchable" />
65
- </Focusable>
66
- );
67
-
68
- expect(mockFocusManager.registerFocusable).toHaveBeenCalled();
69
- act(() => unmount());
70
- expect(unregister).toHaveBeenCalled();
71
- });
72
- });
@@ -1,87 +0,0 @@
1
- import React from "react";
2
- import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
3
- import { fireEvent } from "@testing-library/react-native";
4
-
5
- const mockUseIsRTL = jest.fn(() => true);
6
-
7
- jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
8
- useIsRTL: mockUseIsRTL,
9
- }));
10
-
11
- const BarView = require("../BarView").default;
12
-
13
- describe("BarView", () => {
14
- const screenStyles = {
15
- title_font_color: "#000",
16
- title_font_android: "Roboto",
17
- title_font_ios: "San Francisco",
18
- title_font_size: "16",
19
- background_color: "#fff",
20
- };
21
-
22
- const barState = {
23
- backHandler: jest.fn(),
24
- closeHandler: jest.fn(),
25
- title: "Test Title",
26
- };
27
-
28
- beforeEach(() => {
29
- jest.clearAllMocks();
30
- });
31
-
32
- it("renders without crashing", () => {
33
- mockUseIsRTL.mockReturnValue(false);
34
-
35
- const { getByText } = renderWithProviders(
36
- <BarView screenStyles={screenStyles} barState={barState} />
37
- );
38
-
39
- expect(getByText("Test Title")).toBeTruthy();
40
- });
41
-
42
- it("applies RTL styles when isRTL is true", () => {
43
- mockUseIsRTL.mockReturnValue(true);
44
-
45
- const { getByTestId } = renderWithProviders(
46
- <BarView screenStyles={screenStyles} barState={barState} />
47
- );
48
-
49
- expect(getByTestId("BarView-safeAreaView").props.style).toContainEqual({
50
- transform: [{ scaleX: -1 }],
51
- });
52
- });
53
-
54
- it("does not apply RTL styles when isRTL is false", () => {
55
- mockUseIsRTL.mockReturnValue(false);
56
-
57
- const { getByTestId } = renderWithProviders(
58
- <BarView screenStyles={screenStyles} barState={barState} />
59
- );
60
-
61
- expect(getByTestId("BarView-safeAreaView").props.style).not.toContainEqual({
62
- transform: [{ scaleX: -1 }],
63
- });
64
- });
65
-
66
- it("calls closeHandler when CloseButton is pressed", () => {
67
- mockUseIsRTL.mockReturnValue(false);
68
-
69
- const { getByTestId } = renderWithProviders(
70
- <BarView screenStyles={screenStyles} barState={barState} />
71
- );
72
-
73
- fireEvent.press(getByTestId("closeButton-actionButton-touchable"));
74
- expect(barState.closeHandler).toHaveBeenCalled();
75
- });
76
-
77
- it("calls backHandler when BackButton is pressed", () => {
78
- mockUseIsRTL.mockReturnValue(false);
79
-
80
- const { getByTestId } = renderWithProviders(
81
- <BarView screenStyles={screenStyles} barState={barState} />
82
- );
83
-
84
- fireEvent.press(getByTestId("backButton-actionButton-touchable"));
85
- expect(barState.backHandler).toHaveBeenCalled();
86
- });
87
- });