@applicaster/zapp-react-native-ui-components 13.0.0-alpha.1102149799 → 13.0.0-alpha.1124981321
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__/__snapshots__/AppContainer.test.js.snap +1 -1
- package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
- package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +6 -6
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +7 -7
- package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
- package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
- package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
- package/Components/BaseFocusable/index.ios.ts +1 -1
- package/Components/BaseFocusable/index.tsx +66 -29
- package/Components/Cell/Cell.tsx +7 -3
- package/Components/Cell/TvOSCellComponent.tsx +0 -4
- package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +20 -20
- package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +5 -3
- package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +5 -5
- package/Components/ComponentResolver/__tests__/componentResolver.test.js +11 -9
- package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
- package/Components/Focusable/Focusable.tsx +0 -54
- package/Components/Focusable/FocusableTvOS.tsx +1 -1
- package/Components/Focusable/Touchable.tsx +19 -20
- package/Components/FocusableList/index.tsx +0 -1
- package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +9 -0
- package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
- package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +1 -0
- package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
- package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -3
- package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +9 -9
- package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
- package/Components/Layout/TV/__tests__/index.test.tsx +7 -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/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
- package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
- package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
- package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
- package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
- package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +7 -7
- package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +34 -34
- package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
- package/Components/MasterCell/utils/index.ts +1 -1
- package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
- package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
- package/Components/PlayerContainer/PlayerContainer.tsx +5 -11
- package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
- package/Components/River/RefreshControl.tsx +1 -1
- package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +17 -17
- package/Components/River/__tests__/__snapshots__/river.test.js.snap +12 -12
- package/Components/River/__tests__/componentsMap.test.js +61 -13
- package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -1
- package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +1 -1
- package/Components/Screen/__tests__/Screen.test.tsx +41 -27
- package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
- package/Components/Screen/hooks.ts +56 -0
- package/Components/Screen/index.tsx +13 -39
- package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +2 -2
- package/Components/ScreenResolver/__tests__/screenResolver.test.js +31 -27
- package/Components/Tabs/Tab.tsx +7 -6
- package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
- package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
- package/Components/TextInputTv/index.tsx +4 -4
- package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
- package/Components/Transitioner/AnimationManager.js +8 -8
- package/Components/Transitioner/Scene.tsx +52 -23
- package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +62 -46
- package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +4 -4
- package/Components/Transitioner/index.js +8 -4
- package/Components/VideoLive/LiveImageManager.ts +27 -1
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +29 -21
- package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +63 -8
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +5 -10
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +5 -1
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +5 -1
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +8 -7
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -10
- package/Components/VideoModal/ModalAnimation/index.ts +2 -1
- package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
- package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
- package/Components/VideoModal/OpaqueLayer.tsx +33 -0
- package/Components/VideoModal/PlayerWrapper.tsx +16 -35
- package/Components/VideoModal/VideoModal.tsx +14 -23
- package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +13 -10
- package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +66 -156
- 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 +3 -5
- package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +2 -2
- package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
- package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +11 -11
- package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +30 -30
- package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
- package/Contexts/ScreenContext/index.tsx +3 -2
- package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +2 -2
- package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
- package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
- package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
- package/Decorators/RiverFeedLoader/index.tsx +1 -1
- package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
- package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
- package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
- package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +5 -5
- package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +16 -10
- package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
- package/Decorators/ZappPipesDataConnector/index.tsx +32 -2
- package/package.json +5 -5
- package/Decorators/RiverFeedLoader/utils.ts +0 -100
|
@@ -6,42 +6,42 @@ exports[`When River has a general_content type <River /> renders correctly 1`] =
|
|
|
6
6
|
>
|
|
7
7
|
<RiverWithData
|
|
8
8
|
appData={
|
|
9
|
-
|
|
9
|
+
{
|
|
10
10
|
"layoutVersion": "v1",
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
dispatch={[Function]}
|
|
14
14
|
rivers={
|
|
15
|
-
|
|
16
|
-
"A1234":
|
|
15
|
+
{
|
|
16
|
+
"A1234": {
|
|
17
17
|
"home": true,
|
|
18
18
|
"id": "A1234",
|
|
19
19
|
"name": "foo",
|
|
20
20
|
"type": "general_content",
|
|
21
|
-
"ui_components":
|
|
22
|
-
|
|
21
|
+
"ui_components": [
|
|
22
|
+
{
|
|
23
23
|
"component_type": "hero",
|
|
24
24
|
},
|
|
25
|
-
|
|
25
|
+
{
|
|
26
26
|
"component_type": "grid",
|
|
27
27
|
},
|
|
28
28
|
],
|
|
29
29
|
},
|
|
30
|
-
"B4567":
|
|
30
|
+
"B4567": {
|
|
31
31
|
"id": "B4567",
|
|
32
32
|
},
|
|
33
|
-
"C0987":
|
|
33
|
+
"C0987": {
|
|
34
34
|
"home": false,
|
|
35
35
|
"id": "C0987",
|
|
36
36
|
"name": "Some-Screen-Plugin",
|
|
37
37
|
"type": "some-screen-plugin",
|
|
38
|
-
"ui_components":
|
|
38
|
+
"ui_components": [],
|
|
39
39
|
},
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
screenId="A1234"
|
|
43
43
|
store={
|
|
44
|
-
|
|
44
|
+
{
|
|
45
45
|
"clearActions": [Function],
|
|
46
46
|
"dispatch": [Function],
|
|
47
47
|
"getActions": [Function],
|
|
@@ -64,13 +64,13 @@ exports[`When River has a general_content type <RiverComponent /> renders correc
|
|
|
64
64
|
exports[`When River has any other type other than general_content <RiverComponent /> renders correctly 1`] = `
|
|
65
65
|
<WithProvider
|
|
66
66
|
screenData={
|
|
67
|
-
|
|
67
|
+
{
|
|
68
68
|
"groupId": undefined,
|
|
69
69
|
"home": false,
|
|
70
70
|
"id": "C0987",
|
|
71
71
|
"name": "Some-Screen-Plugin",
|
|
72
72
|
"type": "some-screen-plugin",
|
|
73
|
-
"ui_components":
|
|
73
|
+
"ui_components": [],
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
screenId="C0987"
|
|
@@ -75,28 +75,70 @@ const riverComponents = [
|
|
|
75
75
|
},
|
|
76
76
|
];
|
|
77
77
|
|
|
78
|
-
const
|
|
78
|
+
const mockScreenData = {
|
|
79
79
|
ui_components: riverComponents,
|
|
80
80
|
rules: { pull_to_refresh_enabled: false },
|
|
81
81
|
id: "A1234",
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
+
jest.mock("@applicaster/zapp-react-native-redux/AppStore", () => ({
|
|
85
|
+
appStore: {
|
|
86
|
+
get: jest.fn((prop) => mockStore[prop]),
|
|
87
|
+
getState: jest.fn(),
|
|
88
|
+
},
|
|
89
|
+
}));
|
|
90
|
+
|
|
84
91
|
jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
|
|
85
92
|
useIsRTL: jest.fn(() => mock_rtl_flag),
|
|
86
93
|
}));
|
|
87
94
|
|
|
88
|
-
jest.mock(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
jest.mock(
|
|
96
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
|
|
97
|
+
() => ({
|
|
98
|
+
useNavigation: jest.fn(() => ({ currentRoute: "/river/A1234" })),
|
|
99
|
+
})
|
|
100
|
+
);
|
|
94
101
|
|
|
95
|
-
jest.mock(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
102
|
+
jest.mock(
|
|
103
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
|
|
104
|
+
() => ({
|
|
105
|
+
useRoute: jest.fn(() => ({
|
|
106
|
+
pathname: "/river/A1234",
|
|
107
|
+
screenData: mockScreenData,
|
|
108
|
+
})),
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
jest.mock(
|
|
113
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
|
|
114
|
+
() => ({
|
|
115
|
+
useIsScreenActive: jest.fn().mockReturnValue(true),
|
|
116
|
+
})
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
jest.mock(
|
|
120
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData",
|
|
121
|
+
() => ({
|
|
122
|
+
useCurrentScreenData: jest.fn(() => mockScreenData),
|
|
123
|
+
})
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
jest.mock(
|
|
127
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData",
|
|
128
|
+
() => ({
|
|
129
|
+
useScreenData: jest.fn(() => mockScreenData),
|
|
130
|
+
})
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
jest.mock(
|
|
134
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext",
|
|
135
|
+
() => ({
|
|
136
|
+
...jest.requireActual(
|
|
137
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext"
|
|
138
|
+
),
|
|
139
|
+
useScreenContext: jest.fn(() => mockScreenData),
|
|
140
|
+
})
|
|
141
|
+
);
|
|
100
142
|
|
|
101
143
|
const { View } = require("react-native");
|
|
102
144
|
const { ComponentsMap } = require("../ComponentsMap/ComponentsMap");
|
|
@@ -118,7 +160,13 @@ const plugins = [];
|
|
|
118
160
|
const navigation = {};
|
|
119
161
|
|
|
120
162
|
const props = { components, cellStyles, riverComponents, navigation };
|
|
121
|
-
|
|
163
|
+
|
|
164
|
+
const store = mockStore({
|
|
165
|
+
components,
|
|
166
|
+
cellStyles,
|
|
167
|
+
plugins,
|
|
168
|
+
getState: jest.fn(),
|
|
169
|
+
});
|
|
122
170
|
|
|
123
171
|
jest.useFakeTimers();
|
|
124
172
|
|
|
@@ -46,27 +46,37 @@ jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
|
|
|
46
46
|
})),
|
|
47
47
|
}));
|
|
48
48
|
|
|
49
|
-
const
|
|
49
|
+
const mockNavBar = jest.fn((props) => {
|
|
50
|
+
const View = jest.requireActual("react-native").View;
|
|
51
|
+
|
|
52
|
+
return <View testID="navBar" {...props} />;
|
|
53
|
+
});
|
|
50
54
|
|
|
51
55
|
jest.mock(
|
|
52
56
|
"@applicaster/zapp-react-native-app/App/Layout/layoutHelpers",
|
|
53
57
|
() => ({
|
|
54
|
-
getNavigationPluginModule: () =>
|
|
58
|
+
getNavigationPluginModule: () => mockNavBar,
|
|
55
59
|
})
|
|
56
60
|
);
|
|
57
61
|
|
|
58
|
-
jest.mock(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
jest.mock(
|
|
63
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData",
|
|
64
|
+
() => ({
|
|
65
|
+
useCurrentScreenData: jest.fn(() => ({
|
|
66
|
+
id: "testId",
|
|
67
|
+
})),
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
jest.mock(
|
|
72
|
+
"@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData",
|
|
73
|
+
() => ({
|
|
74
|
+
useScreenData: jest.fn(() => ({
|
|
75
|
+
id: "testId",
|
|
76
|
+
navigations: [{ id: "testId", category: "nav_bar" }],
|
|
77
|
+
})),
|
|
78
|
+
})
|
|
79
|
+
);
|
|
70
80
|
|
|
71
81
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
72
82
|
isNavBarVisible: mockIsNavBarVisible,
|
|
@@ -84,20 +94,24 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
|
84
94
|
useIsScreenActive: jest.fn().mockReturnValue(true),
|
|
85
95
|
}));
|
|
86
96
|
|
|
87
|
-
jest.mock("@applicaster/zapp-react-native-redux/hooks", () =>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
jest.mock("@applicaster/zapp-react-native-redux/hooks/usePickFromState", () => {
|
|
98
|
+
const View = jest.requireActual("react-native").View;
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
usePickFromState: () => ({
|
|
102
|
+
plugins: [
|
|
103
|
+
{
|
|
104
|
+
name: "Offline Plugin",
|
|
105
|
+
identifier: "offline-experience",
|
|
106
|
+
type: "general",
|
|
107
|
+
module: {
|
|
108
|
+
OfflineFallbackScreen: ({ children }) => <View>{children}</View>, // eslint-disable-line
|
|
109
|
+
},
|
|
96
110
|
},
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
})
|
|
111
|
+
],
|
|
112
|
+
}),
|
|
113
|
+
};
|
|
114
|
+
});
|
|
101
115
|
|
|
102
116
|
const {
|
|
103
117
|
allowedOrientationsForScreen,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
exports[`<Screen Component /> when the navbar should be hidden renders correctly 1`] = `
|
|
4
4
|
<View
|
|
5
5
|
style={
|
|
6
|
-
|
|
6
|
+
{
|
|
7
7
|
"backgroundColor": "blue",
|
|
8
8
|
"flex": 1,
|
|
9
9
|
"paddingTop": 0,
|
|
@@ -22,7 +22,7 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
|
|
|
22
22
|
<View
|
|
23
23
|
pathname="/river/testId"
|
|
24
24
|
screenData={
|
|
25
|
-
|
|
25
|
+
{
|
|
26
26
|
"id": "testId",
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -35,7 +35,7 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
|
|
|
35
35
|
exports[`<Screen Component /> when the navbar should show renders correctly 1`] = `
|
|
36
36
|
<View
|
|
37
37
|
style={
|
|
38
|
-
|
|
38
|
+
{
|
|
39
39
|
"backgroundColor": "blue",
|
|
40
40
|
"flex": 1,
|
|
41
41
|
"paddingTop": 0,
|
|
@@ -54,7 +54,7 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
|
|
|
54
54
|
<View
|
|
55
55
|
pathname="/river/testId"
|
|
56
56
|
screenData={
|
|
57
|
-
|
|
57
|
+
{
|
|
58
58
|
"id": "testId",
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
11
|
+
import { useMemo, useEffect, useState } from "react";
|
|
12
|
+
|
|
13
|
+
export const useWaitForValidOrientation = () => {
|
|
14
|
+
const {
|
|
15
|
+
width: screenWidth,
|
|
16
|
+
height,
|
|
17
|
+
deviceInfo,
|
|
18
|
+
} = useDimensions("screen", {
|
|
19
|
+
fullDimensions: true,
|
|
20
|
+
updateForInactiveScreens: false,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const currentScreenData = useCurrentScreenData();
|
|
24
|
+
|
|
25
|
+
const { screenData } = useRoute();
|
|
26
|
+
|
|
27
|
+
const [readyState, setReadyState] = useState(false);
|
|
28
|
+
|
|
29
|
+
const isTablet = deviceInfo?.isTablet;
|
|
30
|
+
|
|
31
|
+
const { appData } = usePickFromState(["appData"]);
|
|
32
|
+
const isTabletPortrait = appData?.isTabletPortrait;
|
|
33
|
+
|
|
34
|
+
const layoutData = useMemo(
|
|
35
|
+
() => ({ isTablet, isTabletPortrait, width: screenWidth, height }),
|
|
36
|
+
[isTablet, isTabletPortrait, screenWidth, height]
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const targetScreenData =
|
|
40
|
+
currentScreenData || (screenData as any)?.targetScreen || screenData;
|
|
41
|
+
|
|
42
|
+
const orientation = useGetScreenOrientation(targetScreenData);
|
|
43
|
+
|
|
44
|
+
const isReadyForDisplay = isOrientationCompatible({
|
|
45
|
+
orientation,
|
|
46
|
+
layoutData,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (isReadyForDisplay && !readyState) {
|
|
51
|
+
setReadyState(true);
|
|
52
|
+
}
|
|
53
|
+
}, [readyState, orientation, layoutData]);
|
|
54
|
+
|
|
55
|
+
return readyState;
|
|
56
|
+
};
|
|
@@ -2,10 +2,6 @@
|
|
|
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";
|
|
@@ -15,7 +11,6 @@ import {
|
|
|
15
11
|
getScreenId,
|
|
16
12
|
} from "@applicaster/zapp-react-native-utils/navigationUtils";
|
|
17
13
|
import {
|
|
18
|
-
useDimensions,
|
|
19
14
|
useRoute,
|
|
20
15
|
useCurrentScreenData,
|
|
21
16
|
useNavbarState,
|
|
@@ -27,6 +22,7 @@ import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/Ap
|
|
|
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} />}
|
|
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
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`<ScreenResolver /> renders correctly 1`] = `
|
|
4
4
|
<mockConstructor
|
|
5
|
-
screenData={
|
|
5
|
+
screenData={{}}
|
|
6
6
|
screenId="1234"
|
|
7
7
|
screenType="screen_type_1"
|
|
8
8
|
/>
|
|
@@ -11,7 +11,7 @@ exports[`<ScreenResolver /> renders correctly 1`] = `
|
|
|
11
11
|
exports[`<ScreenResolver /> wraps the player with the playerController component when the screenType is playable 1`] = `
|
|
12
12
|
<HandlePlayable
|
|
13
13
|
isModal={false}
|
|
14
|
-
item={
|
|
14
|
+
item={{}}
|
|
15
15
|
mode="FULLSCREEN"
|
|
16
16
|
/>
|
|
17
17
|
`;
|
|
@@ -2,42 +2,39 @@ import React from "react";
|
|
|
2
2
|
import { View } from "react-native";
|
|
3
3
|
import { shallow } from "enzyme";
|
|
4
4
|
import { shallowToJson } from "enzyme-to-json";
|
|
5
|
-
import { connect as realConnect } from "react-redux";
|
|
6
|
-
|
|
7
5
|
const pluginConfiguration = { foo: "bar" };
|
|
8
6
|
|
|
9
7
|
const ScreenType1 = jest.fn(() => <View />);
|
|
10
8
|
const ScreenType2 = jest.fn(() => <View />);
|
|
9
|
+
const PlayerController = jest.fn(() => <View />);
|
|
11
10
|
|
|
12
|
-
const
|
|
11
|
+
const mockScreenType3 = {
|
|
13
12
|
module: jest.fn(() => <View />),
|
|
14
13
|
name: "ScreenType3",
|
|
15
14
|
type: "screen_type_3",
|
|
16
15
|
configuration: pluginConfiguration,
|
|
17
16
|
};
|
|
18
17
|
|
|
19
|
-
const
|
|
18
|
+
const mockScreenType4 = {
|
|
20
19
|
module: jest.fn(() => <View />),
|
|
21
20
|
name: "ScreenType4",
|
|
22
21
|
type: "screen_type_4",
|
|
23
22
|
};
|
|
24
23
|
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
const playerPlugin = {
|
|
24
|
+
const mockPlayerPlugin = {
|
|
28
25
|
module: jest.fn(() => <View />),
|
|
29
26
|
name: "playerPlugin",
|
|
30
27
|
type: "player",
|
|
31
28
|
};
|
|
32
29
|
|
|
33
|
-
const
|
|
30
|
+
const mockScreenPlugin = {
|
|
34
31
|
module: jest.fn(() => <View />),
|
|
35
32
|
type: "general",
|
|
36
33
|
name: "Screen plugin",
|
|
37
34
|
identifier: "screen-plugin",
|
|
38
35
|
};
|
|
39
36
|
|
|
40
|
-
const
|
|
37
|
+
const mockPluginWithConfig = {
|
|
41
38
|
module: jest.fn(() => <View />),
|
|
42
39
|
type: "general",
|
|
43
40
|
name: "Plugin with config",
|
|
@@ -47,15 +44,7 @@ const PluginWithConfig = {
|
|
|
47
44
|
|
|
48
45
|
const components = { ScreenType1, ScreenType2, PlayerController };
|
|
49
46
|
|
|
50
|
-
const
|
|
51
|
-
ScreenType3,
|
|
52
|
-
ScreenType4,
|
|
53
|
-
playerPlugin,
|
|
54
|
-
ScreenPlugin,
|
|
55
|
-
PluginWithConfig,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const withAnalytics = {
|
|
47
|
+
const mockWithAnalytics = {
|
|
59
48
|
sendOnClickEvent: jest.fn(),
|
|
60
49
|
sendMenuClickEvent: jest.fn(),
|
|
61
50
|
sendMenuToggleEvent: jest.fn(),
|
|
@@ -66,24 +55,39 @@ const withAnalytics = {
|
|
|
66
55
|
sendScreenEvent: jest.fn(),
|
|
67
56
|
};
|
|
68
57
|
|
|
58
|
+
const mockUsePickFromState = jest.fn(() => {
|
|
59
|
+
return {
|
|
60
|
+
components,
|
|
61
|
+
plugins: {
|
|
62
|
+
ScreenType3: mockScreenType3,
|
|
63
|
+
ScreenType4: mockScreenType4,
|
|
64
|
+
playerPlugin: mockPlayerPlugin,
|
|
65
|
+
ScreenPlugin: mockScreenPlugin,
|
|
66
|
+
PluginWithConfig: mockPluginWithConfig,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
|
|
69
71
|
jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
|
|
70
|
-
useAnalytics: jest.fn().mockReturnValue(
|
|
72
|
+
useAnalytics: jest.fn().mockReturnValue(mockWithAnalytics),
|
|
71
73
|
}));
|
|
72
74
|
|
|
73
75
|
jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
|
|
74
|
-
usePickFromState:
|
|
76
|
+
usePickFromState: mockUsePickFromState,
|
|
75
77
|
}));
|
|
76
78
|
|
|
79
|
+
const mockUseScreenAnalytics = jest.fn();
|
|
80
|
+
|
|
77
81
|
jest.mock(
|
|
78
82
|
"@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks",
|
|
79
83
|
() => ({
|
|
80
|
-
useScreenAnalytics:
|
|
84
|
+
useScreenAnalytics: mockUseScreenAnalytics,
|
|
81
85
|
})
|
|
82
86
|
);
|
|
83
87
|
|
|
84
88
|
jest.mock("react-redux", () => ({
|
|
89
|
+
...jest.requireActual("react-redux"),
|
|
85
90
|
useDispatch: jest.fn(() => () => {}),
|
|
86
|
-
connect: realConnect,
|
|
87
91
|
}));
|
|
88
92
|
|
|
89
93
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
@@ -118,13 +122,13 @@ describe("<ScreenResolver />", () => {
|
|
|
118
122
|
it("picks screen from plugins if it exists", () => {
|
|
119
123
|
const wrapper = getWrapper("A1234", "screen_type_3", {});
|
|
120
124
|
|
|
121
|
-
expect(wrapper.find(
|
|
125
|
+
expect(wrapper.find(mockScreenType3.module)).toHaveProperty("length", 1);
|
|
122
126
|
});
|
|
123
127
|
|
|
124
128
|
it("picks the screen from its identifier if it exists", () => {
|
|
125
129
|
const wrapper = getWrapper("A1234", "screen-plugin", {});
|
|
126
130
|
|
|
127
|
-
expect(wrapper.find(
|
|
131
|
+
expect(wrapper.find(mockScreenPlugin.module)).toHaveProperty("length", 1);
|
|
128
132
|
});
|
|
129
133
|
|
|
130
134
|
it("picks screen from components if it doesn't exist in plugins", () => {
|
|
@@ -136,7 +140,7 @@ describe("<ScreenResolver />", () => {
|
|
|
136
140
|
it("renders the screen and passes screenId & locationState as props", () => {
|
|
137
141
|
const wrapper = getWrapper("A1234", "screen_type_3", "foo");
|
|
138
142
|
|
|
139
|
-
const screenWrapper = wrapper.find(
|
|
143
|
+
const screenWrapper = wrapper.find(mockScreenType3.module);
|
|
140
144
|
|
|
141
145
|
expect(screenWrapper.prop("screenId")).toEqual("A1234");
|
|
142
146
|
expect(screenWrapper.prop("screenData")).toEqual("foo");
|
|
@@ -151,7 +155,7 @@ describe("<ScreenResolver />", () => {
|
|
|
151
155
|
it("injects the plugin configuration if it exists", () => {
|
|
152
156
|
const wrapper = getWrapper("A1234", "plugin-with-config", {});
|
|
153
157
|
|
|
154
|
-
expect(wrapper.find(
|
|
158
|
+
expect(wrapper.find(mockPluginWithConfig.module).props()).toHaveProperty(
|
|
155
159
|
"configuration",
|
|
156
160
|
expect.objectContaining(pluginConfiguration)
|
|
157
161
|
);
|
|
@@ -160,7 +164,7 @@ describe("<ScreenResolver />", () => {
|
|
|
160
164
|
it("injects the plugin configuration if it exists, even when plugin is resolved by type", () => {
|
|
161
165
|
const wrapper = getWrapper("A1234", "screen_type_3", {});
|
|
162
166
|
|
|
163
|
-
expect(wrapper.find(
|
|
167
|
+
expect(wrapper.find(mockScreenType3.module).props()).toHaveProperty(
|
|
164
168
|
"configuration",
|
|
165
169
|
expect.objectContaining(pluginConfiguration)
|
|
166
170
|
);
|
package/Components/Tabs/Tab.tsx
CHANGED
|
@@ -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",
|
|
@@ -138,6 +138,7 @@ const Tab = ({ title, selected, handleOnPress }: Props, ref: any) => {
|
|
|
138
138
|
|
|
139
139
|
return (
|
|
140
140
|
<TouchableWithoutFeedback
|
|
141
|
+
testID="tab-touchable"
|
|
141
142
|
onPressIn={handleOnPressIn}
|
|
142
143
|
onPressOut={handleOnPressOut}
|
|
143
144
|
onPress={handleOnPress}
|