@applicaster/zapp-react-native-ui-components 13.0.0-alpha.9946926334 → 13.0.0-rc.100
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.ios.ts +1 -1
- package/Components/BaseFocusable/index.tsx +2 -3
- package/Components/Cell/Cell.tsx +11 -16
- package/Components/Cell/CellWithFocusable.tsx +50 -59
- package/Components/Cell/CellWrapper.tsx +18 -0
- package/Components/Cell/TvOSCellComponent.tsx +20 -26
- package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
- 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 +6 -2
- package/Components/Focusable/Touchable.tsx +19 -20
- 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 -10
- 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/BorderContainerView/__tests__/index.test.tsx +66 -0
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +10 -15
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
- package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
- package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
- package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
- 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/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
- package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
- package/Components/MasterCell/utils/behaviorProvider.ts +136 -0
- package/Components/MasterCell/utils/index.ts +9 -135
- 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/Header/index.tsx +3 -3
- 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 +43 -21
- package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
- package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
- package/Components/PlayerImageBackground/index.tsx +1 -1
- package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
- package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
- package/Components/River/RiverFooter.tsx +39 -9
- package/Components/River/RiverItem.tsx +39 -3
- package/Components/River/TV/index.tsx +6 -1
- package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +100 -31
- package/Components/River/__tests__/__snapshots__/river.test.js.snap +20 -82
- package/Components/River/__tests__/componentsMap.test.js +17 -5
- 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 +53 -0
- package/Components/Screen/index.tsx +16 -42
- package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
- package/Components/Tabs/Tab.tsx +11 -9
- package/Components/TextInputTv/index.tsx +4 -3
- 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 +53 -24
- 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 +9 -49
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
- package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
- package/Components/Transitioner/index.js +8 -4
- package/Components/VideoLive/LiveImageManager.ts +27 -1
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +36 -24
- package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +51 -1
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -5
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +51 -31
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +8 -4
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +48 -22
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +12 -6
- 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 +38 -2
- package/Components/VideoModal/OpaqueLayer.tsx +33 -0
- package/Components/VideoModal/PlayerDetails.tsx +18 -10
- package/Components/VideoModal/PlayerWrapper.tsx +43 -39
- package/Components/VideoModal/VideoModal.tsx +17 -11
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -1
- package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +2 -40
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +0 -90
- package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +89 -0
- package/Components/VideoModal/hooks/index.ts +7 -0
- package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +49 -0
- package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +91 -0
- package/Components/VideoModal/hooks/utils/index.ts +33 -0
- package/Components/VideoModal/utils.ts +4 -5
- 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 +6 -12
- 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__/Hero.js +1 -1
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
- package/Decorators/ZappPipesDataConnector/index.tsx +6 -2
- 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/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,8 +2,8 @@
|
|
|
2
2
|
/* eslint-disable react/prop-types */
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { View, Text } from "react-native";
|
|
5
|
-
|
|
6
|
-
import {
|
|
5
|
+
|
|
6
|
+
import { render } from "@testing-library/react-native";
|
|
7
7
|
|
|
8
8
|
import { TestId } from "../TestId";
|
|
9
9
|
|
|
@@ -17,14 +17,16 @@ const screenId = "A1234";
|
|
|
17
17
|
|
|
18
18
|
describe("TestId", () => {
|
|
19
19
|
it("renders correctly and assigns the testID to a wrapping view", () => {
|
|
20
|
-
const wrapper =
|
|
20
|
+
const wrapper = render(
|
|
21
21
|
<TestId screenId={screenId}>
|
|
22
22
|
<TestComponent name="dev test" />
|
|
23
23
|
</TestId>
|
|
24
24
|
);
|
|
25
25
|
|
|
26
|
-
expect(
|
|
27
|
-
|
|
28
|
-
expect(wrapper.
|
|
26
|
+
expect(wrapper.getByTestId(screenId)).toBeTruthy();
|
|
27
|
+
|
|
28
|
+
expect(wrapper.getByTestId(screenId).props.accessibilityLabel).toEqual(
|
|
29
|
+
screenId
|
|
30
|
+
);
|
|
29
31
|
});
|
|
30
32
|
});
|
|
@@ -92,6 +92,10 @@ const getNavigations = ({
|
|
|
92
92
|
return fallbackNavigations;
|
|
93
93
|
};
|
|
94
94
|
|
|
95
|
+
const onRelease = () => {
|
|
96
|
+
focusManager.setInitialFocus();
|
|
97
|
+
};
|
|
98
|
+
|
|
95
99
|
export const Screen = ({ route, Components }: Props) => {
|
|
96
100
|
if (isNilOrEmpty(route)) {
|
|
97
101
|
throw Error("Required props: route is missing");
|
|
@@ -152,12 +156,7 @@ export const Screen = ({ route, Components }: Props) => {
|
|
|
152
156
|
const isScreenActive = useIsScreenActive();
|
|
153
157
|
|
|
154
158
|
return (
|
|
155
|
-
<FreezeWithCallback
|
|
156
|
-
freeze={!isScreenActive}
|
|
157
|
-
onRelease={() => {
|
|
158
|
-
focusManager.setInitialFocus();
|
|
159
|
-
}}
|
|
160
|
-
>
|
|
159
|
+
<FreezeWithCallback freeze={!isScreenActive} onRelease={onRelease}>
|
|
161
160
|
<View style={[styles.container, { backgroundColor }]}>
|
|
162
161
|
<NavBarContainer isVisible={isNavBarVisible} onReady={noop}>
|
|
163
162
|
<NavBar
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
2
|
+
import {
|
|
3
|
+
useGetScreenOrientation,
|
|
4
|
+
isOrientationCompatible,
|
|
5
|
+
} from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
|
|
6
|
+
import {
|
|
7
|
+
useCurrentScreenData,
|
|
8
|
+
useDimensions,
|
|
9
|
+
useRoute,
|
|
10
|
+
useIsTablet,
|
|
11
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
|
+
import { useMemo, useEffect, useState } from "react";
|
|
13
|
+
|
|
14
|
+
export const useWaitForValidOrientation = () => {
|
|
15
|
+
const { width: screenWidth, height } = useDimensions("screen", {
|
|
16
|
+
fullDimensions: true,
|
|
17
|
+
updateForInactiveScreens: false,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const currentScreenData = useCurrentScreenData();
|
|
21
|
+
|
|
22
|
+
const { screenData } = useRoute();
|
|
23
|
+
|
|
24
|
+
const [readyState, setReadyState] = useState(false);
|
|
25
|
+
|
|
26
|
+
const isTablet = useIsTablet();
|
|
27
|
+
|
|
28
|
+
const { appData } = usePickFromState(["appData"]);
|
|
29
|
+
const isTabletPortrait = appData?.isTabletPortrait;
|
|
30
|
+
|
|
31
|
+
const layoutData = useMemo(
|
|
32
|
+
() => ({ isTablet, isTabletPortrait, width: screenWidth, height }),
|
|
33
|
+
[isTablet, isTabletPortrait, screenWidth, height]
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const targetScreenData =
|
|
37
|
+
currentScreenData || (screenData as any)?.targetScreen || screenData;
|
|
38
|
+
|
|
39
|
+
const orientation = useGetScreenOrientation(targetScreenData);
|
|
40
|
+
|
|
41
|
+
const isReadyForDisplay = isOrientationCompatible({
|
|
42
|
+
orientation,
|
|
43
|
+
layoutData,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (isReadyForDisplay && !readyState) {
|
|
48
|
+
setReadyState(true);
|
|
49
|
+
}
|
|
50
|
+
}, [readyState, orientation, layoutData]);
|
|
51
|
+
|
|
52
|
+
return readyState;
|
|
53
|
+
};
|
|
@@ -2,31 +2,27 @@
|
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { View } from "react-native";
|
|
4
4
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
5
|
-
import {
|
|
6
|
-
isOrientationCompatible,
|
|
7
|
-
useGetScreenOrientation,
|
|
8
|
-
} from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
|
|
9
5
|
|
|
10
6
|
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
11
7
|
import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
|
|
12
8
|
import {
|
|
13
|
-
shouldNavBarDisplayMenu,
|
|
14
9
|
getNavBarProps,
|
|
15
10
|
getScreenId,
|
|
11
|
+
shouldNavBarDisplayMenu,
|
|
16
12
|
} from "@applicaster/zapp-react-native-utils/navigationUtils";
|
|
17
13
|
import {
|
|
18
|
-
useDimensions,
|
|
19
|
-
useRoute,
|
|
20
14
|
useCurrentScreenData,
|
|
21
15
|
useNavbarState,
|
|
22
|
-
useScreenData,
|
|
23
16
|
useNavigation,
|
|
17
|
+
useRoute,
|
|
18
|
+
useScreenData,
|
|
24
19
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
25
20
|
import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
|
|
26
21
|
|
|
27
22
|
import { RouteManager } from "../RouteManager";
|
|
28
23
|
import { useScreenConfiguration } from "../River/useScreenConfiguration";
|
|
29
24
|
import { isValidColor } from "./utils";
|
|
25
|
+
import { useWaitForValidOrientation } from "./hooks";
|
|
30
26
|
|
|
31
27
|
const screenStyles = {
|
|
32
28
|
flex: 1,
|
|
@@ -50,14 +46,6 @@ export function Screen(_props: Props) {
|
|
|
50
46
|
const currentScreenData = useCurrentScreenData();
|
|
51
47
|
const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
|
|
52
48
|
|
|
53
|
-
const {
|
|
54
|
-
width: screenWidth,
|
|
55
|
-
height,
|
|
56
|
-
deviceInfo,
|
|
57
|
-
} = useDimensions("screen", {
|
|
58
|
-
fullDimensions: true,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
49
|
const { screenData, pathname } = useRoute();
|
|
62
50
|
|
|
63
51
|
const currentRiver = useScreenData(
|
|
@@ -66,13 +54,6 @@ export function Screen(_props: Props) {
|
|
|
66
54
|
|
|
67
55
|
const { title } = useNavbarState();
|
|
68
56
|
|
|
69
|
-
const isTablet = deviceInfo?.isTablet;
|
|
70
|
-
|
|
71
|
-
const { appData } = usePickFromState(["appData"]);
|
|
72
|
-
const isTabletPortrait = appData?.isTabletPortrait;
|
|
73
|
-
|
|
74
|
-
const layoutData = { isTablet, isTabletPortrait, width: screenWidth, height };
|
|
75
|
-
|
|
76
57
|
const hasMenu = shouldNavBarDisplayMenu(currentRiver, plugins);
|
|
77
58
|
|
|
78
59
|
const navBarProps = React.useMemo<MobileNavBarPluginProps | null>(
|
|
@@ -108,30 +89,23 @@ export function Screen(_props: Props) {
|
|
|
108
89
|
[theme.app_background_color, backgroundColor]
|
|
109
90
|
);
|
|
110
91
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const orientation = useGetScreenOrientation(targetScreenData);
|
|
92
|
+
// Set ready state when screen is rotated to desired orientation
|
|
93
|
+
const isReady = useWaitForValidOrientation();
|
|
115
94
|
|
|
116
95
|
// We prevent rendering of the screen until UI is actually rotated to screen desired orientation.
|
|
117
96
|
// This saves unnecessary re-renders and user will not see distorted aspect screen.
|
|
118
|
-
if (
|
|
119
|
-
!isOrientationCompatible({
|
|
120
|
-
orientation,
|
|
121
|
-
layoutData,
|
|
122
|
-
})
|
|
123
|
-
) {
|
|
124
|
-
return <View style={style} />;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
97
|
return (
|
|
128
98
|
<View style={style}>
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
99
|
+
{isReady ? (
|
|
100
|
+
<>
|
|
101
|
+
{navBarProps ? <NavBar {...navBarProps} hasMenu={hasMenu} /> : null}
|
|
102
|
+
|
|
103
|
+
<OfflineFallbackScreen>
|
|
104
|
+
{/* @TODO RouteManager doesn't use props, can they be removed ? */}
|
|
105
|
+
<RouteManager pathname={pathname} screenData={screenData} />
|
|
106
|
+
</OfflineFallbackScreen>
|
|
107
|
+
</>
|
|
108
|
+
) : null}
|
|
135
109
|
</View>
|
|
136
110
|
);
|
|
137
111
|
}
|
|
@@ -1,161 +1,180 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View } from "react-native";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
4
|
+
|
|
5
5
|
const pluginConfiguration = { foo: "bar" };
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const MockModuleView = (testID) => {
|
|
8
|
+
// eslint-disable-next-line react/display-name
|
|
9
|
+
return function (props) {
|
|
10
|
+
return <View testID={testID} {...props} />;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const ScreenType1 = MockModuleView("screen_type_1");
|
|
15
|
+
const ScreenType2 = MockModuleView("screen_type_2");
|
|
16
|
+
const PlayerController = MockModuleView("player_controller");
|
|
10
17
|
|
|
11
18
|
const mockScreenType3 = {
|
|
12
|
-
module:
|
|
19
|
+
module: MockModuleView("screen_type_3"),
|
|
13
20
|
name: "ScreenType3",
|
|
14
21
|
type: "screen_type_3",
|
|
15
22
|
configuration: pluginConfiguration,
|
|
16
23
|
};
|
|
17
24
|
|
|
18
25
|
const mockScreenType4 = {
|
|
19
|
-
module:
|
|
26
|
+
module: MockModuleView("screen_type_4"),
|
|
20
27
|
name: "ScreenType4",
|
|
21
28
|
type: "screen_type_4",
|
|
22
29
|
};
|
|
23
30
|
|
|
24
31
|
const mockPlayerPlugin = {
|
|
25
|
-
module:
|
|
32
|
+
module: MockModuleView("player_plugin"),
|
|
26
33
|
name: "playerPlugin",
|
|
27
34
|
type: "player",
|
|
28
35
|
};
|
|
29
36
|
|
|
30
37
|
const mockScreenPlugin = {
|
|
31
|
-
module:
|
|
38
|
+
module: MockModuleView("screen_plugin"),
|
|
32
39
|
type: "general",
|
|
33
40
|
name: "Screen plugin",
|
|
34
41
|
identifier: "screen-plugin",
|
|
35
42
|
};
|
|
36
43
|
|
|
37
44
|
const mockPluginWithConfig = {
|
|
38
|
-
module:
|
|
45
|
+
module: MockModuleView("plugin_with_config"),
|
|
39
46
|
type: "general",
|
|
40
47
|
name: "Plugin with config",
|
|
41
48
|
identifier: "plugin-with-config",
|
|
42
49
|
configuration: pluginConfiguration,
|
|
43
50
|
};
|
|
44
51
|
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
const mockComponents = { ScreenType1, ScreenType2, PlayerController };
|
|
53
|
+
|
|
54
|
+
const mockState = {
|
|
55
|
+
components: mockComponents,
|
|
56
|
+
plugins: [
|
|
57
|
+
mockScreenType3,
|
|
58
|
+
mockScreenType4,
|
|
59
|
+
mockPlayerPlugin,
|
|
60
|
+
mockScreenPlugin,
|
|
61
|
+
mockPluginWithConfig,
|
|
62
|
+
],
|
|
63
|
+
rivers: {
|
|
64
|
+
A1234: {},
|
|
65
|
+
},
|
|
56
66
|
};
|
|
57
67
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
playerPlugin: mockPlayerPlugin,
|
|
65
|
-
ScreenPlugin: mockScreenPlugin,
|
|
66
|
-
PluginWithConfig: mockPluginWithConfig,
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
|
|
72
|
-
useAnalytics: jest.fn().mockReturnValue(mockWithAnalytics),
|
|
73
|
-
}));
|
|
68
|
+
jest.mock(
|
|
69
|
+
"@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks",
|
|
70
|
+
() => ({
|
|
71
|
+
useScreenAnalytics: jest.fn(),
|
|
72
|
+
})
|
|
73
|
+
);
|
|
74
74
|
|
|
75
|
-
jest.mock(
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
jest.mock(
|
|
76
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
|
|
77
|
+
() => ({
|
|
78
|
+
useNavigation: jest.fn(() => ({
|
|
79
|
+
closeVideoModal: jest.fn(),
|
|
80
|
+
videoModalState: {
|
|
81
|
+
mode: "test",
|
|
82
|
+
},
|
|
83
|
+
})),
|
|
84
|
+
})
|
|
85
|
+
);
|
|
78
86
|
|
|
79
|
-
|
|
87
|
+
jest.mock(
|
|
88
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
|
|
89
|
+
() => ({
|
|
90
|
+
useRoute: jest.fn(() => ({ screenId: "1234" })),
|
|
91
|
+
})
|
|
92
|
+
);
|
|
80
93
|
|
|
81
94
|
jest.mock(
|
|
82
|
-
"@applicaster/zapp-react-native-utils/
|
|
95
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
|
|
83
96
|
() => ({
|
|
84
|
-
|
|
97
|
+
useIsScreenActive: () => ({
|
|
98
|
+
isScreenActive: true,
|
|
99
|
+
}),
|
|
85
100
|
})
|
|
86
101
|
);
|
|
87
102
|
|
|
88
|
-
jest.mock("
|
|
89
|
-
|
|
90
|
-
useDispatch: jest.fn(() => () => {}),
|
|
91
|
-
}));
|
|
103
|
+
jest.mock("../../PlayerContainer", () => {
|
|
104
|
+
const { View } = jest.requireActual("react-native");
|
|
92
105
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
})
|
|
106
|
+
return {
|
|
107
|
+
PlayerContainer: (props) => (
|
|
108
|
+
<View {...props}>
|
|
109
|
+
<props.Player />
|
|
110
|
+
</View>
|
|
111
|
+
),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
101
114
|
|
|
102
|
-
const
|
|
115
|
+
const getWrapper = (screenId, screenType, screenData) => {
|
|
116
|
+
const ScreenResolver = require("../").ScreenResolverComponent;
|
|
103
117
|
|
|
104
|
-
|
|
105
|
-
shallow(
|
|
118
|
+
return renderWithProviders(
|
|
106
119
|
<ScreenResolver
|
|
107
120
|
{...{
|
|
108
121
|
screenId,
|
|
109
122
|
screenType,
|
|
110
123
|
screenData,
|
|
111
124
|
}}
|
|
112
|
-
|
|
125
|
+
/>,
|
|
126
|
+
mockState
|
|
113
127
|
);
|
|
128
|
+
};
|
|
114
129
|
|
|
115
130
|
describe("<ScreenResolver />", () => {
|
|
116
131
|
it("renders correctly", () => {
|
|
117
132
|
const wrapper = getWrapper("1234", "screen_type_1", {});
|
|
118
133
|
|
|
119
|
-
expect(
|
|
134
|
+
expect(wrapper.getByTestId("screen_type_1")).toBeDefined();
|
|
120
135
|
});
|
|
121
136
|
|
|
122
137
|
it("picks screen from plugins if it exists", () => {
|
|
123
138
|
const wrapper = getWrapper("A1234", "screen_type_3", {});
|
|
124
139
|
|
|
125
|
-
expect(wrapper.
|
|
140
|
+
expect(wrapper.getByTestId("screen_type_3")).toBeDefined();
|
|
126
141
|
});
|
|
127
142
|
|
|
128
143
|
it("picks the screen from its identifier if it exists", () => {
|
|
129
144
|
const wrapper = getWrapper("A1234", "screen-plugin", {});
|
|
130
145
|
|
|
131
|
-
expect(wrapper.
|
|
146
|
+
expect(wrapper.getByTestId("screen_plugin")).toBeDefined();
|
|
132
147
|
});
|
|
133
148
|
|
|
134
149
|
it("picks screen from components if it doesn't exist in plugins", () => {
|
|
135
150
|
const wrapper = getWrapper("A1234", "screen_type_2", {});
|
|
136
151
|
|
|
137
|
-
expect(wrapper.
|
|
152
|
+
expect(wrapper.getByTestId("screen_type_2")).toBeDefined();
|
|
138
153
|
});
|
|
139
154
|
|
|
140
155
|
it("renders the screen and passes screenId & locationState as props", () => {
|
|
141
156
|
const wrapper = getWrapper("A1234", "screen_type_3", "foo");
|
|
142
157
|
|
|
143
|
-
const screenWrapper = wrapper.
|
|
158
|
+
const screenWrapper = wrapper.getByTestId("screen_type_3");
|
|
144
159
|
|
|
145
|
-
expect(screenWrapper.
|
|
146
|
-
|
|
160
|
+
expect(screenWrapper.props).toMatchObject({
|
|
161
|
+
screenId: "A1234",
|
|
162
|
+
screenData: "foo",
|
|
163
|
+
});
|
|
147
164
|
});
|
|
148
165
|
|
|
149
166
|
it("renders null if the screen is not found", () => {
|
|
150
167
|
const wrapper = getWrapper(null, "screen_type_5", {});
|
|
151
168
|
|
|
152
|
-
expect(wrapper.
|
|
169
|
+
expect(wrapper.queryAllByTestId("screen_type_5")).toBeEmpty();
|
|
153
170
|
});
|
|
154
171
|
|
|
155
172
|
it("injects the plugin configuration if it exists", () => {
|
|
156
173
|
const wrapper = getWrapper("A1234", "plugin-with-config", {});
|
|
157
174
|
|
|
158
|
-
|
|
175
|
+
const screenWrapper = wrapper.getByTestId("plugin_with_config");
|
|
176
|
+
|
|
177
|
+
expect(screenWrapper.props).toHaveProperty(
|
|
159
178
|
"configuration",
|
|
160
179
|
expect.objectContaining(pluginConfiguration)
|
|
161
180
|
);
|
|
@@ -164,7 +183,9 @@ describe("<ScreenResolver />", () => {
|
|
|
164
183
|
it("injects the plugin configuration if it exists, even when plugin is resolved by type", () => {
|
|
165
184
|
const wrapper = getWrapper("A1234", "screen_type_3", {});
|
|
166
185
|
|
|
167
|
-
|
|
186
|
+
const screenWrapper = wrapper.getByTestId("screen_type_3");
|
|
187
|
+
|
|
188
|
+
expect(screenWrapper.props).toHaveProperty(
|
|
168
189
|
"configuration",
|
|
169
190
|
expect.objectContaining(pluginConfiguration)
|
|
170
191
|
);
|
|
@@ -172,6 +193,6 @@ describe("<ScreenResolver />", () => {
|
|
|
172
193
|
|
|
173
194
|
it("wraps the player with the playerController component when the screenType is playable", () => {
|
|
174
195
|
const wrapper = getWrapper("A1234", "playable", {});
|
|
175
|
-
expect(
|
|
196
|
+
expect(wrapper.getByTestId("player_plugin")).toBeDefined();
|
|
176
197
|
});
|
|
177
198
|
});
|
package/Components/Tabs/Tab.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/* eslint-disable react-native/no-unused-styles */
|
|
2
2
|
import React from "react";
|
|
3
3
|
import * as R from "ramda";
|
|
4
|
-
import {
|
|
4
|
+
import { StyleSheet, Text, TouchableWithoutFeedback, View } from "react-native";
|
|
5
5
|
import { useConfiguration } from "@applicaster/zapp-react-native-utils/reactHooks/configuration";
|
|
6
6
|
import {
|
|
7
|
-
getStyleForPlatform,
|
|
8
7
|
applyStringTransformation,
|
|
8
|
+
getStyleForPlatform,
|
|
9
9
|
} from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
10
10
|
|
|
11
11
|
type Props = {
|
|
@@ -69,8 +69,8 @@ const getStyles = (configuration, selected, focused) => {
|
|
|
69
69
|
? tab_cell_background_color_selected_active
|
|
70
70
|
: tab_cell_background_color_selected_default
|
|
71
71
|
: focused
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
? tab_cell_background_color_active
|
|
73
|
+
: tab_cell_background_color_default,
|
|
74
74
|
justifyContent: "center",
|
|
75
75
|
alignItems: "center",
|
|
76
76
|
position: "relative",
|
|
@@ -85,8 +85,8 @@ const getStyles = (configuration, selected, focused) => {
|
|
|
85
85
|
? tab_cell_border_color_active_focused
|
|
86
86
|
: tab_cell_border_color_active
|
|
87
87
|
: focused
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
? tab_cell_border_color_default_focused
|
|
89
|
+
: tab_cell_border_color_default,
|
|
90
90
|
},
|
|
91
91
|
label: {
|
|
92
92
|
fontFamily: text_label_font_family,
|
|
@@ -98,8 +98,8 @@ const getStyles = (configuration, selected, focused) => {
|
|
|
98
98
|
? text_label_selected_active_font_color
|
|
99
99
|
: text_label_selected_default_font_color
|
|
100
100
|
: focused
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
? text_label_active_font_color
|
|
102
|
+
: text_label_default_font_color,
|
|
103
103
|
},
|
|
104
104
|
underline: {
|
|
105
105
|
position: "absolute",
|
|
@@ -148,7 +148,9 @@ const Tab = ({ title, selected, handleOnPress }: Props, ref: any) => {
|
|
|
148
148
|
<Text numberOfLines={1} style={styles.label}>
|
|
149
149
|
{tabTitle}
|
|
150
150
|
</Text>
|
|
151
|
-
{selected
|
|
151
|
+
{selected ? (
|
|
152
|
+
<View testID="underline" style={styles.underline} />
|
|
153
|
+
) : null}
|
|
152
154
|
</View>
|
|
153
155
|
</View>
|
|
154
156
|
</TouchableWithoutFeedback>
|
|
@@ -94,8 +94,8 @@ function TextInputTV(props: Props, ref) {
|
|
|
94
94
|
styles.textAlign === "center"
|
|
95
95
|
? styles.textAlign
|
|
96
96
|
: styles.textAlign === "left"
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
? "right"
|
|
98
|
+
: "left";
|
|
99
99
|
|
|
100
100
|
return { style: { ...styles, textAlign } };
|
|
101
101
|
}
|
|
@@ -174,7 +174,8 @@ function TextInputTV(props: Props, ref) {
|
|
|
174
174
|
|
|
175
175
|
return isWebPlatform ? (
|
|
176
176
|
<>
|
|
177
|
-
{additional
|
|
177
|
+
{additional ? additional() : null}
|
|
178
|
+
{/* eslint-disable-next-line react/no-unknown-property */}
|
|
178
179
|
<input testID="TextInput-tv" ref={ref} {...inputProps} />
|
|
179
180
|
</>
|
|
180
181
|
) : (
|
|
@@ -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(
|