@applicaster/zapp-react-native-ui-components 13.0.0-alpha.6523249552 → 13.0.0-alpha.6651373134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
- package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
- package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +54 -111
- package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +36 -20
- package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
- package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
- package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
- package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
- package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
- package/Components/AudioPlayer/__tests__/title.test.js +3 -5
- package/Components/AudioPlayer/helpers.tsx +1 -0
- package/Components/BaseFocusable/index.tsx +1 -2
- package/Components/Cell/Cell.tsx +4 -13
- package/Components/Cell/CellWithFocusable.tsx +48 -59
- package/Components/Cell/CellWrapper.ts +5 -0
- package/Components/Cell/TvOSCellComponent.tsx +20 -22
- 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/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
- package/Components/ComponentResolver/__tests__/componentResolver.test.js +16 -22
- package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
- package/Components/ErrorScreen/index.tsx +14 -6
- package/Components/Focusable/Focusable.tsx +1 -0
- package/Components/Focusable/FocusableTvOS.tsx +5 -1
- package/Components/Focusable/index.android.tsx +10 -3
- package/Components/FocusableCell/index.tsx +1 -1
- package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
- package/Components/FocusableGroup/index.tsx +0 -3
- package/Components/FocusableList/index.tsx +26 -9
- package/Components/FocusableScrollView/index.tsx +43 -13
- package/Components/HandlePlayable/HandlePlayable.tsx +14 -27
- package/Components/Layout/TV/NavBarContainer.tsx +19 -23
- package/Components/Layout/TV/ScreenContainer.tsx +8 -1
- 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/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +4 -3
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +11 -7
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
- 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/utils/behaviorProvider.ts +136 -0
- package/Components/MasterCell/utils/index.ts +8 -134
- package/Components/ModalComponent/Button/assets.ts +1 -1
- package/Components/ModalComponent/Button/index.tsx +6 -6
- 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 +17 -13
- 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 +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 +3 -4
- 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 -43
- package/Components/ScreenResolver/__tests__/screenResolver.test.js +91 -70
- package/Components/Tabs/Tab.tsx +5 -3
- package/Components/TextInputTv/index.tsx +2 -1
- package/Components/TrackedView/index.tsx +1 -0
- package/Components/Transitioner/AnimationManager.js +15 -15
- package/Components/Transitioner/Scene.tsx +1 -1
- package/Components/Transitioner/Transitioner.tsx +3 -3
- package/Components/Transitioner/__tests__/Scene.test.js +25 -14
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -68
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
- package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +7 -3
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +44 -30
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +3 -3
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +24 -11
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -5
- package/Components/VideoModal/PlayerDetails.tsx +9 -6
- package/Components/VideoModal/PlayerWrapper.tsx +28 -5
- package/Components/VideoModal/VideoModal.tsx +2 -2
- 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/FocusableGroupContext/withFocusableContext.tsx +4 -10
- package/Contexts/HeaderOffsetContext/index.tsx +4 -6
- package/Contexts/ScreenContext/index.tsx +3 -10
- package/Contexts/ScreenLayoutContext/index.tsx +5 -3
- package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
- package/Decorators/Navigator/index.tsx +1 -1
- package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +18 -24
- package/Decorators/RiverResolver/index.tsx +6 -8
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
- package/Decorators/ZappPipesDataConnector/index.tsx +4 -30
- package/package.json +7 -11
- package/tsconfig.json +2 -3
- package/.babelrc +0 -8
- package/Components/Cell/CellStyles/FallbackCellStyle/index.js +0 -157
- package/Components/Cell/CellStyles/Hero/index.js +0 -111
- package/Components/Cell/CellStyles/ScreenSelector/index.js +0 -68
- package/Components/Cell/CellStyles/cellStylesResolver.ts +0 -19
- package/Components/Cell/CellStyles/colors.js +0 -40
- package/Components/Cell/CellStyles/index.js +0 -15
- package/Components/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
package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { View } from "react-native";
|
|
3
|
-
|
|
4
|
-
import {
|
|
3
|
+
|
|
4
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
5
5
|
|
|
6
6
|
import { ZappUIComponent } from "../index";
|
|
7
7
|
|
|
@@ -37,7 +37,13 @@ const ErrorComponent = (props) => <MockComponent name="error" {...props} />;
|
|
|
37
37
|
const LoadingComponent = (props) => <MockComponent name="loading" {...props} />;
|
|
38
38
|
|
|
39
39
|
function getProps(zappPipesData) {
|
|
40
|
-
return {
|
|
40
|
+
return {
|
|
41
|
+
component: {
|
|
42
|
+
rules: {},
|
|
43
|
+
},
|
|
44
|
+
onLoadFinished,
|
|
45
|
+
zappPipesData,
|
|
46
|
+
};
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
function getWrapper({ error, loading, props }) {
|
|
@@ -47,21 +53,28 @@ function getWrapper({ error, loading, props }) {
|
|
|
47
53
|
LoadingComponent: loading ? LoadingComponent : null,
|
|
48
54
|
});
|
|
49
55
|
|
|
50
|
-
return
|
|
56
|
+
return renderWithProviders(
|
|
57
|
+
<View testID="outer-test-view">
|
|
58
|
+
<WrappedComponent testID="test-view" {...props} />
|
|
59
|
+
</View>
|
|
60
|
+
);
|
|
51
61
|
}
|
|
52
62
|
|
|
53
63
|
describe("ZappUIComponent", () => {
|
|
54
64
|
describe("when zapp pipes data is loading", () => {
|
|
55
65
|
const props = getProps(zappPipesData_loading);
|
|
56
66
|
|
|
57
|
-
it("renders
|
|
67
|
+
it("renders placeholder component if no loading component is provided", () => {
|
|
58
68
|
const wrapper = getWrapper({ props });
|
|
59
|
-
|
|
69
|
+
const testView = wrapper.getByTestId("ZappUIComponent-placeholder");
|
|
70
|
+
|
|
71
|
+
expect(testView.props).toBeDefined();
|
|
60
72
|
});
|
|
61
73
|
|
|
62
74
|
it("renders correctly otherwise", () => {
|
|
63
75
|
const wrapper = getWrapper({ props, loading: true });
|
|
64
|
-
|
|
76
|
+
const testView = wrapper.getByTestId("test-view");
|
|
77
|
+
expect(testView.props.name).toBe("loading");
|
|
65
78
|
});
|
|
66
79
|
});
|
|
67
80
|
|
|
@@ -70,12 +83,14 @@ describe("ZappUIComponent", () => {
|
|
|
70
83
|
|
|
71
84
|
it("renders null if no error component is provided", () => {
|
|
72
85
|
const wrapper = getWrapper({ props });
|
|
73
|
-
|
|
86
|
+
|
|
87
|
+
expect(wrapper.queryByTestId("test-view")).toBeNull();
|
|
74
88
|
});
|
|
75
89
|
|
|
76
90
|
it("renders correctly otherwise", () => {
|
|
77
91
|
const wrapper = getWrapper({ props, error: true });
|
|
78
|
-
|
|
92
|
+
const testView = wrapper.getByTestId("test-view");
|
|
93
|
+
expect(testView.props.name).toBe("error");
|
|
79
94
|
});
|
|
80
95
|
});
|
|
81
96
|
|
|
@@ -84,7 +99,8 @@ describe("ZappUIComponent", () => {
|
|
|
84
99
|
|
|
85
100
|
it("renders correctly", () => {
|
|
86
101
|
const wrapper = getWrapper({ props });
|
|
87
|
-
|
|
102
|
+
const testView = wrapper.getByTestId("test-view");
|
|
103
|
+
expect(testView.props.name).toBe("success");
|
|
88
104
|
});
|
|
89
105
|
});
|
|
90
106
|
});
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as R from "ramda";
|
|
3
3
|
import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
|
|
4
|
-
import { ifEmptyUseFallback } from "@applicaster/zapp-react-native-utils/cellUtils";
|
|
5
|
-
import { isAndroidTVPlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
6
4
|
import {
|
|
7
5
|
UIComponentContext,
|
|
8
6
|
useUIComponentContext,
|
|
@@ -10,7 +8,7 @@ import {
|
|
|
10
8
|
|
|
11
9
|
import { Placeholder } from "./Placeholder";
|
|
12
10
|
import { useInitialLoading } from "./hooks";
|
|
13
|
-
import {
|
|
11
|
+
import { useIsFocusable } from "@applicaster/zapp-react-native-utils/focusManager";
|
|
14
12
|
|
|
15
13
|
type ReactComponent = React.ComponentType<any>;
|
|
16
14
|
|
|
@@ -127,7 +125,6 @@ New signature: {Component, ErrorComponent, LoadingComponent, options}`
|
|
|
127
125
|
props;
|
|
128
126
|
|
|
129
127
|
const parent = useUIComponentContext();
|
|
130
|
-
const { setIsFocusable } = useFocusable();
|
|
131
128
|
|
|
132
129
|
const isLoading = toBooleanWithDefaultFalse(zappPipesData?.loading);
|
|
133
130
|
const isInitialLoading = useInitialLoading(isLoading);
|
|
@@ -145,24 +142,14 @@ New signature: {Component, ErrorComponent, LoadingComponent, options}`
|
|
|
145
142
|
[props, parent]
|
|
146
143
|
);
|
|
147
144
|
|
|
145
|
+
useIsFocusable(componentProps);
|
|
146
|
+
|
|
148
147
|
React.useEffect(() => {
|
|
149
148
|
if (!skipOnLoadFinished && !isLoading) {
|
|
150
149
|
onLoadFinished();
|
|
151
150
|
}
|
|
152
151
|
}, [isLoading]);
|
|
153
152
|
|
|
154
|
-
React.useEffect(() => {
|
|
155
|
-
const focusable = ifEmptyUseFallback(
|
|
156
|
-
props.component?.rules?.component_cells_focusable,
|
|
157
|
-
true
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
// Android TV only fix for focusable components - manually set focusable false
|
|
161
|
-
if (!focusable && isAndroidTVPlatform()) {
|
|
162
|
-
setIsFocusable(focusable);
|
|
163
|
-
}
|
|
164
|
-
}, [props.component?.rules?.component_cells_focusable]);
|
|
165
|
-
|
|
166
153
|
if (isDataSourceEmpty(props) && allowsEmptyDataSource) {
|
|
167
154
|
return RenderComponent(Component, componentProps);
|
|
168
155
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { Platform } from "react-native";
|
|
3
|
-
import {
|
|
4
|
-
import { shallowToJson } from "enzyme-to-json";
|
|
3
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
5
4
|
|
|
6
5
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
7
6
|
useRoute: jest.fn(() => ({ screenData: { id: "test" } })),
|
|
7
|
+
useIsScreenActive: jest.fn(() => true),
|
|
8
8
|
}));
|
|
9
9
|
|
|
10
10
|
jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
|
|
@@ -26,8 +26,16 @@ const cell_styles = "style";
|
|
|
26
26
|
const configuration = { component, styles, cell_styles } as const;
|
|
27
27
|
|
|
28
28
|
describe("DefaultCellRenderer", () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
Platform.OS = "ios"; // Reset to default
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
|
|
29
37
|
it("is a function", () => {
|
|
30
|
-
expect(DefaultCellRenderer).
|
|
38
|
+
expect(typeof DefaultCellRenderer).toBe("function");
|
|
31
39
|
});
|
|
32
40
|
|
|
33
41
|
it("returns an error if component is missing in configuration", () => {
|
|
@@ -36,28 +44,23 @@ describe("DefaultCellRenderer", () => {
|
|
|
36
44
|
);
|
|
37
45
|
});
|
|
38
46
|
|
|
39
|
-
it("
|
|
47
|
+
it("renders correctly", () => {
|
|
40
48
|
const CellRenderer = DefaultCellRenderer(configuration);
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
expect(shallowToJson(wrapper)).toMatchSnapshot();
|
|
49
|
+
const result = renderWithProviders(<CellRenderer store={null} />);
|
|
50
|
+
expect(result).toBeTruthy();
|
|
44
51
|
});
|
|
45
52
|
|
|
46
|
-
it("
|
|
53
|
+
it("renders correctly for LG TVs", () => {
|
|
47
54
|
Platform.OS = "lg_tv";
|
|
48
|
-
|
|
49
55
|
const CellRenderer = DefaultCellRenderer(configuration);
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
expect(shallowToJson(wrapper)).toMatchSnapshot();
|
|
56
|
+
const result = renderWithProviders(<CellRenderer store={null} />);
|
|
57
|
+
expect(result).toBeTruthy();
|
|
53
58
|
});
|
|
54
59
|
|
|
55
|
-
it("
|
|
60
|
+
it("renders correctly for Samsung TVs", () => {
|
|
56
61
|
Platform.OS = "samsung_tv";
|
|
57
|
-
|
|
58
62
|
const CellRenderer = DefaultCellRenderer(configuration);
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
expect(shallowToJson(wrapper)).toMatchSnapshot();
|
|
63
|
+
const result = renderWithProviders(<CellRenderer store={null} />);
|
|
64
|
+
expect(result).toBeTruthy();
|
|
62
65
|
});
|
|
63
66
|
});
|
package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
3
|
+
import { DefaultCell } from "../";
|
|
4
|
+
import { masterCellBuilder } from "@applicaster/zapp-react-native-ui-components/Components/MasterCell";
|
|
5
|
+
import { View, Text, Image } from "react-native";
|
|
3
6
|
|
|
4
7
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
5
8
|
useRoute: jest.fn(() => ({ screenData: { id: "test" } })),
|
|
9
|
+
useIsScreenActive: jest.fn(() => true),
|
|
6
10
|
}));
|
|
7
11
|
|
|
8
12
|
jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
|
|
@@ -12,12 +16,6 @@ jest.mock("@applicaster/zapp-react-native-utils/screenState", () => ({
|
|
|
12
16
|
})),
|
|
13
17
|
}));
|
|
14
18
|
|
|
15
|
-
const {
|
|
16
|
-
masterCellBuilder,
|
|
17
|
-
} = require("@applicaster/zapp-react-native-ui-components/Components/MasterCell");
|
|
18
|
-
|
|
19
|
-
const { DefaultCell } = require("../");
|
|
20
|
-
|
|
21
19
|
describe("DefaultCell", () => {
|
|
22
20
|
it("is a function", () => {
|
|
23
21
|
expect(DefaultCell).toBeFunction();
|
|
@@ -33,15 +31,21 @@ describe("DefaultCell", () => {
|
|
|
33
31
|
} as const;
|
|
34
32
|
|
|
35
33
|
const CellRenderer = masterCellBuilder({
|
|
34
|
+
components: {
|
|
35
|
+
View: View,
|
|
36
|
+
Text: Text,
|
|
37
|
+
Image: Image,
|
|
38
|
+
},
|
|
36
39
|
containerStyle: {},
|
|
37
40
|
cellConfiguration: DefaultCell(styles),
|
|
38
41
|
});
|
|
39
42
|
|
|
40
|
-
const
|
|
43
|
+
const { UNSAFE_getAllByType } = renderWithProviders(<CellRenderer />);
|
|
44
|
+
const textElement = UNSAFE_getAllByType(Text)[0];
|
|
41
45
|
|
|
42
|
-
expect(
|
|
43
|
-
"rgba(239,239,239,1.0)"
|
|
44
|
-
);
|
|
46
|
+
expect(textElement.props.style).toMatchObject({
|
|
47
|
+
color: "rgba(239,239,239,1.0)",
|
|
48
|
+
});
|
|
45
49
|
});
|
|
46
50
|
|
|
47
51
|
it.skip("matches snapshot", () => {
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
2
|
+
import React, { PropsWithChildren, useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
export const ComponentsMapOffsetContext = React.createContext({
|
|
5
|
+
setComponentsMapOffset: (_offset: number) => void 0,
|
|
6
|
+
componentsMapOffset: 0,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export const ComponentsMapOffsetContextProvider = ({
|
|
10
|
+
children,
|
|
11
|
+
}: PropsWithChildren<{}>) => {
|
|
12
|
+
const theme = useTheme<BaseThemePropertiesTV>();
|
|
13
|
+
|
|
14
|
+
const [componentsMapOffset, setComponentsMapOffset] = React.useState(
|
|
15
|
+
theme?.screen_margin_top
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const contextValue = useMemo(
|
|
19
|
+
() => ({
|
|
20
|
+
componentsMapOffset,
|
|
21
|
+
setComponentsMapOffset,
|
|
22
|
+
}),
|
|
23
|
+
[componentsMapOffset]
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<ComponentsMapOffsetContext.Provider value={contextValue}>
|
|
28
|
+
{children}
|
|
29
|
+
</ComponentsMapOffsetContext.Provider>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const withComponentsMapOffsetContext = (Component: any) =>
|
|
34
|
+
function ComponentsMapOffsetContextProviderWrapper(props: {}) {
|
|
35
|
+
return (
|
|
36
|
+
<ComponentsMapOffsetContextProvider>
|
|
37
|
+
<Component {...props} />
|
|
38
|
+
</ComponentsMapOffsetContextProvider>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const withComponentsMapOffsetContextConsumer = (Component: any) =>
|
|
43
|
+
function ComponentsMapOffsetContextConsumerWrapper(props: {}) {
|
|
44
|
+
const { componentsMapOffset } = React.useContext(
|
|
45
|
+
ComponentsMapOffsetContext
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
return <Component {...props} componentsMapOffset={componentsMapOffset} />;
|
|
49
|
+
};
|
|
@@ -7,17 +7,11 @@ export const withFocusableContext = (Component) => {
|
|
|
7
7
|
{ groupId, ...props }: Record<string, any>,
|
|
8
8
|
ref
|
|
9
9
|
) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// eslint-disable-next-line react/display-name
|
|
14
|
-
const propsGroupId = groupId || null;
|
|
15
|
-
const providedGroupId = propsGroupId || groupIdContext;
|
|
10
|
+
const groupIdContext = React.useContext(FocusableGroupContext);
|
|
11
|
+
const propsGroupId = groupId || null;
|
|
12
|
+
const providedGroupId = propsGroupId || groupIdContext;
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
}}
|
|
19
|
-
</FocusableGroupContext.Consumer>
|
|
20
|
-
);
|
|
14
|
+
return <Component {...props} groupId={providedGroupId} ref={ref} />;
|
|
21
15
|
};
|
|
22
16
|
|
|
23
17
|
return React.forwardRef(WithFocusableContext);
|
|
@@ -13,7 +13,7 @@ type ProviderProps = {
|
|
|
13
13
|
};
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
const initialHeaderOffsetContext = () => ({
|
|
16
|
+
const initialHeaderOffsetContext: HeaderOffsetContextType = () => ({
|
|
17
17
|
headerOffset: 0,
|
|
18
18
|
headersAbove: null,
|
|
19
19
|
});
|
|
@@ -24,11 +24,9 @@ export const HeaderOffsetContext = React.createContext<HeaderOffsetContextType>(
|
|
|
24
24
|
|
|
25
25
|
export function withConsumer(Component) {
|
|
26
26
|
return function WithConsumer(props) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
</HeaderOffsetContext.Consumer>
|
|
31
|
-
);
|
|
27
|
+
const getHeaderOffset = React.useContext(HeaderOffsetContext);
|
|
28
|
+
|
|
29
|
+
return <Component getHeaderOffset={getHeaderOffset} {...props} />;
|
|
32
30
|
};
|
|
33
31
|
}
|
|
34
32
|
|
|
@@ -176,15 +176,8 @@ export function ScreenContextProvider({
|
|
|
176
176
|
|
|
177
177
|
export function withScreenContext(Component: React.ComponentType<any>) {
|
|
178
178
|
return function WithScreenContextWrapper(props) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
(value) => (
|
|
183
|
-
<Component {...props} screenContext={value} />
|
|
184
|
-
),
|
|
185
|
-
[Component, props]
|
|
186
|
-
)}
|
|
187
|
-
</ScreenContext.Consumer>
|
|
188
|
-
);
|
|
179
|
+
const screenContext = React.useContext(ScreenContext);
|
|
180
|
+
|
|
181
|
+
return <Component {...props} screenContext={screenContext} />;
|
|
189
182
|
};
|
|
190
183
|
}
|
|
@@ -8,10 +8,11 @@ type LayoutContext = {
|
|
|
8
8
|
componentAnchorPointY: number | null;
|
|
9
9
|
componentAvailableWidth: number | null;
|
|
10
10
|
setScreenLayout?: (properties: {}) => void;
|
|
11
|
+
resetScreenLayout?: () => void;
|
|
11
12
|
extraAnchorPointYOffset: number;
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
const
|
|
15
|
+
const initialScreenLayoutContext: LayoutContext = {
|
|
15
16
|
screenMarginTop: null,
|
|
16
17
|
screenMarginBottom: null,
|
|
17
18
|
screenHeight: null,
|
|
@@ -21,8 +22,9 @@ const screenLayoutContext: LayoutContext = {
|
|
|
21
22
|
extraAnchorPointYOffset: 0,
|
|
22
23
|
};
|
|
23
24
|
|
|
24
|
-
export const ScreenLayoutContext =
|
|
25
|
-
|
|
25
|
+
export const ScreenLayoutContext = React.createContext<LayoutContext>(
|
|
26
|
+
initialScreenLayoutContext
|
|
27
|
+
);
|
|
26
28
|
|
|
27
29
|
export function ScreenLayoutContextConsumer(Component) {
|
|
28
30
|
return function WithConsumer(props) {
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
4
|
+
import { withNavigator } from "..";
|
|
2
5
|
|
|
3
6
|
const navigatorMock = {
|
|
4
7
|
push: jest.fn(),
|
|
@@ -12,27 +15,24 @@ const navigatorMock = {
|
|
|
12
15
|
|
|
13
16
|
const mocked_context = navigatorMock;
|
|
14
17
|
|
|
15
|
-
jest.mock(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import { shallow } from "enzyme";
|
|
24
|
-
|
|
25
|
-
const React = require("react");
|
|
26
|
-
const { withNavigator } = require("../index");
|
|
18
|
+
jest.mock(
|
|
19
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
|
|
20
|
+
() => {
|
|
21
|
+
return {
|
|
22
|
+
useNavigation: jest.fn(() => mocked_context),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
);
|
|
27
26
|
|
|
28
27
|
describe("withNavigator Decorator", () => {
|
|
29
28
|
it("renders correctly", () => {
|
|
30
29
|
const Component = () => <View />;
|
|
31
30
|
const WrappedComponent = withNavigator(Component);
|
|
32
31
|
|
|
33
|
-
const wrapper =
|
|
32
|
+
const wrapper = renderWithProviders(<WrappedComponent someProp="foo" />);
|
|
34
33
|
|
|
35
|
-
expect(wrapper).
|
|
36
|
-
|
|
34
|
+
expect(wrapper.UNSAFE_getByType(Component).props.navigator).toEqual(
|
|
35
|
+
navigatorMock
|
|
36
|
+
);
|
|
37
37
|
});
|
|
38
38
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
|
|
3
|
-
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
|
|
3
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
|
|
4
4
|
import { deprecationWarningWithIdentifier } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
5
5
|
|
|
6
6
|
export function withNavigator(Component) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { shallow } from "enzyme";
|
|
3
2
|
import { View } from "react-native";
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
4
|
+
|
|
5
|
+
import { withRiver } from "../";
|
|
6
6
|
|
|
7
7
|
const rivers = {
|
|
8
8
|
A123: {
|
|
@@ -20,37 +20,31 @@ jest.doMock(
|
|
|
20
20
|
})
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
-
jest.
|
|
24
|
-
"@applicaster/zapp-react-native-utils/reactHooks/
|
|
23
|
+
jest.doMock(
|
|
24
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname",
|
|
25
25
|
() => ({
|
|
26
|
-
|
|
26
|
+
usePathname: jest.fn(() => "/home"),
|
|
27
27
|
})
|
|
28
28
|
);
|
|
29
29
|
|
|
30
|
-
jest.
|
|
31
|
-
|
|
32
|
-
// mocks useNavigator to return currentRoute: "/home"
|
|
33
|
-
jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
34
|
-
useNavigation: jest.fn(() => ({ currentRoute: "/home" })),
|
|
35
|
-
useRoute: jest.fn(() => ({ pathname: "/home" })),
|
|
36
|
-
}));
|
|
37
|
-
|
|
38
|
-
const { withRiver } = require("../index");
|
|
39
|
-
|
|
40
|
-
const TestComponent = jest.fn(() => <View />);
|
|
30
|
+
const TestComponent = jest.fn((props) => <View {...props} />);
|
|
41
31
|
|
|
42
32
|
describe("withRiver HoC", () => {
|
|
43
33
|
const WrappedComponent = withRiver(TestComponent);
|
|
44
34
|
|
|
45
|
-
const wrapper =
|
|
46
|
-
<WrappedComponent
|
|
35
|
+
const wrapper = renderWithProviders(
|
|
36
|
+
<WrappedComponent
|
|
37
|
+
testID="test-view"
|
|
38
|
+
screenId="A123"
|
|
39
|
+
otherProp="otherProp"
|
|
40
|
+
/>,
|
|
41
|
+
{ rivers: rivers }
|
|
47
42
|
);
|
|
48
43
|
|
|
49
|
-
it("renders correctly", () => {
|
|
50
|
-
expect(shallowToJson(wrapper)).toMatchSnapshot();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
44
|
it("populates the river prop", () => {
|
|
54
|
-
|
|
45
|
+
const targetView = wrapper.getByTestId("test-view");
|
|
46
|
+
|
|
47
|
+
expect(targetView.props.river).toEqual(rivers.A123);
|
|
48
|
+
expect(targetView.props.screenData).toEqual(rivers.A123);
|
|
55
49
|
});
|
|
56
50
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
|
|
3
|
-
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
4
3
|
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
5
|
-
import { usePathname } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
|
|
4
|
+
import { usePathname } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/usePathname";
|
|
5
|
+
import { useRivers } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
6
6
|
|
|
7
7
|
type Props = ZappUIComponentProps & {
|
|
8
8
|
rivers: ZappRivers;
|
|
@@ -12,27 +12,25 @@ type Props = ZappUIComponentProps & {
|
|
|
12
12
|
|
|
13
13
|
export function withRiver(Component: ZappComponent): ZappComponent {
|
|
14
14
|
const RiverWithData = ({ screenId, ...otherProps }: Props) => {
|
|
15
|
-
const
|
|
15
|
+
const river = useRivers()?.[screenId];
|
|
16
16
|
const pathname = usePathname();
|
|
17
|
-
const river = rivers[screenId];
|
|
18
17
|
|
|
19
18
|
if (!river) {
|
|
20
19
|
return null;
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
if (!otherProps.screenData) {
|
|
24
|
-
otherProps.screenData = river;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
22
|
return (
|
|
28
23
|
<Component
|
|
29
24
|
screenId={screenId}
|
|
30
25
|
river={river}
|
|
31
26
|
key={isTV() ? pathname : undefined}
|
|
32
27
|
{...otherProps}
|
|
28
|
+
screenData={otherProps.screenData || river}
|
|
33
29
|
/>
|
|
34
30
|
);
|
|
35
31
|
};
|
|
36
32
|
|
|
33
|
+
RiverWithData.displayName = `RiverWithData(${Component.displayName || Component.name})`;
|
|
34
|
+
|
|
37
35
|
return RiverWithData;
|
|
38
36
|
}
|