@applicaster/zapp-react-native-ui-components 13.0.0-alpha.7330390362 → 13.0.0-alpha.7620873141
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/AppContainer/__tests__/AppContainer.test.js +4 -6
- package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
- package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +54 -111
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +36 -20
- package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
- package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
- package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
- package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
- package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
- package/Components/AudioPlayer/__tests__/title.test.js +3 -5
- package/Components/AudioPlayer/helpers.tsx +1 -0
- package/Components/BaseFocusable/index.tsx +1 -2
- package/Components/Cell/Cell.tsx +4 -13
- package/Components/Cell/CellWithFocusable.tsx +22 -15
- package/Components/Cell/CellWrapper.tsx +18 -0
- package/Components/Cell/TvOSCellComponent.tsx +20 -22
- package/Components/Cell/index.js +3 -1
- package/Components/Cell/styles.ts +17 -0
- package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +46 -48
- package/Components/CellRendererResolver/index.ts +2 -1
- package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
- package/Components/ComponentResolver/__tests__/componentResolver.test.js +16 -22
- package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
- package/Components/ErrorScreen/index.tsx +14 -6
- package/Components/Focusable/Focusable.tsx +1 -0
- package/Components/Focusable/FocusableTvOS.tsx +5 -1
- package/Components/Focusable/index.android.tsx +10 -3
- package/Components/FocusableCell/index.tsx +1 -1
- package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
- package/Components/FocusableGroup/index.tsx +0 -3
- package/Components/FocusableList/index.tsx +26 -9
- package/Components/FocusableScrollView/index.tsx +43 -13
- package/Components/HandlePlayable/HandlePlayable.tsx +21 -27
- package/Components/Layout/TV/LayoutBackground.tsx +28 -0
- package/Components/Layout/TV/NavBarContainer.tsx +19 -23
- package/Components/Layout/TV/ScreenContainer.tsx +8 -2
- package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
- package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +2 -1
- package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -2
- package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +3 -2
- package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +15 -10
- package/Components/Layout/TV/__tests__/index.test.tsx +8 -2
- package/Components/Layout/TV/index.tsx +6 -20
- package/Components/Layout/TV/index.web.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
- package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +0 -6
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +4 -9
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/const.ts +3 -0
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +6 -6
- package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
- package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +4 -12
- package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +0 -229
- package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
- package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
- package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
- package/Components/MasterCell/utils/index.ts +8 -134
- package/Components/ModalComponent/BottomSheetModalContent.tsx +45 -19
- package/Components/ModalComponent/Button/Item.tsx +6 -5
- package/Components/ModalComponent/Button/assets.ts +1 -1
- package/Components/ModalComponent/Button/index.tsx +30 -43
- package/Components/ModalComponent/utils.ts +55 -7
- package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
- package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
- package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
- package/Components/OfflineHandler/utils/index.ts +1 -1
- package/Components/PlayerContainer/PlayerContainer.tsx +40 -14
- package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
- package/Components/PlayerImageBackground/index.tsx +1 -1
- package/Components/River/ComponentsMap/ComponentsMap.tsx +3 -0
- package/Components/River/ComponentsMap/hooks/useLoadingState.ts +3 -3
- package/Components/River/RiverItem.tsx +2 -1
- package/Components/River/TV/index.tsx +6 -1
- package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
- package/Components/River/__tests__/river.test.js +75 -40
- package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +11 -4
- package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
- package/Components/RouteManager/__tests__/testId.test.js +8 -6
- package/Components/Screen/TV/index.web.tsx +5 -6
- package/Components/Screen/hooks.ts +3 -6
- package/Components/Screen/index.tsx +4 -4
- package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
- package/Components/Tabs/Tab.tsx +5 -3
- package/Components/TextInputTv/index.tsx +2 -1
- package/Components/TopMarginApplicator/TopMarginApplicator.tsx +2 -3
- package/Components/TrackedView/index.tsx +1 -0
- package/Components/Transitioner/AnimationManager.js +15 -15
- package/Components/Transitioner/Scene.tsx +1 -1
- package/Components/Transitioner/Transitioner.tsx +3 -3
- package/Components/Transitioner/__tests__/Scene.test.js +25 -14
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -68
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
- package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +7 -3
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +46 -30
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +45 -20
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +10 -3
- package/Components/VideoModal/ModalAnimation/__tests__/getMoveUpValue.test.ts +108 -0
- package/Components/VideoModal/ModalAnimation/const.ts +5 -0
- package/Components/VideoModal/ModalAnimation/index.ts +2 -0
- package/Components/VideoModal/ModalAnimation/utils.ts +36 -0
- package/Components/VideoModal/PlayerDetails.tsx +18 -10
- package/Components/VideoModal/PlayerWrapper.tsx +28 -5
- package/Components/VideoModal/VideoModal.tsx +19 -4
- package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +2 -40
- package/Components/VideoModal/utils.ts +3 -4
- package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
- package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
- package/Components/Viewport/__tests__/utils.test.js +5 -4
- package/Components/ZappUIComponent/Placeholder.tsx +3 -1
- package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
- package/Components/ZappUIComponent/index.tsx +4 -17
- package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
- package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
- package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
- package/Contexts/FocusableGroupContext/withFocusableContext.tsx +4 -10
- package/Contexts/HeaderOffsetContext/index.tsx +4 -6
- package/Contexts/ScreenContext/index.tsx +3 -10
- package/Contexts/ScreenLayoutContext/index.tsx +5 -3
- package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
- package/Decorators/Navigator/index.tsx +1 -1
- package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
- package/Decorators/RiverResolver/index.tsx +6 -8
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
- package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
- package/package.json +7 -11
- package/tsconfig.json +2 -3
- package/.babelrc +0 -8
- package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
- package/Components/Cell/CellStyles/Hero/index.js +0 -111
- package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
- package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
- package/Components/Cell/CellStyles/colors.js +0 -40
- package/Components/Cell/CellStyles/index.js +0 -15
- package/Components/Cell/CellWithFocusable.ios.tsx +0 -126
- package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
- package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
- package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
- package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
- package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
- package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
- package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
|
@@ -2,6 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { View, ViewProps, ViewStyle } from "react-native";
|
|
3
3
|
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
4
4
|
import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
5
|
+
import { isFirstComponentScreenPicker } from "@applicaster/zapp-react-native-utils/componentsUtils";
|
|
5
6
|
|
|
6
7
|
interface IProps {
|
|
7
8
|
targetScreenId?: string;
|
|
@@ -31,11 +32,9 @@ export const useMarginTop = (targetScreenId: string): number => {
|
|
|
31
32
|
* ScreenPicker is a component but should really be a screen.
|
|
32
33
|
* We need to skip margin top for it as it's already applied to the target screen
|
|
33
34
|
**/
|
|
34
|
-
const isScreenPicker =
|
|
35
|
-
screenData?.ui_components?.[0]?.component_type === "screen-picker-qb-tv";
|
|
36
35
|
|
|
37
36
|
// ignore margin on screenPicker
|
|
38
|
-
if (
|
|
37
|
+
if (isFirstComponentScreenPicker(screenData?.ui_components)) {
|
|
39
38
|
return 0;
|
|
40
39
|
}
|
|
41
40
|
|
|
@@ -12,6 +12,7 @@ type TrackedViewProps = {
|
|
|
12
12
|
onPositionUpdated: (props: { rect?: Record<string, number> }) => void;
|
|
13
13
|
testId?: string | undefined;
|
|
14
14
|
groupId?: string;
|
|
15
|
+
clipThreshold?: number;
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
export const TrackedView = memo(function TrackedView(props: TrackedViewProps) {
|
|
@@ -2,21 +2,21 @@ import { Animated } from "react-native";
|
|
|
2
2
|
|
|
3
3
|
import { NAV_ACTION_PUSH, NAV_ACTION_BACK } from "./Transitioner";
|
|
4
4
|
|
|
5
|
-
type TransitionConfig = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
5
|
+
// type TransitionConfig = {
|
|
6
|
+
// duration: number;
|
|
7
|
+
// easing: any;
|
|
8
|
+
// from: {
|
|
9
|
+
// style: any;
|
|
10
|
+
// };
|
|
11
|
+
// to: {
|
|
12
|
+
// style: any;
|
|
13
|
+
// };
|
|
14
|
+
// };
|
|
15
15
|
|
|
16
|
-
type Props = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
16
|
+
// type Props = {
|
|
17
|
+
// transitionConfig: TransitionConfig;
|
|
18
|
+
// contentStyle: { [string]: any };
|
|
19
|
+
// };
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Manages animation for the Transitioner,
|
|
@@ -25,7 +25,7 @@ type Props = {
|
|
|
25
25
|
* which must have a proper structure, see types above ^.
|
|
26
26
|
*/
|
|
27
27
|
export class AnimationManager {
|
|
28
|
-
constructor(props
|
|
28
|
+
constructor(props) {
|
|
29
29
|
this.animatedValue = new Animated.Value(0.0);
|
|
30
30
|
|
|
31
31
|
this.config = props.transitionConfig(
|
|
@@ -105,7 +105,7 @@ function SceneComponent({
|
|
|
105
105
|
style={[style, contentStyle, dimensions]}
|
|
106
106
|
>
|
|
107
107
|
{children}
|
|
108
|
-
{isAnimating
|
|
108
|
+
{isAnimating ? <Animated.View style={overlayStyle} /> : null}
|
|
109
109
|
</Animated.View>
|
|
110
110
|
);
|
|
111
111
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { View } from "react-native";
|
|
3
|
-
import {
|
|
3
|
+
import { append, compose, identity, isNil, tail, take, update } from "ramda";
|
|
4
4
|
|
|
5
5
|
import { AnimationManager } from "./AnimationManager";
|
|
6
6
|
import { Scene } from "./Scene";
|
|
@@ -289,7 +289,7 @@ export class TransitionerComponent extends React.PureComponent<Props, State> {
|
|
|
289
289
|
|
|
290
290
|
return (
|
|
291
291
|
<View style={styles.container}>
|
|
292
|
-
{scenes[to.index]
|
|
292
|
+
{scenes[to.index] ? (
|
|
293
293
|
<Scene
|
|
294
294
|
{...{ style: to?.style || {} }}
|
|
295
295
|
pathname={pathname}
|
|
@@ -301,7 +301,7 @@ export class TransitionerComponent extends React.PureComponent<Props, State> {
|
|
|
301
301
|
>
|
|
302
302
|
{scenes[to.index].children}
|
|
303
303
|
</Scene>
|
|
304
|
-
)}
|
|
304
|
+
) : null}
|
|
305
305
|
</View>
|
|
306
306
|
);
|
|
307
307
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { render } from "@testing-library/react-native";
|
|
3
|
+
|
|
4
|
+
import { Scene } from "../Scene";
|
|
4
5
|
|
|
5
6
|
const overlayStyle = { opacity: 1 };
|
|
6
7
|
const contentStyle = { paddingBottom: 49 };
|
|
@@ -23,28 +24,38 @@ jest.mock(
|
|
|
23
24
|
})
|
|
24
25
|
);
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
jest.mock("../../../Contexts/PathnameContext", () => ({
|
|
28
|
+
PathnameContext: jest.requireActual("react").createContext({ pathname: "" }),
|
|
29
|
+
}));
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
);
|
|
31
|
+
jest.mock("../../../Contexts/ScreenDataContext", () => ({
|
|
32
|
+
ScreenDataContext: jest.requireActual("react").createContext({}),
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
jest.mock("../../../Contexts/ScreenContext", () => ({
|
|
36
|
+
ScreenContextProvider: jest.requireActual("react-native").View,
|
|
37
|
+
}));
|
|
35
38
|
|
|
36
39
|
describe("<Scene />", () => {
|
|
40
|
+
const wrapper = render(
|
|
41
|
+
<Scene
|
|
42
|
+
style={style}
|
|
43
|
+
overlayStyle={overlayStyle}
|
|
44
|
+
contentStyle={contentStyle}
|
|
45
|
+
/>
|
|
46
|
+
);
|
|
47
|
+
|
|
37
48
|
it("renders correctly", () => {
|
|
38
|
-
expect(
|
|
49
|
+
expect(wrapper.toJSON()).toMatchSnapshot();
|
|
39
50
|
});
|
|
40
51
|
|
|
41
52
|
// skipped - this isn't a very useful test, and it doesn't work as it used to on the new version of RN
|
|
42
53
|
it.skip("renders children surrounded by AnimatedComponent", () => {
|
|
43
|
-
expect(
|
|
54
|
+
expect(wrapper.toJSON()).toEqual("AnimatedComponent");
|
|
44
55
|
});
|
|
45
56
|
|
|
46
57
|
it("renders the overlay while animating", () => {
|
|
47
|
-
const wrapperWithOverlay =
|
|
58
|
+
const wrapperWithOverlay = render(
|
|
48
59
|
<Scene
|
|
49
60
|
style={style}
|
|
50
61
|
overlayStyle={overlayStyle}
|
|
@@ -53,6 +64,6 @@ describe("<Scene />", () => {
|
|
|
53
64
|
/>
|
|
54
65
|
);
|
|
55
66
|
|
|
56
|
-
expect(
|
|
67
|
+
expect(wrapperWithOverlay.toJSON).toMatchSnapshot();
|
|
57
68
|
});
|
|
58
69
|
});
|
|
@@ -1,79 +1,23 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`<Scene /> renders correctly 1`] = `
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
{
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
overlayStyle={
|
|
11
|
-
{
|
|
12
|
-
"opacity": 1,
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
style={
|
|
16
|
-
{
|
|
17
|
-
"flex": 1,
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
>
|
|
21
|
-
<SceneComponent
|
|
22
|
-
contentStyle={
|
|
23
|
-
{
|
|
24
|
-
"paddingBottom": 49,
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
overlayStyle={
|
|
28
|
-
{
|
|
29
|
-
"opacity": 1,
|
|
30
|
-
}
|
|
31
|
-
}
|
|
4
|
+
<View>
|
|
5
|
+
<View
|
|
6
|
+
collapsable={false}
|
|
7
|
+
pointerEvents="auto"
|
|
32
8
|
style={
|
|
33
9
|
{
|
|
34
10
|
"flex": 1,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
/>
|
|
38
|
-
</CurrentScreenContextProvider>
|
|
39
|
-
`;
|
|
40
|
-
|
|
41
|
-
exports[`<Scene /> renders the overlay while animating 1`] = `
|
|
42
|
-
<CurrentScreenContextProvider
|
|
43
|
-
animating={true}
|
|
44
|
-
contentStyle={
|
|
45
|
-
{
|
|
46
|
-
"paddingBottom": 49,
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
overlayStyle={
|
|
50
|
-
{
|
|
51
|
-
"opacity": 1,
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
style={
|
|
55
|
-
{
|
|
56
|
-
"flex": 1,
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
>
|
|
60
|
-
<SceneComponent
|
|
61
|
-
animating={true}
|
|
62
|
-
contentStyle={
|
|
63
|
-
{
|
|
11
|
+
"fontScale": 2,
|
|
12
|
+
"height": 1334,
|
|
64
13
|
"paddingBottom": 49,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
{
|
|
69
|
-
"opacity": 1,
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
style={
|
|
73
|
-
{
|
|
74
|
-
"flex": 1,
|
|
14
|
+
"scale": 2,
|
|
15
|
+
"statusBarHeight": null,
|
|
16
|
+
"width": 750,
|
|
75
17
|
}
|
|
76
18
|
}
|
|
77
19
|
/>
|
|
78
|
-
</
|
|
20
|
+
</View>
|
|
79
21
|
`;
|
|
22
|
+
|
|
23
|
+
exports[`<Scene /> renders the overlay while animating 1`] = `[Function]`;
|
|
@@ -9,7 +9,7 @@ exports[`<TransitionerComponent /> renders correctly 1`] = `
|
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
>
|
|
12
|
-
<
|
|
12
|
+
<View
|
|
13
13
|
isActive={true}
|
|
14
14
|
screenUniqueId="mocked-uuid"
|
|
15
15
|
style={{}}
|
|
@@ -23,6 +23,6 @@ exports[`<TransitionerComponent /> renders correctly 1`] = `
|
|
|
23
23
|
children
|
|
24
24
|
</Text>
|
|
25
25
|
</View>
|
|
26
|
-
</
|
|
26
|
+
</View>
|
|
27
27
|
</View>
|
|
28
28
|
`;
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Text, View } from "react-native";
|
|
3
|
-
import { shallow } from "enzyme";
|
|
4
|
-
import { shallowToJson } from "enzyme-to-json";
|
|
5
3
|
|
|
6
4
|
import { TransitionerComponent } from "../Transitioner";
|
|
5
|
+
import { render } from "@testing-library/react-native";
|
|
6
|
+
|
|
7
|
+
jest.mock("../Scene", () => {
|
|
8
|
+
const View = jest.requireActual("react-native").View;
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
Scene(props) {
|
|
12
|
+
return <View {...props} />;
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
});
|
|
7
16
|
|
|
8
17
|
const children = (
|
|
9
18
|
<View foo="bar">
|
|
@@ -33,12 +42,12 @@ jest.mock("uuid");
|
|
|
33
42
|
|
|
34
43
|
describe("<TransitionerComponent />", () => {
|
|
35
44
|
it("renders correctly", () => {
|
|
36
|
-
const wrapper =
|
|
45
|
+
const wrapper = render(
|
|
37
46
|
<TransitionerComponent {...transitionerComponentProps}>
|
|
38
47
|
{children}
|
|
39
48
|
</TransitionerComponent>
|
|
40
49
|
);
|
|
41
50
|
|
|
42
|
-
expect(
|
|
51
|
+
expect(wrapper.toJSON()).toMatchSnapshot();
|
|
43
52
|
});
|
|
44
53
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// /// <reference types="@applicaster/applicaster-types" />
|
|
2
2
|
//
|
|
3
3
|
import * as React from "react";
|
|
4
|
+
import { useEffect } from "react";
|
|
4
5
|
|
|
5
6
|
import { AppState, AppStateStatus, View } from "react-native";
|
|
6
7
|
import { TrackedView } from "../TrackedView";
|
|
@@ -25,13 +26,15 @@ import { PlayerRole } from "@applicaster/zapp-react-native-utils/appUtils/player
|
|
|
25
26
|
import { getAutoplaySettings } from "./utils";
|
|
26
27
|
import { isString } from "@applicaster/zapp-react-native-utils/stringUtils";
|
|
27
28
|
import { BufferAnimation } from "../PlayerContainer/BufferAnimation";
|
|
28
|
-
import { useEffect } from "react";
|
|
29
29
|
|
|
30
30
|
const { log_error, log_debug } = loggerLiveImageComponent;
|
|
31
31
|
|
|
32
32
|
const isMeasurement = (item: ZappEntry) =>
|
|
33
33
|
isString(item.id) && item.id.startsWith("pre-measurement-");
|
|
34
34
|
|
|
35
|
+
// Pixels by which the view can slightly extend outside the viewport and still be considered fully visible.
|
|
36
|
+
const CLIP_THRESHOLD = 10;
|
|
37
|
+
|
|
35
38
|
type Props = {
|
|
36
39
|
item: ZappEntry;
|
|
37
40
|
style: Record<string, any>;
|
|
@@ -328,9 +331,10 @@ const PlayerLiveImageComponent = (props: Props) => {
|
|
|
328
331
|
<TrackedView
|
|
329
332
|
testId={`tracked-view-${playerId}-${item.title}`}
|
|
330
333
|
onPositionUpdated={onPositionUpdated}
|
|
334
|
+
clipThreshold={CLIP_THRESHOLD}
|
|
331
335
|
>
|
|
332
336
|
<View ref={trackViewRef}>
|
|
333
|
-
{isVideoMode
|
|
337
|
+
{isVideoMode ? (
|
|
334
338
|
<Player
|
|
335
339
|
autoplay={false}
|
|
336
340
|
ref={_assignRoot}
|
|
@@ -342,7 +346,7 @@ const PlayerLiveImageComponent = (props: Props) => {
|
|
|
342
346
|
resizeMode={"cover"}
|
|
343
347
|
{...platformSpecificProps}
|
|
344
348
|
/>
|
|
345
|
-
)}
|
|
349
|
+
) : null}
|
|
346
350
|
{
|
|
347
351
|
<AnimatedInOut
|
|
348
352
|
visible={isBackgroundImageVisible}
|
|
@@ -46,7 +46,7 @@ export const AnimatedPlayerModalWrapper = (props: Props) => {
|
|
|
46
46
|
|
|
47
47
|
React.useEffect(() => {
|
|
48
48
|
(playerAnimationState === PlayerAnimationStateEnum.minimize ||
|
|
49
|
-
playerAnimationState === PlayerAnimationStateEnum.
|
|
49
|
+
playerAnimationState === PlayerAnimationStateEnum.maximize) &&
|
|
50
50
|
setStartComponentsAnimation(true);
|
|
51
51
|
}, [playerAnimationState]);
|
|
52
52
|
|
|
@@ -1,32 +1,34 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Animated, StyleSheet, View
|
|
2
|
+
import { Animated, Platform, StyleSheet, View } from "react-native";
|
|
3
3
|
|
|
4
4
|
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
5
5
|
import {
|
|
6
|
+
GestureHandlerRootView,
|
|
6
7
|
NativeViewGestureHandler,
|
|
7
8
|
PanGestureHandler,
|
|
8
9
|
State,
|
|
9
10
|
TapGestureHandler,
|
|
10
|
-
GestureHandlerRootView,
|
|
11
11
|
} from "react-native-gesture-handler";
|
|
12
12
|
|
|
13
13
|
import { PlayerContainerContext } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainerContext";
|
|
14
14
|
import {
|
|
15
|
-
useModalAnimationContext,
|
|
16
15
|
PlayerAnimationStateEnum,
|
|
16
|
+
useModalAnimationContext,
|
|
17
17
|
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
18
18
|
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
19
19
|
import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
|
-
setScrollModalAnimatedValue,
|
|
23
22
|
resetScrollAnimatedValues,
|
|
23
|
+
setScrollModalAnimatedValue,
|
|
24
24
|
} from "./utils";
|
|
25
25
|
|
|
26
|
+
import { DURATION_TO_MINIMIZE } from "./const";
|
|
27
|
+
|
|
26
28
|
const getAnimatedConfig = (toValue) => {
|
|
27
29
|
return {
|
|
28
30
|
toValue,
|
|
29
|
-
duration:
|
|
31
|
+
duration: DURATION_TO_MINIMIZE,
|
|
30
32
|
useNativeDriver: true,
|
|
31
33
|
};
|
|
32
34
|
};
|
|
@@ -70,21 +72,26 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
70
72
|
const { maximiseVideoModal, minimiseVideoModal, videoModalState } =
|
|
71
73
|
useNavigation();
|
|
72
74
|
|
|
73
|
-
const {
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
const {
|
|
76
|
+
mode: videoModalMode,
|
|
77
|
+
previousMode: previousVideoModalMode,
|
|
78
|
+
item: videoModalItem,
|
|
79
|
+
} = videoModalState;
|
|
80
|
+
|
|
81
|
+
const isMaximizedModal: boolean = videoModalMode === "MAXIMIZED";
|
|
82
|
+
const isMinimizedModal: boolean = videoModalMode === "MINIMIZED";
|
|
76
83
|
const previousItemId = usePrevious(videoModalItem?.id);
|
|
77
84
|
|
|
78
85
|
const isNotMinimizeMaximazeAnimation =
|
|
79
86
|
playerAnimationState !== PlayerAnimationStateEnum.minimize &&
|
|
80
|
-
playerAnimationState !== PlayerAnimationStateEnum.
|
|
87
|
+
playerAnimationState !== PlayerAnimationStateEnum.maximize;
|
|
81
88
|
|
|
82
89
|
const isEnablePanGesture =
|
|
83
90
|
enableGesture &&
|
|
84
91
|
!isLanguageOverlayVisible &&
|
|
85
92
|
isNotMinimizeMaximazeAnimation &&
|
|
86
93
|
!isSeekBarTouch &&
|
|
87
|
-
(
|
|
94
|
+
(isMaximizedModal || isMinimizedModal);
|
|
88
95
|
|
|
89
96
|
const isAudioItem = React.useMemo(
|
|
90
97
|
() =>
|
|
@@ -121,7 +128,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
121
128
|
const preparedTranslationY =
|
|
122
129
|
Math.abs(translationY) - lastScrollYValue.current;
|
|
123
130
|
|
|
124
|
-
if (
|
|
131
|
+
if (isMaximizedModal) {
|
|
125
132
|
const endOffsetY =
|
|
126
133
|
lastSnap + preparedTranslationY + dragToss * velocityY + 150;
|
|
127
134
|
|
|
@@ -143,8 +150,8 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
143
150
|
translateYOffset.flattenOffset();
|
|
144
151
|
dragScrollY.setValue(0);
|
|
145
152
|
|
|
146
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.
|
|
147
|
-
} else {
|
|
153
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
|
|
154
|
+
} else if (destSnapPoint !== modalSnapPoints[0] && isMaximizedModal) {
|
|
148
155
|
setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
|
|
149
156
|
}
|
|
150
157
|
} else {
|
|
@@ -158,7 +165,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
158
165
|
|
|
159
166
|
dragScrollY.setValue(0);
|
|
160
167
|
|
|
161
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.
|
|
168
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
|
|
162
169
|
} else {
|
|
163
170
|
resetPlayerAnimationState();
|
|
164
171
|
}
|
|
@@ -168,7 +175,13 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
168
175
|
resetPlayerAnimationState();
|
|
169
176
|
}
|
|
170
177
|
},
|
|
171
|
-
[
|
|
178
|
+
[
|
|
179
|
+
lastSnap,
|
|
180
|
+
modalSnapPoints,
|
|
181
|
+
playerAnimationState,
|
|
182
|
+
isMinimizedModal,
|
|
183
|
+
isMaximizedModal,
|
|
184
|
+
]
|
|
172
185
|
);
|
|
173
186
|
|
|
174
187
|
const onScroll = React.useCallback(({ nativeEvent }) => {
|
|
@@ -219,17 +232,18 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
219
232
|
}, []);
|
|
220
233
|
|
|
221
234
|
React.useEffect(() => {
|
|
222
|
-
const { mode, previousMode, item } = videoModalState;
|
|
223
|
-
|
|
224
235
|
if (
|
|
225
|
-
|
|
236
|
+
videoModalMode === "MAXIMIZED" &&
|
|
226
237
|
!enableGesture &&
|
|
227
238
|
scrollPosition.current === 0
|
|
228
239
|
) {
|
|
229
240
|
setIEnableGesture(true);
|
|
230
241
|
}
|
|
231
242
|
|
|
232
|
-
if (
|
|
243
|
+
if (
|
|
244
|
+
videoModalMode === "MINIMIZED" &&
|
|
245
|
+
previousVideoModalMode === "MAXIMIZED"
|
|
246
|
+
) {
|
|
233
247
|
// set animation to the minimize values if moving from the player to another screen
|
|
234
248
|
if (playerAnimationState === null) {
|
|
235
249
|
setScrollModalAnimatedValue(
|
|
@@ -247,14 +261,16 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
247
261
|
}
|
|
248
262
|
} else if (
|
|
249
263
|
playerAnimationState === null &&
|
|
250
|
-
((previousItemId ===
|
|
251
|
-
|
|
252
|
-
(
|
|
253
|
-
|
|
264
|
+
((previousItemId === videoModalItem?.id &&
|
|
265
|
+
videoModalMode === "MAXIMIZED" &&
|
|
266
|
+
(previousVideoModalMode === "MINIMIZED" ||
|
|
267
|
+
previousVideoModalMode === "MAXIMIZED")) ||
|
|
268
|
+
(previousItemId !== videoModalItem?.id &&
|
|
269
|
+
videoModalMode !== "FULLSCREEN"))
|
|
254
270
|
) {
|
|
255
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.
|
|
271
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
|
|
256
272
|
}
|
|
257
|
-
}, [
|
|
273
|
+
}, [videoModalMode, previousVideoModalMode, videoModalItem]);
|
|
258
274
|
|
|
259
275
|
React.useEffect(() => {
|
|
260
276
|
if (playerAnimationState === PlayerAnimationStateEnum.minimize) {
|
|
@@ -296,7 +312,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
296
312
|
|
|
297
313
|
resetPlayerAnimationState();
|
|
298
314
|
});
|
|
299
|
-
} else if (playerAnimationState === PlayerAnimationStateEnum.
|
|
315
|
+
} else if (playerAnimationState === PlayerAnimationStateEnum.maximize) {
|
|
300
316
|
Animated.timing(translateYOffset, getAnimatedConfig(0)).start(() => {
|
|
301
317
|
maximiseVideoModal();
|
|
302
318
|
setScrollModalAnimatedValue(translateYOffset, 0, setLastSnap);
|
|
@@ -346,6 +362,8 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
346
362
|
[]
|
|
347
363
|
);
|
|
348
364
|
|
|
365
|
+
const scrollEnabled = isMaximizedModal && isNotMinimizeMaximazeAnimation;
|
|
366
|
+
|
|
349
367
|
return (
|
|
350
368
|
<Wrapper style={generalStyles.container}>
|
|
351
369
|
<TapGestureHandler
|
|
@@ -359,7 +377,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
359
377
|
enabled={isEnablePanGesture}
|
|
360
378
|
ref={panHandlerRef}
|
|
361
379
|
simultaneousHandlers={[scrollRef, tapHandlerRef]}
|
|
362
|
-
shouldCancelWhenOutside={
|
|
380
|
+
shouldCancelWhenOutside={isMaximizedModal}
|
|
363
381
|
onGestureEvent={onGestureEvent}
|
|
364
382
|
onHandlerStateChange={onHandlerStateChange}
|
|
365
383
|
activeOffsetY={[-5, 5]}
|
|
@@ -371,9 +389,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
371
389
|
simultaneousHandlers={panHandlerRef}
|
|
372
390
|
>
|
|
373
391
|
<Animated.ScrollView
|
|
374
|
-
scrollEnabled={
|
|
375
|
-
isMaximazedModal && isNotMinimizeMaximazeAnimation
|
|
376
|
-
}
|
|
392
|
+
scrollEnabled={scrollEnabled}
|
|
377
393
|
bounces={false}
|
|
378
394
|
onScrollBeginDrag={onRegisterLastScroll}
|
|
379
395
|
onScroll={onScroll}
|
|
@@ -50,7 +50,7 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
50
50
|
|
|
51
51
|
const isNotMinimizeMaximazeAnimation =
|
|
52
52
|
playerAnimationState !== PlayerAnimationStateEnum.minimize &&
|
|
53
|
-
playerAnimationState !== PlayerAnimationStateEnum.
|
|
53
|
+
playerAnimationState !== PlayerAnimationStateEnum.maximize;
|
|
54
54
|
|
|
55
55
|
const isEnablePanGesture =
|
|
56
56
|
!isLanguageOverlayVisible &&
|
|
@@ -89,7 +89,7 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
89
89
|
setLastSnap(destSnapPoint);
|
|
90
90
|
|
|
91
91
|
if (destSnapPoint === modalSnapPoints[0]) {
|
|
92
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.
|
|
92
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
|
|
93
93
|
} else {
|
|
94
94
|
lastScrollY.setValue(0);
|
|
95
95
|
lastScrollYValue.current = 0;
|
|
@@ -105,7 +105,7 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
105
105
|
modalSnapPoints[1] - preparedTranslationY
|
|
106
106
|
);
|
|
107
107
|
|
|
108
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.
|
|
108
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
|
|
109
109
|
} else {
|
|
110
110
|
resetPlayerAnimationState();
|
|
111
111
|
}
|