@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.
- package/Components/Focusable/index.android.tsx +9 -15
- package/Components/FocusableList/FocusableChild.ts +4 -2
- package/Components/FocusableList/index.tsx +12 -11
- package/Components/FocusableScrollView/index.tsx +1 -1
- package/Components/Image/Image.android.tsx +1 -1
- package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +0 -12
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -6
- package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +2 -2
- package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
- package/Components/PlayerContainer/PlayerContainer.tsx +8 -14
- package/Components/Transitioner/Transitioner.tsx +3 -13
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +0 -5
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +1 -2
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +3 -11
- package/Components/VideoModal/PlayerDetails.tsx +2 -16
- package/Components/VideoModal/PlayerWrapper.tsx +10 -40
- package/Components/VideoModal/VideoModal.tsx +27 -33
- package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -7
- package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +0 -2
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +10 -56
- package/Components/ZappFrameworkComponents/BarView/BarView.tsx +1 -4
- package/Components/ZappFrameworkComponents/BarView/Buttons/BackButton.tsx +2 -7
- package/Components/ZappFrameworkComponents/BarView/Buttons/CloseButton.tsx +2 -7
- package/Components/ZappFrameworkComponents/Buttons/ActionButton.tsx +4 -9
- package/Contexts/CachedDimensionsContext/index.ts +9 -13
- package/Contexts/ConfirmDialogState/index.ts +1 -1
- package/Contexts/ScreenContext/index.tsx +1 -6
- package/const.ts +0 -6
- package/index.js +0 -3
- package/package.json +5 -5
- package/Components/Focusable/__tests__/index.android.test.tsx +0 -72
- 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
|
-
|
|
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
|
-
|
|
151
|
+
const contextState = React.useMemo(
|
|
152
|
+
() => ({
|
|
156
153
|
focused,
|
|
157
154
|
...parentFocus,
|
|
158
155
|
ref: touchableRef,
|
|
159
156
|
setIsFocusable,
|
|
160
|
-
}
|
|
161
|
-
|
|
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
|
-
{
|
|
179
|
-
()
|
|
180
|
-
|
|
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,
|
|
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
|
|
257
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
{...
|
|
303
|
+
{...flatListProps}
|
|
304
304
|
renderItem={renderItem}
|
|
305
305
|
onEndReached={onEndReached}
|
|
306
|
+
keyExtractor={props.keyExtractor}
|
|
306
307
|
initialNumToRender={initialNumToRender}
|
|
307
308
|
/>
|
|
308
309
|
</ChildrenFocusDeactivatorView>
|
|
@@ -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
|
|
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 ||
|
|
34
|
+
defaultSource={placeholderImage || ""}
|
|
35
35
|
style={style}
|
|
36
36
|
source={updatedSource}
|
|
37
|
-
{...R.omit(["source"
|
|
37
|
+
{...R.omit(["source"], otherProps)}
|
|
38
38
|
/>
|
|
39
39
|
);
|
|
40
40
|
}
|
|
@@ -362,15 +362,13 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
362
362
|
const toggleFullscreen = (event) => {
|
|
363
363
|
const { fullscreen = false } = event || {};
|
|
364
364
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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"
|
|
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
|
|
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}
|
|
@@ -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
|
-
|
|
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
|
|
74
|
-
|
|
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
|
|
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
|
|
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
|
-
{
|
|
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
|
|
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
|
-
{
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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":
|
|
31
|
-
"width":
|
|
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":
|
|
137
|
-
"width":
|
|
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":
|
|
365
|
-
"width":
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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}
|
|
53
|
-
<TouchableOpacity onPress={onPress}
|
|
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 =
|
|
34
|
+
const getCachedDimensions = () => {
|
|
36
35
|
return dimensions[id] || initialDimensions();
|
|
37
|
-
}
|
|
36
|
+
};
|
|
38
37
|
|
|
39
|
-
const handleSetCachedDimensions =
|
|
38
|
+
const handleSetCachedDimensions = (newDimensions) => {
|
|
40
39
|
setCachedDimensions(id, newDimensions);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
{
|
|
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
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.
|
|
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.
|
|
38
|
-
"@applicaster/zapp-react-native-bridge": "12.0.0-alpha.
|
|
39
|
-
"@applicaster/zapp-react-native-redux": "12.0.0-alpha.
|
|
40
|
-
"@applicaster/zapp-react-native-utils": "12.0.0-alpha.
|
|
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
|
-
});
|