@applicaster/zapp-react-native-ui-components 13.0.0-alpha.3755455151 → 13.0.0-alpha.3923423021
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/__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/BaseFocusable/index.ios.ts +1 -1
- package/Components/BaseFocusable/index.tsx +2 -3
- package/Components/Cell/Cell.tsx +8 -3
- package/Components/Cell/CellWithFocusable.ios.tsx +126 -0
- package/Components/Cell/CellWithFocusable.tsx +43 -58
- 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/CellRendererResolver/__tests__/cellRendererResolver.test.js +46 -48
- 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 +6 -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/FocusableList/index.tsx +26 -10
- package/Components/FocusableScrollView/index.tsx +43 -13
- package/Components/Layout/TV/NavBarContainer.tsx +19 -23
- 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/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 +6 -12
- 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/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/index.ts +1 -1
- package/Components/ModalComponent/Button/index.tsx +6 -6
- package/Components/ModalComponent/Header/index.tsx +3 -3
- 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/PlayerContainer/PlayerContainer.tsx +11 -15
- package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
- package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
- package/Components/PlayerImageBackground/index.tsx +23 -3
- package/Components/River/ComponentsMap/ComponentsMap.tsx +39 -65
- package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
- package/Components/River/RiverFooter.tsx +39 -9
- package/Components/River/RiverItem.tsx +37 -2
- 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/hooks.ts +56 -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/Transitioner/AnimationManager.js +8 -8
- 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 +32 -24
- package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +51 -1
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +0 -5
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +16 -12
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +5 -1
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +15 -14
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +2 -3
- package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
- package/Components/VideoModal/OpaqueLayer.tsx +33 -0
- package/Components/VideoModal/PlayerDetails.tsx +9 -6
- package/Components/VideoModal/PlayerWrapper.tsx +17 -36
- package/Components/VideoModal/VideoModal.tsx +14 -23
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -1
- 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 +1 -1
- 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 +3 -16
- 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/ScreenContext/index.tsx +3 -2
- 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 +1 -1
- package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
- package/Decorators/ZappPipesDataConnector/index.tsx +31 -1
- package/package.json +7 -7
- 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,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
|
) : (
|
|
@@ -3,19 +3,19 @@ import { Animated } from "react-native";
|
|
|
3
3
|
import { NAV_ACTION_PUSH, NAV_ACTION_BACK } from "./Transitioner";
|
|
4
4
|
|
|
5
5
|
type TransitionConfig = {
|
|
6
|
-
duration: number
|
|
7
|
-
easing: any
|
|
6
|
+
duration: number;
|
|
7
|
+
easing: any;
|
|
8
8
|
from: {
|
|
9
|
-
style: any
|
|
10
|
-
}
|
|
9
|
+
style: any;
|
|
10
|
+
};
|
|
11
11
|
to: {
|
|
12
|
-
style: any
|
|
13
|
-
}
|
|
12
|
+
style: any;
|
|
13
|
+
};
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
type Props = {
|
|
17
|
-
transitionConfig: TransitionConfig
|
|
18
|
-
contentStyle: { [string]: any }
|
|
17
|
+
transitionConfig: TransitionConfig;
|
|
18
|
+
contentStyle: { [string]: any };
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { equals } from "ramda";
|
|
2
3
|
import { Animated, ViewProps, ViewStyle } from "react-native";
|
|
3
4
|
import { useSafeAreaFrame } from "react-native-safe-area-context";
|
|
4
5
|
|
|
@@ -8,6 +9,11 @@ import { PathnameContext } from "../../Contexts/PathnameContext";
|
|
|
8
9
|
import { ScreenDataContext } from "../../Contexts/ScreenDataContext";
|
|
9
10
|
import { ScreenContextProvider } from "../../Contexts/ScreenContext";
|
|
10
11
|
|
|
12
|
+
const fullWidthDimensions = {
|
|
13
|
+
height: "100%",
|
|
14
|
+
width: "100%",
|
|
15
|
+
};
|
|
16
|
+
|
|
11
17
|
type Props = {
|
|
12
18
|
children: any;
|
|
13
19
|
style: any;
|
|
@@ -20,6 +26,47 @@ type Props = {
|
|
|
20
26
|
screenData: NavigationScreenData;
|
|
21
27
|
};
|
|
22
28
|
|
|
29
|
+
export function CurrentScreenContextProvider({
|
|
30
|
+
children,
|
|
31
|
+
...props
|
|
32
|
+
}: {
|
|
33
|
+
children: any;
|
|
34
|
+
pathname: string;
|
|
35
|
+
isActive: boolean;
|
|
36
|
+
screenData: NavigationScreenData;
|
|
37
|
+
}) {
|
|
38
|
+
const { pathname, isActive = false, screenData } = props;
|
|
39
|
+
|
|
40
|
+
const [initialScreenData, setInitialScreenData] = React.useState(screenData);
|
|
41
|
+
|
|
42
|
+
React.useLayoutEffect(() => {
|
|
43
|
+
const screenDataChanged = !equals(initialScreenData, screenData);
|
|
44
|
+
|
|
45
|
+
if (isActive && screenDataChanged) {
|
|
46
|
+
setInitialScreenData(screenData);
|
|
47
|
+
}
|
|
48
|
+
}, [initialScreenData, screenData, isActive]);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<ScreenDataContext.Provider value={initialScreenData}>
|
|
52
|
+
<PathnameContext.Provider value={pathname}>
|
|
53
|
+
<ScreenContextProvider pathname={pathname}>
|
|
54
|
+
{children}
|
|
55
|
+
</ScreenContextProvider>
|
|
56
|
+
</PathnameContext.Provider>
|
|
57
|
+
</ScreenDataContext.Provider>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const withCurrentScreenContext = (Component) =>
|
|
62
|
+
function SceneComponent(props: Props) {
|
|
63
|
+
return (
|
|
64
|
+
<CurrentScreenContextProvider {...props}>
|
|
65
|
+
<Component {...props} />
|
|
66
|
+
</CurrentScreenContextProvider>
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
|
|
23
70
|
/**
|
|
24
71
|
* Animated View container for any purpose.
|
|
25
72
|
* Renders given children with given style object.
|
|
@@ -32,53 +79,35 @@ type Props = {
|
|
|
32
79
|
* @param contentStyle
|
|
33
80
|
* @param screenUniqueId
|
|
34
81
|
*/
|
|
35
|
-
|
|
82
|
+
function SceneComponent({
|
|
36
83
|
children,
|
|
37
84
|
style,
|
|
38
85
|
pointerEvents = "auto",
|
|
39
86
|
overlayStyle,
|
|
40
87
|
animating,
|
|
41
88
|
contentStyle,
|
|
42
|
-
pathname,
|
|
43
89
|
isActive = false,
|
|
44
90
|
screenData,
|
|
45
91
|
}: Props) {
|
|
46
|
-
const [initialScreenData, setInitialScreenData] = React.useState(screenData);
|
|
47
|
-
|
|
48
92
|
useScreenOrientationHandler({
|
|
49
93
|
screenData,
|
|
50
94
|
isActive,
|
|
51
95
|
});
|
|
52
96
|
|
|
53
|
-
React.useLayoutEffect(() => {
|
|
54
|
-
if (isActive) {
|
|
55
|
-
setInitialScreenData(screenData);
|
|
56
|
-
}
|
|
57
|
-
}, [screenData, isActive]);
|
|
58
|
-
|
|
59
97
|
const frame = useSafeAreaFrame();
|
|
60
98
|
const isAnimating = animating && overlayStyle;
|
|
61
99
|
|
|
62
|
-
const dimensions = isAnimating
|
|
63
|
-
? {
|
|
64
|
-
width: "100%",
|
|
65
|
-
height: "100%",
|
|
66
|
-
}
|
|
67
|
-
: frame;
|
|
100
|
+
const dimensions = isAnimating ? fullWidthDimensions : frame;
|
|
68
101
|
|
|
69
102
|
return (
|
|
70
103
|
<Animated.View
|
|
71
104
|
pointerEvents={pointerEvents}
|
|
72
105
|
style={[style, contentStyle, dimensions]}
|
|
73
106
|
>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<ScreenContextProvider pathname={pathname}>
|
|
77
|
-
{children}
|
|
78
|
-
</ScreenContextProvider>
|
|
79
|
-
</PathnameContext.Provider>
|
|
80
|
-
</ScreenDataContext.Provider>
|
|
81
|
-
{isAnimating && <Animated.View style={overlayStyle} />}
|
|
107
|
+
{children}
|
|
108
|
+
{isAnimating ? <Animated.View style={overlayStyle} /> : null}
|
|
82
109
|
</Animated.View>
|
|
83
110
|
);
|
|
84
111
|
}
|
|
112
|
+
|
|
113
|
+
export const Scene = withCurrentScreenContext(SceneComponent);
|
|
@@ -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
|
}
|