@applicaster/zapp-react-native-utils 12.0.0-alpha.5251355865 → 12.0.0-alpha.5350212300
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/analyticsUtils/helpers/hooks.ts +1 -1
- package/appUtils/HooksManager/index.js +3 -1
- package/appUtils/focusManager/index.ts +128 -25
- package/appUtils/focusManager/treeDataStructure/Utils/index.js +97 -33
- package/appUtils/focusManager/utils/index.ts +65 -0
- package/appUtils/playerManager/conts.ts +5 -0
- package/appUtils/playerManager/player.ts +35 -0
- package/appUtils/playerManager/playerFactory.ts +12 -10
- package/appUtils/playerManager/playerNative.ts +9 -0
- package/cellUtils/index.ts +5 -3
- package/focusManager/index.ts +1 -1
- package/localizationUtils/index.ts +6 -3
- package/logger/index.ts +1 -1
- package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
- package/manifestUtils/defaultManifestConfigurations/player.js +2 -1
- package/manifestUtils/index.js +5 -1
- package/manifestUtils/secondaryImage/index.js +18 -15
- package/package.json +2 -2
- package/playerUtils/configurationGenerator.ts +3 -1
- package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +2 -0
- package/reactHooks/autoscrolling/__tests__/{useTrackedView.test.ts → useTrackedView.test.tsx} +18 -1
- package/reactHooks/flatList/useLoadNextPageIfNeeded.ts +16 -9
- package/reactHooks/layout/__tests__/{index.test.js → index.test.tsx} +44 -29
- package/reactHooks/layout/getDeviceInfo/index.ts +4 -2
- package/reactHooks/layout/types/index.ts +2 -0
- package/reactHooks/layout/useDimensions/useDimensions.ts +13 -7
- package/reactHooks/navigation/__mocks__/index.ts +15 -0
- package/reactHooks/navigation/__mocks__/useNavigation.ts +3 -0
- package/reactHooks/navigation/index.ts +84 -19
- package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +3 -1
- package/reactHooks/screen/useScreenContext.ts +4 -3
- package/reactHooks/screen/useScreenData.ts +1 -1
- package/reactHooks/screen/useTargetScreenData.ts +7 -0
- package/reactHooks/state/useRivers.ts +3 -1
- package/reactHooks/videoModal/hooks/useVideoModalScreenData.tsx +10 -9
- package/reactUtils/helpers.tsx +1 -1
- package/riverComponetsMeasurementProvider/index.tsx +2 -2
- package/screenState/index.ts +0 -8
- package/stringUtils/index.ts +5 -0
- package/testUtils/getByTestId.ts +14 -0
- package/testUtils/index.tsx +24 -22
|
@@ -1663,7 +1663,8 @@ function getPlayerConfiguration({ platform }) {
|
|
|
1663
1663
|
platform.includes("lg") ||
|
|
1664
1664
|
platform.includes("samsung") ||
|
|
1665
1665
|
platform.includes("android_tv") ||
|
|
1666
|
-
platform.includes("amazon")
|
|
1666
|
+
platform.includes("amazon") ||
|
|
1667
|
+
platform.includes("vizio")
|
|
1667
1668
|
) {
|
|
1668
1669
|
styles.fields.push(
|
|
1669
1670
|
// Captions Menu
|
package/manifestUtils/index.js
CHANGED
|
@@ -22,7 +22,11 @@ const {
|
|
|
22
22
|
const { buttonKey } = require("./buttons");
|
|
23
23
|
const { tvBadges } = require("./tvBadges");
|
|
24
24
|
const { mobileProgressBar, tvProgressBar } = require("./progressBar");
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
const {
|
|
27
|
+
secondaryImage,
|
|
28
|
+
getUpdatedSecondaryImageKeys,
|
|
29
|
+
} = require("./secondaryImage");
|
|
26
30
|
|
|
27
31
|
module.exports = {
|
|
28
32
|
fontKey,
|
|
@@ -132,29 +132,32 @@ function secondaryImage({
|
|
|
132
132
|
|
|
133
133
|
const POSITION_OVER_IMAGE = toSnakeCase(position_over_image);
|
|
134
134
|
|
|
135
|
-
const getUpdatedSecondaryImageKeys = (secondaryImageManifest) =>
|
|
136
|
-
|
|
135
|
+
const getUpdatedSecondaryImageKeys = (secondaryImageManifest) =>
|
|
136
|
+
secondaryImageManifest.fields.reduce((acc, item) => {
|
|
137
|
+
const key = item.key;
|
|
137
138
|
|
|
138
|
-
|
|
139
|
+
const conditionalFields = (item.conditional_fields || []).map(
|
|
140
|
+
(field) => field.key
|
|
141
|
+
);
|
|
139
142
|
|
|
140
|
-
|
|
141
|
-
|
|
143
|
+
const updatedConditionalFields = conditionalFields.reduce((acc, field) => {
|
|
144
|
+
const updatedKey = field.replace("secondary_image_", "nested_image_");
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
...acc,
|
|
148
|
+
[updatedKey]: field,
|
|
149
|
+
};
|
|
150
|
+
}, {});
|
|
151
|
+
|
|
152
|
+
const updatedKey = key.replace("secondary_image_", "nested_image_");
|
|
142
153
|
|
|
143
154
|
return {
|
|
144
155
|
...acc,
|
|
145
|
-
|
|
156
|
+
...updatedConditionalFields,
|
|
157
|
+
[updatedKey]: key,
|
|
146
158
|
};
|
|
147
159
|
}, {});
|
|
148
160
|
|
|
149
|
-
const updatedKey = key.replace("secondary_image_", "nested_image_");
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
...acc,
|
|
153
|
-
...updatedConditionalFields,
|
|
154
|
-
[updatedKey]: key,
|
|
155
|
-
};
|
|
156
|
-
}, {});
|
|
157
|
-
|
|
158
161
|
module.exports = {
|
|
159
162
|
secondaryImage,
|
|
160
163
|
getUpdatedSecondaryImageKeys,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-utils",
|
|
3
|
-
"version": "12.0.0-alpha.
|
|
3
|
+
"version": "12.0.0-alpha.5350212300",
|
|
4
4
|
"description": "Applicaster Zapp React Native utilities package",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@applicaster/applicaster-types": "12.0.0-alpha.
|
|
31
|
+
"@applicaster/applicaster-types": "12.0.0-alpha.5350212300",
|
|
32
32
|
"buffer": "^5.2.1",
|
|
33
33
|
"camelize": "^1.0.0",
|
|
34
34
|
"create-react-context": "^0.2.3",
|
|
@@ -22,6 +22,7 @@ function getDevice(platform) {
|
|
|
22
22
|
case "android_tv_for_quickbrick":
|
|
23
23
|
case "lg_tv":
|
|
24
24
|
case "samsung_tv":
|
|
25
|
+
case "vizio":
|
|
25
26
|
case "web":
|
|
26
27
|
return "tv";
|
|
27
28
|
}
|
|
@@ -1659,7 +1660,8 @@ function getPlayerConfiguration({ platform }) {
|
|
|
1659
1660
|
platform.includes("lg") ||
|
|
1660
1661
|
platform.includes("samsung") ||
|
|
1661
1662
|
platform.includes("android_tv") ||
|
|
1662
|
-
platform.includes("amazon")
|
|
1663
|
+
platform.includes("amazon") ||
|
|
1664
|
+
platform.includes("vizio")
|
|
1663
1665
|
) {
|
|
1664
1666
|
styles.fields.push(
|
|
1665
1667
|
// Captions Menu for TV
|
package/reactHooks/autoscrolling/__tests__/{useTrackedView.test.ts → useTrackedView.test.tsx}
RENAMED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
1
3
|
import { act, renderHook } from "@testing-library/react-hooks";
|
|
4
|
+
import { Provider } from "react-redux";
|
|
5
|
+
import configureStore from "redux-mock-store";
|
|
2
6
|
|
|
3
7
|
const mockUpdateComponentsPositions = jest.fn();
|
|
4
8
|
|
|
@@ -17,11 +21,24 @@ jest.mock(
|
|
|
17
21
|
|
|
18
22
|
jest.useFakeTimers();
|
|
19
23
|
|
|
24
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation");
|
|
25
|
+
|
|
26
|
+
const mockStore = configureStore();
|
|
27
|
+
|
|
28
|
+
const store = mockStore({ appData: {} });
|
|
29
|
+
|
|
30
|
+
const Wrapper = ({ children }: { children: React.ReactChild }) => (
|
|
31
|
+
/* @ts-ignore */
|
|
32
|
+
<Provider store={store}>{children}</Provider>
|
|
33
|
+
);
|
|
34
|
+
|
|
20
35
|
const { useTrackedView } = require("../useTrackedView");
|
|
21
36
|
|
|
22
37
|
describe("useTrackCurrentAutoScrollingElement", () => {
|
|
23
38
|
it("should update position for selected component", async () => {
|
|
24
|
-
const { result } = renderHook(() => useTrackedView("123")
|
|
39
|
+
const { result } = renderHook(() => useTrackedView("123"), {
|
|
40
|
+
wrapper: Wrapper,
|
|
41
|
+
});
|
|
25
42
|
|
|
26
43
|
// Fast-forward until all timers have been executed
|
|
27
44
|
jest.advanceTimersByTime(3000);
|
|
@@ -5,27 +5,34 @@ type Return = (index: number) => void;
|
|
|
5
5
|
|
|
6
6
|
type Predicate = (
|
|
7
7
|
entry: ZappUIComponentProps["zappPipesData"]["data"]["entry"],
|
|
8
|
-
index: number
|
|
8
|
+
index: number,
|
|
9
|
+
numberOfColumns: number
|
|
9
10
|
) => boolean;
|
|
10
11
|
|
|
11
12
|
type Props = {
|
|
12
13
|
ifNeeded: Predicate;
|
|
13
14
|
loadNextData: () => void;
|
|
14
15
|
entry: ZappUIComponentProps["zappPipesData"]["data"]["entry"];
|
|
16
|
+
numberOfColumns?: number;
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
const handleLoadNextPage =
|
|
18
20
|
(
|
|
19
|
-
ifNeeded: (
|
|
21
|
+
ifNeeded: (
|
|
22
|
+
entry: ZappEntry[],
|
|
23
|
+
index: number,
|
|
24
|
+
numberOfColumns?: number
|
|
25
|
+
) => boolean,
|
|
20
26
|
loadNextData: () => void,
|
|
21
|
-
entry: ZappEntry[]
|
|
27
|
+
entry: ZappEntry[],
|
|
28
|
+
numberOfColumns
|
|
22
29
|
) =>
|
|
23
30
|
(index: number) => {
|
|
24
31
|
/**
|
|
25
32
|
* Lazy-Loading, invoke nextLoadData if we reach the end of the List
|
|
26
33
|
*/
|
|
27
34
|
|
|
28
|
-
if (ifNeeded(entry, index)) {
|
|
35
|
+
if (ifNeeded(entry, index, numberOfColumns)) {
|
|
29
36
|
loadNextData();
|
|
30
37
|
}
|
|
31
38
|
};
|
|
@@ -34,10 +41,10 @@ export const useLoadNextPageIfNeeded = ({
|
|
|
34
41
|
ifNeeded,
|
|
35
42
|
loadNextData = noop,
|
|
36
43
|
entry,
|
|
44
|
+
numberOfColumns = 0,
|
|
37
45
|
}: Props): Return => {
|
|
38
|
-
return React.useCallback(
|
|
39
|
-
ifNeeded,
|
|
40
|
-
loadNextData,
|
|
41
|
-
|
|
42
|
-
]);
|
|
46
|
+
return React.useCallback(
|
|
47
|
+
handleLoadNextPage(ifNeeded, loadNextData, entry, numberOfColumns),
|
|
48
|
+
[ifNeeded, loadNextData, entry, numberOfColumns]
|
|
49
|
+
);
|
|
43
50
|
};
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
1
3
|
import { cleanup, renderHook } from "@testing-library/react-hooks";
|
|
4
|
+
import { Provider } from "react-redux";
|
|
5
|
+
import configureStore from "redux-mock-store";
|
|
2
6
|
|
|
3
7
|
import * as ReactNative from "react-native";
|
|
4
8
|
|
|
@@ -44,22 +48,47 @@ jest.mock("../../../reactUtils", () => ({
|
|
|
44
48
|
|
|
45
49
|
jest.mock("../../navigation", () => ({
|
|
46
50
|
useNavigation: () => null,
|
|
51
|
+
useIsScreenActive: () => true,
|
|
47
52
|
}));
|
|
48
53
|
|
|
49
54
|
const { Dimensions } = require("react-native");
|
|
50
|
-
const { useDimensions } = require("
|
|
55
|
+
const { useDimensions } = require("..");
|
|
56
|
+
|
|
57
|
+
const mockStore = configureStore();
|
|
58
|
+
|
|
59
|
+
const getWrapper = () => {
|
|
60
|
+
const store = mockStore({ appData: {} });
|
|
61
|
+
|
|
62
|
+
const Wrapper = ({ children }: { children: React.ReactChild }) => (
|
|
63
|
+
/* @ts-ignore */
|
|
64
|
+
<Provider store={store}>{children}</Provider>
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
return Wrapper;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const testHook = (context, params?) => {
|
|
71
|
+
const wrapper = getWrapper();
|
|
72
|
+
|
|
73
|
+
const {
|
|
74
|
+
result,
|
|
75
|
+
result: { current: dimensions },
|
|
76
|
+
} = renderHook(() => useDimensions(context, params), {
|
|
77
|
+
wrapper,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return { result, dimensions };
|
|
81
|
+
};
|
|
51
82
|
|
|
52
83
|
describe("useDimensions", () => {
|
|
53
84
|
it("renders", () => {
|
|
54
|
-
const { result } =
|
|
55
|
-
useDimensions("window", { fullDimensions: true })
|
|
56
|
-
);
|
|
85
|
+
const { result } = testHook("window", { fullDimensions: true });
|
|
57
86
|
|
|
58
87
|
expect(result).toBeDefined();
|
|
59
88
|
});
|
|
60
89
|
|
|
61
90
|
it("sets event listener", () => {
|
|
62
|
-
|
|
91
|
+
testHook("window", { fullDimensions: true });
|
|
63
92
|
|
|
64
93
|
expect(Dimensions.addEventListener).toBeCalledWith(
|
|
65
94
|
"change",
|
|
@@ -68,16 +97,14 @@ describe("useDimensions", () => {
|
|
|
68
97
|
});
|
|
69
98
|
|
|
70
99
|
it("removes event listener", () => {
|
|
71
|
-
|
|
100
|
+
testHook("window", { fullDimensions: true });
|
|
72
101
|
cleanup();
|
|
73
102
|
|
|
74
103
|
expect(mockRemoveFn).toBeCalled();
|
|
75
104
|
});
|
|
76
105
|
|
|
77
106
|
it("Returns full dimensions object", () => {
|
|
78
|
-
const {
|
|
79
|
-
result: { current: dimensions },
|
|
80
|
-
} = renderHook(() => useDimensions("window", { fullDimensions: true }));
|
|
107
|
+
const { dimensions } = testHook("window", { fullDimensions: true });
|
|
81
108
|
|
|
82
109
|
expect(dimensions).toHaveProperty("height");
|
|
83
110
|
expect(dimensions).toHaveProperty("width");
|
|
@@ -86,20 +113,17 @@ describe("useDimensions", () => {
|
|
|
86
113
|
});
|
|
87
114
|
|
|
88
115
|
it("Returns shorthand dimensions object", () => {
|
|
89
|
-
const {
|
|
90
|
-
result: { current: dimensions },
|
|
91
|
-
} = renderHook(() => useDimensions("window"));
|
|
116
|
+
const { dimensions } = testHook("window");
|
|
92
117
|
|
|
93
118
|
expect(dimensions).toHaveProperty("height");
|
|
94
119
|
expect(dimensions).toHaveProperty("width");
|
|
95
120
|
});
|
|
96
121
|
|
|
97
122
|
it("Returns the device info object", () => {
|
|
98
|
-
const {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
);
|
|
123
|
+
const { dimensions } = testHook("window", {
|
|
124
|
+
fullDimensions: true,
|
|
125
|
+
deviceInfo: true,
|
|
126
|
+
});
|
|
103
127
|
|
|
104
128
|
expect(dimensions).toHaveProperty("height");
|
|
105
129
|
expect(dimensions).toHaveProperty("width");
|
|
@@ -112,10 +136,7 @@ describe("useDimensions", () => {
|
|
|
112
136
|
it("applies the scale on TV, and screen context", () => {
|
|
113
137
|
tv_flag = true;
|
|
114
138
|
const { screen } = mocked_return_value(tv_flag);
|
|
115
|
-
|
|
116
|
-
const {
|
|
117
|
-
result: { current: dimensions },
|
|
118
|
-
} = renderHook(() => useDimensions("screen"));
|
|
139
|
+
const { dimensions } = testHook("screen");
|
|
119
140
|
|
|
120
141
|
expect(dimensions).toHaveProperty("height", screen.height * screen.scale);
|
|
121
142
|
expect(dimensions).toHaveProperty("width", screen.width * screen.scale);
|
|
@@ -127,10 +148,7 @@ describe("useDimensions", () => {
|
|
|
127
148
|
it("doesn't apply the scale on mobile with screen context", () => {
|
|
128
149
|
tv_flag = false;
|
|
129
150
|
const { screen } = mocked_return_value(tv_flag);
|
|
130
|
-
|
|
131
|
-
const {
|
|
132
|
-
result: { current: dimensions },
|
|
133
|
-
} = renderHook(() => useDimensions("screen"));
|
|
151
|
+
const { dimensions } = testHook("screen");
|
|
134
152
|
|
|
135
153
|
expect(dimensions).toHaveProperty("height", screen.height);
|
|
136
154
|
expect(dimensions).toHaveProperty("width", screen.width);
|
|
@@ -140,10 +158,7 @@ describe("useDimensions", () => {
|
|
|
140
158
|
it("doesn't apply the scale on TV with window context", () => {
|
|
141
159
|
tv_flag = true;
|
|
142
160
|
const { window } = mocked_return_value(tv_flag);
|
|
143
|
-
|
|
144
|
-
const {
|
|
145
|
-
result: { current: dimensions },
|
|
146
|
-
} = renderHook(() => useDimensions("window"));
|
|
161
|
+
const { dimensions } = testHook("window");
|
|
147
162
|
|
|
148
163
|
expect(dimensions).toHaveProperty("height", window.height);
|
|
149
164
|
expect(dimensions).toHaveProperty("width", window.width);
|
|
@@ -3,13 +3,15 @@ import { isTablet } from "../isTablet";
|
|
|
3
3
|
/**
|
|
4
4
|
* Returns an object with additional device info that can be used to determine if tablet
|
|
5
5
|
* @param {Number} dimensions - Dimensions object passed to the function
|
|
6
|
+
* @param {Object} appData - application data object passed to the function
|
|
6
7
|
* @returns {DeviceInfo} deviceInfo - returns an object with scale, isTablet, and orientation
|
|
7
8
|
*/
|
|
8
|
-
export const getDeviceInfo = (dimensions) => {
|
|
9
|
+
export const getDeviceInfo = (dimensions, appData) => {
|
|
9
10
|
const scale = dimensions?.scale;
|
|
10
11
|
const isLandscape = dimensions?.width > dimensions?.height;
|
|
11
12
|
const orientation = isLandscape ? "landscape" : "portrait";
|
|
12
13
|
const tablet = isTablet(dimensions, orientation) || false;
|
|
14
|
+
const isTabletLandscape = tablet && !appData?.isTabletPortrait;
|
|
13
15
|
|
|
14
|
-
return { scale, isTablet: tablet, orientation };
|
|
16
|
+
return { scale, isTablet: tablet, orientation, isTabletLandscape };
|
|
15
17
|
};
|
|
@@ -2,6 +2,7 @@ type DeviceInfo = {
|
|
|
2
2
|
isTablet: boolean;
|
|
3
3
|
scale: number;
|
|
4
4
|
orientation: string;
|
|
5
|
+
isTabletLandscape: boolean;
|
|
5
6
|
};
|
|
6
7
|
|
|
7
8
|
type RNDimensions = {
|
|
@@ -20,6 +21,7 @@ export type Options = {
|
|
|
20
21
|
excludeStatusBar?: boolean;
|
|
21
22
|
rounded?: boolean;
|
|
22
23
|
deviceInfo?: boolean;
|
|
24
|
+
updateForInactiveScreens?: boolean;
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export type Context = "window" | "screen";
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
2
|
|
|
3
3
|
import * as R from "ramda";
|
|
4
4
|
|
|
5
5
|
import { Dimensions, Platform, StatusBar } from "react-native";
|
|
6
|
+
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
7
|
+
|
|
6
8
|
import { isTV } from "../../../reactUtils";
|
|
7
9
|
|
|
8
10
|
import { Options, UseDimensions } from "../types";
|
|
9
11
|
import { getDeviceInfo } from "../getDeviceInfo";
|
|
10
12
|
import { getInitialDimensions } from "./helpers";
|
|
13
|
+
import { useIsScreenActive } from "../../navigation";
|
|
11
14
|
|
|
12
15
|
function compensateForScaleIfNeeded(context) {
|
|
13
16
|
return function () {
|
|
@@ -32,8 +35,11 @@ const statusBarHeight = StatusBar?.currentHeight;
|
|
|
32
35
|
*/
|
|
33
36
|
export const useDimensions: UseDimensions = (
|
|
34
37
|
context = "window",
|
|
35
|
-
fullDimensions = { fullDimensions: false }
|
|
38
|
+
fullDimensions = { fullDimensions: false, updateForInactiveScreens: true }
|
|
36
39
|
) => {
|
|
40
|
+
const isActive = useIsScreenActive();
|
|
41
|
+
const { appData } = usePickFromState(["appData"]);
|
|
42
|
+
|
|
37
43
|
if (typeof fullDimensions === "boolean") {
|
|
38
44
|
// eslint-disable-next-line no-console
|
|
39
45
|
console.warn(
|
|
@@ -47,7 +53,7 @@ export const useDimensions: UseDimensions = (
|
|
|
47
53
|
: { ...fullDimensions };
|
|
48
54
|
|
|
49
55
|
const [dimensions, setDimensions] = useState(getInitialDimensions(context));
|
|
50
|
-
const deviceInfo = useRef(getDeviceInfo(dimensions));
|
|
56
|
+
const deviceInfo = useRef(getDeviceInfo(dimensions, appData));
|
|
51
57
|
|
|
52
58
|
const applyOptions = R.compose(
|
|
53
59
|
R.when(() => options.deviceInfo, R.assoc("deviceInfo", deviceInfo.current)),
|
|
@@ -73,7 +79,7 @@ export const useDimensions: UseDimensions = (
|
|
|
73
79
|
|
|
74
80
|
if (newDimensions.width === newDimensions.height) {
|
|
75
81
|
/**
|
|
76
|
-
* Ignoring case
|
|
82
|
+
* Ignoring case occurred on iOS when Dimensions.get sometimes returning
|
|
77
83
|
* wrong `window` sizes
|
|
78
84
|
* when switch background -> foreground state.
|
|
79
85
|
* ( TODO fix when 1:1 aspect ratio will be used )
|
|
@@ -81,8 +87,8 @@ export const useDimensions: UseDimensions = (
|
|
|
81
87
|
|
|
82
88
|
// eslint-disable-next-line no-console
|
|
83
89
|
console.log("change: wrong values - width equal to height, ignoring");
|
|
84
|
-
} else {
|
|
85
|
-
deviceInfo.current = getDeviceInfo(newDimensions);
|
|
90
|
+
} else if (isActive || options.updateForInactiveScreens) {
|
|
91
|
+
deviceInfo.current = getDeviceInfo(newDimensions, appData);
|
|
86
92
|
setDimensions(newDimensions);
|
|
87
93
|
}
|
|
88
94
|
};
|
|
@@ -92,7 +98,7 @@ export const useDimensions: UseDimensions = (
|
|
|
92
98
|
return () => {
|
|
93
99
|
activeSubscription.remove();
|
|
94
100
|
};
|
|
95
|
-
}, []);
|
|
101
|
+
}, [isActive]);
|
|
96
102
|
|
|
97
103
|
const memoizedDimensions = useMemo(() => {
|
|
98
104
|
return { ...applyOptions(dimensions), statusBarHeight };
|
|
@@ -15,11 +15,26 @@ export const mockMenu: ZappNavigation = {
|
|
|
15
15
|
// preset_id?: null | unknown;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
export const useRoute = jest.fn(() => ({
|
|
19
|
+
screenData: {
|
|
20
|
+
name: "someName",
|
|
21
|
+
},
|
|
22
|
+
pathname: "someRoute",
|
|
23
|
+
}));
|
|
24
|
+
|
|
18
25
|
export const useNavigation = jest.fn(() => ({
|
|
19
26
|
data: {},
|
|
27
|
+
screenData: {
|
|
28
|
+
name: "someName",
|
|
29
|
+
},
|
|
30
|
+
activeRiver: {
|
|
31
|
+
id: "someId",
|
|
32
|
+
},
|
|
20
33
|
currentRoute: "someRoute",
|
|
21
34
|
}));
|
|
22
35
|
|
|
23
36
|
export const useNavigationPluginData = jest.fn().mockReturnValue(mockMenu);
|
|
24
37
|
|
|
25
38
|
export const useIsNavBarVisible = jest.fn().mockReturnValue(true);
|
|
39
|
+
|
|
40
|
+
export const useIsScreenActive = jest.fn().mockReturnValue(true);
|
|
@@ -19,9 +19,9 @@ import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Co
|
|
|
19
19
|
import { HookModalContextT } from "@applicaster/zapp-react-native-ui-components/Contexts/ZappHookModalContext";
|
|
20
20
|
import { HOOKS_EVENTS } from "../../appUtils/HooksManager/constants";
|
|
21
21
|
import {
|
|
22
|
+
getNavigationProps,
|
|
22
23
|
getRiverFromRoute,
|
|
23
24
|
getTargetRoute,
|
|
24
|
-
getNavigationProps,
|
|
25
25
|
} from "../../navigationUtils";
|
|
26
26
|
import { platformSelect } from "../../reactUtils";
|
|
27
27
|
import { useConnectionInfo } from "../connection";
|
|
@@ -146,6 +146,15 @@ export const useRoute = (): {
|
|
|
146
146
|
pathname: string;
|
|
147
147
|
} => {
|
|
148
148
|
const pathname = usePathname() || "";
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* compose `useRoute()` output data
|
|
152
|
+
*/
|
|
153
|
+
const composeRouteData = (screenData: VariousScreenData) => ({
|
|
154
|
+
screenData,
|
|
155
|
+
pathname,
|
|
156
|
+
});
|
|
157
|
+
|
|
149
158
|
const navigator = useNavigation();
|
|
150
159
|
|
|
151
160
|
const { plugins, contentTypes, rivers } = usePickFromState([
|
|
@@ -157,9 +166,7 @@ export const useRoute = (): {
|
|
|
157
166
|
const currentStack = navigator.getStackForPathname(pathname);
|
|
158
167
|
const { modalState } = useModalStore();
|
|
159
168
|
const hookModalState = useZappHooksModalState();
|
|
160
|
-
|
|
161
169
|
const modalScreenData = modalState.screen;
|
|
162
|
-
|
|
163
170
|
const hookModalScreenData = hookModalState.state.screenData?.payload;
|
|
164
171
|
|
|
165
172
|
const videoModalScreenData =
|
|
@@ -193,35 +200,63 @@ export const useRoute = (): {
|
|
|
193
200
|
// if path is hook grab screenData from screenData
|
|
194
201
|
|
|
195
202
|
if (isModalPathname(pathname)) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return { screenData, pathname };
|
|
203
|
+
return composeRouteData(modalScreenData ?? ({} as ZappEntry));
|
|
199
204
|
}
|
|
200
205
|
|
|
201
206
|
if (isVideoModalPathname(pathname)) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return { screenData, pathname };
|
|
207
|
+
return composeRouteData(videoModalScreenData as LegacyNavigationScreenData);
|
|
205
208
|
}
|
|
206
209
|
|
|
207
210
|
if (isHookModalPathname(pathname)) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
return { screenData, pathname };
|
|
211
|
+
return composeRouteData(hookModalScreenData);
|
|
211
212
|
}
|
|
212
213
|
|
|
213
214
|
if (isHookPathname(pathname)) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
/**
|
|
216
|
+
* HACK
|
|
217
|
+
*
|
|
218
|
+
* This condition relies on hacky approach to get the current hook screen data
|
|
219
|
+
* using navigator.screenData for some cases.
|
|
220
|
+
* This is used when hook is in sequence.
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
// case 1: stack not yet updated in navigator context, but navigator.screenData is updated already.
|
|
224
|
+
if (!currentStack) {
|
|
225
|
+
return composeRouteData(navigator.screenData);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const isValidHookInCurrentRouteScreenData =
|
|
229
|
+
"hookPlugin" in currentRouteScreenData &&
|
|
230
|
+
!!currentRouteScreenData.hookPlugin?.module;
|
|
231
|
+
|
|
232
|
+
let screenData;
|
|
218
233
|
|
|
219
|
-
|
|
234
|
+
// case 2: stack has valid hook data
|
|
235
|
+
if (isValidHookInCurrentRouteScreenData) {
|
|
236
|
+
screenData = currentRouteScreenData;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const navigatorScreenData = navigator.screenData as NavigatorEntry;
|
|
240
|
+
|
|
241
|
+
// case 3: current hookPlugin is missing weight, but navigator.screenData has weight, use navigator.screenData
|
|
242
|
+
if (
|
|
243
|
+
screenData.hookPlugin.identifier ===
|
|
244
|
+
navigatorScreenData?.hookPlugin?.identifier &&
|
|
245
|
+
!screenData.hookPlugin?.weight &&
|
|
246
|
+
navigatorScreenData?.hookPlugin?.weight
|
|
247
|
+
) {
|
|
248
|
+
screenData = navigator.screenData;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return composeRouteData(screenData);
|
|
220
252
|
}
|
|
221
253
|
|
|
222
|
-
|
|
254
|
+
// case 1: stack not yet updated in navigator context, but navigator.screenData is updated already.
|
|
255
|
+
if (!currentStack) {
|
|
256
|
+
return composeRouteData(navigator.screenData);
|
|
257
|
+
}
|
|
223
258
|
|
|
224
|
-
return
|
|
259
|
+
return composeRouteData(currentRouteScreenData);
|
|
225
260
|
};
|
|
226
261
|
|
|
227
262
|
type Callbacks = Partial<{
|
|
@@ -446,3 +481,33 @@ export const useGetBottomTabBarHeight = (): number => {
|
|
|
446
481
|
|
|
447
482
|
return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
|
|
448
483
|
};
|
|
484
|
+
|
|
485
|
+
// If current screen is active/focused (visible to the user)
|
|
486
|
+
export const useIsScreenActive = () => {
|
|
487
|
+
const pathname = usePathname();
|
|
488
|
+
const { currentRoute, videoModalState } = useNavigation();
|
|
489
|
+
|
|
490
|
+
if (
|
|
491
|
+
videoModalState.visible &&
|
|
492
|
+
["FULLSCREEN", "MAXIMIZED", "PIP"].includes(videoModalState.mode)
|
|
493
|
+
) {
|
|
494
|
+
return false;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return pathname === currentRoute;
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
type Return = (prefix: string) => string;
|
|
501
|
+
|
|
502
|
+
export const useUniqueRouteSuffix = (): Return => {
|
|
503
|
+
const pathname = usePathname();
|
|
504
|
+
const { currentRoute } = useNavigation();
|
|
505
|
+
|
|
506
|
+
const suffix = `currentRoute:${currentRoute}_pathname:${pathname}`;
|
|
507
|
+
|
|
508
|
+
const withUniqueRouteSuffix = React.useCallback((prefix: string) => {
|
|
509
|
+
return `${prefix}___${suffix}`;
|
|
510
|
+
}, []);
|
|
511
|
+
|
|
512
|
+
return withUniqueRouteSuffix;
|
|
513
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { View } from "react-native";
|
|
3
|
-
import {
|
|
3
|
+
import { cleanup, renderHook } from "@testing-library/react-hooks";
|
|
4
4
|
import configureStore from "redux-mock-store";
|
|
5
5
|
import { Provider } from "react-redux";
|
|
6
6
|
|
|
@@ -12,6 +12,8 @@ jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({
|
|
|
12
12
|
useIsRTL: jest.fn(() => mock_rtl_flag),
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation");
|
|
16
|
+
|
|
15
17
|
const { useCellResolver } = require("../useCellResolver");
|
|
16
18
|
|
|
17
19
|
describe("cellResolver", () => {
|
|
@@ -5,8 +5,9 @@ import { useNestedNavigationContext } from "@applicaster/zapp-react-native-ui-co
|
|
|
5
5
|
import { useNavigation } from "../navigation/useNavigation";
|
|
6
6
|
|
|
7
7
|
import { ScreenContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenContext";
|
|
8
|
+
import { ScreenDataContext } from "@applicaster/zapp-react-native-ui-components/Components/Layout/TV";
|
|
8
9
|
|
|
9
|
-
function useScreenContextV2() {
|
|
10
|
+
export function useScreenContextV2() {
|
|
10
11
|
return useContext(ScreenContext);
|
|
11
12
|
}
|
|
12
13
|
|
|
@@ -45,8 +46,8 @@ export function useSetNavbarState() {
|
|
|
45
46
|
export function useScreenContext(): NavigationScreenData {
|
|
46
47
|
const navigator = useNavigation();
|
|
47
48
|
|
|
48
|
-
const
|
|
49
|
-
|
|
49
|
+
const screenData = useContext(ScreenDataContext);
|
|
50
|
+
|
|
50
51
|
const modalScreenData = navigator?.modalData;
|
|
51
52
|
|
|
52
53
|
const isModal = useModalNavigationContext();
|