@applicaster/zapp-react-native-utils 13.0.0-rc.2 → 13.0.0-rc.21
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/actionsExecutor/ActionExecutor.ts +16 -9
- package/actionsExecutor/ActionExecutorContext.tsx +74 -9
- package/alertUtils/alert.ts +148 -0
- package/alertUtils/index.ts +1 -148
- package/analyticsUtils/AnalyticPlayerListener.ts +18 -1
- package/analyticsUtils/__tests__/__snapshots__/analyticsManagerNoModule.test.js.snap +9 -9
- package/analyticsUtils/helpers/hooks.ts +1 -1
- package/appUtils/HooksManager/{Hook.js → Hook.ts} +35 -23
- package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +10 -8
- package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +693 -0
- package/appUtils/HooksManager/__tests__/hook.test.js +196 -184
- package/appUtils/HooksManager/__tests__/hooksManager.test.js +96 -99
- package/appUtils/HooksManager/{constants.js → constants.ts} +1 -1
- package/appUtils/HooksManager/{index.js → index.ts} +121 -112
- package/appUtils/HooksManager/types.ts +119 -0
- package/appUtils/RiverFocusManager/index.js +17 -12
- package/appUtils/accessibilityManager/index.ts +42 -1
- package/appUtils/contextKeysManager/contextResolver.ts +73 -0
- package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +6 -6
- package/appUtils/focusManager/index.ts +90 -63
- package/appUtils/focusManager/treeDataStructure/Tree/index.js +25 -3
- package/appUtils/focusManager/treeDataStructure/Utils/index.js +1 -3
- package/appUtils/focusManager/utils/enums.ts +4 -0
- package/appUtils/focusManagerAux/utils/index.ts +4 -3
- package/appUtils/{index.js → index.ts} +1 -1
- package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +2 -2
- package/appUtils/keyCodes/__tests__/keyCodes.test.js +4 -4
- package/appUtils/keyCodes/{index.js → index.ts} +2 -0
- package/appUtils/keyCodes/keys/index.ts +3 -0
- package/appUtils/keyCodes/{keys.android.js → keys/keyEventMapper.ts} +0 -19
- package/appUtils/keyCodes/keys/keys.android.ts +18 -0
- package/appUtils/keyCodes/keys/keys.ios.ts +25 -0
- package/appUtils/keyCodes/keys/keys.ts +15 -0
- package/appUtils/keyCodes/{keysByPlatform.js → keys/keysByPlatform.ts} +4 -0
- package/appUtils/keyCodes/keysByPlatform.ts +8 -0
- package/appUtils/keyInputHandler/KeyInputHandler.ts +68 -0
- package/appUtils/orientationHelper.ts +1 -1
- package/appUtils/platform/const.ts +14 -0
- package/appUtils/platform/platformUtils.ts +17 -15
- package/appUtils/playerManager/index.ts +6 -2
- package/appUtils/playerManager/player.ts +17 -5
- package/appUtils/playerManager/playerFactory.ts +5 -4
- package/appUtils/playerManager/playerNative.ts +3 -2
- package/appUtils/playerManager/usePlayerControllerSetup.tsx +3 -3
- package/arrayUtils/__tests__/__snapshots__/arrayUtils.test.ts.snap +4 -4
- package/domUtils/{cookieManager.js → cookieManager.ts} +1 -2
- package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +4 -4
- package/functionUtils/index.ts +15 -11
- package/idleUtils/__tests__/withTimeout$.test.ts +37 -0
- package/idleUtils/index.ts +1 -1
- package/idleUtils/withTimeout.ts +15 -2
- package/logger/const.ts +9 -67
- package/manifestUtils/__tests__/createConfig.test.js +18 -16
- package/modalState/index.ts +1 -5
- package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +6 -6
- package/navigationUtils/__tests__/itemTypes.test.js +2 -2
- package/navigationUtils/__tests__/navigationUtils.test.js +2 -2
- package/navigationUtils/index.ts +14 -5
- package/package.json +3 -2
- package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -1
- package/reactHooks/cell-click/__tests__/index.test.js +10 -2
- package/reactHooks/cell-click/index.ts +7 -1
- package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +4 -4
- package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +20 -13
- package/reactHooks/feed/useFeedLoader.tsx +12 -8
- package/reactHooks/feed/usePipesCacheReset.ts +5 -5
- package/reactHooks/flatList/__tests__/index.test.tsx +30 -21
- package/reactHooks/layout/__tests__/index.test.tsx +10 -10
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +14 -28
- package/reactHooks/navigation/__tests__/index.test.tsx +0 -4
- package/reactHooks/navigation/index.ts +29 -218
- package/reactHooks/navigation/useGetBottomTabBarHeight.ts +12 -0
- package/reactHooks/navigation/useGetNavBarTopBorderWidth.ts +14 -0
- package/reactHooks/navigation/useGetTabBarHeight.ts +12 -0
- package/reactHooks/navigation/useIsScreenActive.ts +17 -0
- package/reactHooks/navigation/useNavigationPluginData.ts +15 -0
- package/reactHooks/navigation/useNavigationType.ts +15 -0
- package/reactHooks/navigation/usePathname.ts +4 -0
- package/reactHooks/navigation/useRoute.ts +100 -0
- package/reactHooks/navigation/useUniqueRouteSuffix.ts +41 -0
- package/reactHooks/player/TVSeekControlller/ISeekController.ts +32 -0
- package/reactHooks/player/TVSeekControlller/LongPressSeekController.ts +71 -0
- package/reactHooks/player/TVSeekControlller/TVSeekController.ts +258 -0
- package/reactHooks/player/TVSeekControlller/TapSeekController.ts +53 -0
- package/reactHooks/player/__tests__/{useAutoSeek.test.tsx → useAutoSeek._test.tsx} +2 -3
- package/reactHooks/player/const.ts +0 -4
- package/reactHooks/player/index.ts +0 -6
- package/reactHooks/utils/index.ts +13 -0
- package/reactUtils/__tests__/reactUtils.test.js +10 -28
- package/reactUtils/createContext/__tests__/__snapshots__/helpers.test.js.snap +19 -19
- package/reactUtils/createContext/__tests__/__snapshots__/index.test.js.snap +2 -2
- package/reactUtils/createContext/__tests__/__snapshots__/provider.test.js.snap +3 -3
- package/reactUtils/createContext/__tests__/helpers.test.js +8 -8
- package/reactUtils/index.ts +0 -14
- package/theme/__mocks__/index.ts +4 -0
- package/time/Timer.ts +1 -1
- package/types.ts +1 -0
- package/appUtils/keyCodes/keys.ios.js +0 -46
- package/reactHooks/player/useAutoSeek.tsx +0 -87
- package/reactHooks/player/useSeek.tsx +0 -66
- package/reactHooks/player/useTapSeek.tsx +0 -58
- /package/appUtils/HooksManager/{logger.js → logger.ts} +0 -0
- /package/appUtils/{directionHelper.js → directionHelper.ts} +0 -0
- /package/appUtils/keyCodes/{androidTVKeys.js → androidTVKeys.ts} +0 -0
- /package/appUtils/keyCodes/{keys.web.js → keys/keys.web.ts} +0 -0
- /package/appUtils/{localizationsHelper.js → localizationsHelper.ts} +0 -0
- /package/domUtils/{logger.js → logger.ts} +0 -0
- /package/reactHooks/player/__tests__/{useTapSeek.test.ts → useTapSeek._test.ts} +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { renderHook, act } from "@testing-library/react-
|
|
3
|
-
import { render } from "@testing-library/react-native";
|
|
2
|
+
import { renderHook, render, act } from "@testing-library/react-native";
|
|
4
3
|
import { View } from "react-native";
|
|
5
4
|
|
|
6
5
|
import { useSequentialLoader, useSequentialRenderItem } from "..";
|
|
@@ -66,26 +65,28 @@ describe("flatList hooks", () => {
|
|
|
66
65
|
|
|
67
66
|
expect(result.current.allLoaded).toBe(false);
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
(
|
|
71
|
-
onLoadFinished
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
act(() => {
|
|
69
|
+
result.current.renderItem(
|
|
70
|
+
({ onLoadFinished }) => {
|
|
71
|
+
onLoadFinished();
|
|
72
|
+
},
|
|
73
|
+
{ index: 1 }
|
|
74
|
+
);
|
|
75
|
+
});
|
|
75
76
|
|
|
76
77
|
expect(result.current.allLoaded).toBe(true);
|
|
77
78
|
});
|
|
78
79
|
});
|
|
79
80
|
|
|
80
81
|
describe("Rendering wrapper", () => {
|
|
81
|
-
it("wraps the elements in the View with display: none style", () => {
|
|
82
|
+
it("wraps the elements in the View with display: none style", async () => {
|
|
82
83
|
const element1 = { id: 1 };
|
|
83
84
|
const element2 = { id: 2 };
|
|
84
85
|
const mockData = [element1, element2];
|
|
85
86
|
|
|
86
87
|
const { result } = renderHook(() => useSequentialRenderItem(mockData));
|
|
87
88
|
|
|
88
|
-
const
|
|
89
|
+
const res = render(
|
|
89
90
|
result.current.renderItem(
|
|
90
91
|
() => {
|
|
91
92
|
return <View testID={"test"} />;
|
|
@@ -94,7 +95,9 @@ describe("flatList hooks", () => {
|
|
|
94
95
|
)
|
|
95
96
|
);
|
|
96
97
|
|
|
97
|
-
const element =
|
|
98
|
+
const element = res.root.findByProps({
|
|
99
|
+
testID: "sequential-river-wrapper-1",
|
|
100
|
+
});
|
|
98
101
|
|
|
99
102
|
expect(element.props.style.display).toEqual("none");
|
|
100
103
|
});
|
|
@@ -106,14 +109,16 @@ describe("flatList hooks", () => {
|
|
|
106
109
|
|
|
107
110
|
const { result } = renderHook(() => useSequentialRenderItem(mockData));
|
|
108
111
|
|
|
109
|
-
|
|
110
|
-
(
|
|
111
|
-
onLoadFinished
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
act(() => {
|
|
113
|
+
result.current.renderItem(
|
|
114
|
+
({ onLoadFinished }) => {
|
|
115
|
+
onLoadFinished();
|
|
116
|
+
},
|
|
117
|
+
{ item: element1, index: 0 }
|
|
118
|
+
);
|
|
119
|
+
});
|
|
115
120
|
|
|
116
|
-
const {
|
|
121
|
+
const { root } = render(
|
|
117
122
|
result.current.renderItem(
|
|
118
123
|
({ onLoadFinished }) => {
|
|
119
124
|
onLoadFinished();
|
|
@@ -124,7 +129,9 @@ describe("flatList hooks", () => {
|
|
|
124
129
|
)
|
|
125
130
|
);
|
|
126
131
|
|
|
127
|
-
const element =
|
|
132
|
+
const element = root.findByProps({
|
|
133
|
+
testID: "sequential-river-wrapper-1",
|
|
134
|
+
});
|
|
128
135
|
|
|
129
136
|
expect(element.props.style.display).toEqual("flex");
|
|
130
137
|
});
|
|
@@ -136,7 +143,7 @@ describe("flatList hooks", () => {
|
|
|
136
143
|
|
|
137
144
|
const { result } = renderHook(() => useSequentialRenderItem(mockData));
|
|
138
145
|
|
|
139
|
-
const {
|
|
146
|
+
const { root } = render(
|
|
140
147
|
result.current.renderItem(
|
|
141
148
|
({ onLoadFinished }) => {
|
|
142
149
|
onLoadFinished();
|
|
@@ -147,7 +154,9 @@ describe("flatList hooks", () => {
|
|
|
147
154
|
)
|
|
148
155
|
);
|
|
149
156
|
|
|
150
|
-
const element =
|
|
157
|
+
const element = root.findByProps({
|
|
158
|
+
testID: "sequential-river-wrapper-1",
|
|
159
|
+
});
|
|
151
160
|
|
|
152
161
|
expect(element.props.style.display).toEqual("none");
|
|
153
162
|
});
|
|
@@ -14,10 +14,10 @@ const mocked_return_value = (tv) => ({
|
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
const platform = "android";
|
|
17
|
-
let
|
|
17
|
+
let mock_tv_flag = false;
|
|
18
18
|
|
|
19
19
|
ReactNative.Dimensions.get = jest.fn(
|
|
20
|
-
(context) => mocked_return_value(
|
|
20
|
+
(context) => mocked_return_value(mock_tv_flag)[context]
|
|
21
21
|
);
|
|
22
22
|
|
|
23
23
|
const mockRemoveFn = jest.fn();
|
|
@@ -43,7 +43,7 @@ jest.mock("react-native-safe-area-context", () => ({
|
|
|
43
43
|
|
|
44
44
|
jest.mock("../../../reactUtils", () => ({
|
|
45
45
|
platformSelect: jest.fn((specs) => specs[platform] || specs.default),
|
|
46
|
-
isTV: jest.fn(() =>
|
|
46
|
+
isTV: jest.fn(() => mock_tv_flag),
|
|
47
47
|
}));
|
|
48
48
|
|
|
49
49
|
jest.mock("../../navigation", () => ({
|
|
@@ -134,20 +134,20 @@ describe("useDimensions", () => {
|
|
|
134
134
|
|
|
135
135
|
describe("it applies the scale to the width & height if needed", () => {
|
|
136
136
|
it("applies the scale on TV, and screen context", () => {
|
|
137
|
-
|
|
138
|
-
const { screen } = mocked_return_value(
|
|
137
|
+
mock_tv_flag = true;
|
|
138
|
+
const { screen } = mocked_return_value(mock_tv_flag);
|
|
139
139
|
const { dimensions } = testHook("screen");
|
|
140
140
|
|
|
141
141
|
expect(dimensions).toHaveProperty("height", screen.height * screen.scale);
|
|
142
142
|
expect(dimensions).toHaveProperty("width", screen.width * screen.scale);
|
|
143
143
|
expect(dimensions).toHaveProperty("scale", 1);
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
mock_tv_flag = false;
|
|
146
146
|
});
|
|
147
147
|
|
|
148
148
|
it("doesn't apply the scale on mobile with screen context", () => {
|
|
149
|
-
|
|
150
|
-
const { screen } = mocked_return_value(
|
|
149
|
+
mock_tv_flag = false;
|
|
150
|
+
const { screen } = mocked_return_value(mock_tv_flag);
|
|
151
151
|
const { dimensions } = testHook("screen");
|
|
152
152
|
|
|
153
153
|
expect(dimensions).toHaveProperty("height", screen.height);
|
|
@@ -156,8 +156,8 @@ describe("useDimensions", () => {
|
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
it("doesn't apply the scale on TV with window context", () => {
|
|
159
|
-
|
|
160
|
-
const { window } = mocked_return_value(
|
|
159
|
+
mock_tv_flag = true;
|
|
160
|
+
const { window } = mocked_return_value(mock_tv_flag);
|
|
161
161
|
const { dimensions } = testHook("window");
|
|
162
162
|
|
|
163
163
|
expect(dimensions).toHaveProperty("height", window.height);
|
package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
import * as ReactNative from "react-native";
|
|
2
|
+
import NativeDeviceInfo from "react-native/Libraries/Utilities/NativeDeviceInfo";
|
|
2
3
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
screen: { width: 360, height: 540 },
|
|
8
|
-
}[type])
|
|
9
|
-
);
|
|
4
|
+
const mockDimensions = {
|
|
5
|
+
window: { width: 1, height: 1 },
|
|
6
|
+
screen: { width: 360, height: 540 },
|
|
7
|
+
};
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const mockGetConstants = jest.fn().mockReturnValue({
|
|
14
|
-
Dimensions: {
|
|
15
|
-
window: { width: 360, height: 540 },
|
|
16
|
-
screen: { width: 360, height: 540 },
|
|
17
|
-
},
|
|
18
|
-
});
|
|
9
|
+
const mockDimensionsGet = jest.fn((type) => mockDimensions[type]);
|
|
19
10
|
|
|
20
|
-
|
|
21
|
-
getConstants: mockGetConstants,
|
|
22
|
-
}));
|
|
11
|
+
ReactNative.Dimensions.get = mockDimensionsGet;
|
|
23
12
|
|
|
24
13
|
const { Platform, Dimensions } = ReactNative;
|
|
25
14
|
|
|
@@ -34,27 +23,24 @@ describe("useDimensions > helpers ( native )", () => {
|
|
|
34
23
|
|
|
35
24
|
it("should call Dimensions.get for window context", () => {
|
|
36
25
|
getInitialDimensions("window");
|
|
37
|
-
expect(Dimensions.get).
|
|
26
|
+
expect(Dimensions.get).toHaveBeenCalled();
|
|
38
27
|
});
|
|
39
28
|
|
|
40
29
|
it("should call Dimensions.get for screen context", () => {
|
|
41
30
|
getInitialDimensions("screen");
|
|
42
|
-
expect(Dimensions.get).
|
|
31
|
+
expect(Dimensions.get).toHaveBeenCalled();
|
|
43
32
|
});
|
|
44
33
|
|
|
45
34
|
it("should call NativeDeviceInfo.getConstants for ios when width === height", () => {
|
|
46
35
|
Platform.OS = "ios";
|
|
47
36
|
|
|
48
|
-
jest
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
screen: { width: 360, height: 540 },
|
|
52
|
-
},
|
|
53
|
-
});
|
|
37
|
+
const mockGetConstants = jest
|
|
38
|
+
.spyOn(NativeDeviceInfo, "getConstants")
|
|
39
|
+
.mockReturnValue({ Dimensions: mockDimensions });
|
|
54
40
|
|
|
55
41
|
getInitialDimensions("window");
|
|
56
42
|
|
|
57
|
-
expect(Dimensions.get).
|
|
58
|
-
expect(mockGetConstants).
|
|
43
|
+
expect(Dimensions.get).toHaveBeenCalled();
|
|
44
|
+
expect(mockGetConstants).toHaveBeenCalled();
|
|
59
45
|
});
|
|
60
46
|
});
|
|
@@ -135,10 +135,6 @@ const hookModalWrapper = ({ children }) => (
|
|
|
135
135
|
</Provider>
|
|
136
136
|
);
|
|
137
137
|
|
|
138
|
-
jest.mock("../../../modalState", () => ({
|
|
139
|
-
useModalStore: jest.fn(),
|
|
140
|
-
}));
|
|
141
|
-
|
|
142
138
|
describe("navigation", () => {
|
|
143
139
|
describe("useRoute", () => {
|
|
144
140
|
describe("Main stack components", () => {
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
/* eslint max-len: off */
|
|
3
|
-
|
|
4
|
-
import React, { useContext, useEffect, useMemo } from "react";
|
|
1
|
+
import React, { useEffect, useMemo } from "react";
|
|
5
2
|
import { BackHandler, InteractionManager, NativeModules } from "react-native";
|
|
6
|
-
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
7
3
|
|
|
8
4
|
import {
|
|
9
5
|
useContentTypes,
|
|
@@ -11,34 +7,36 @@ import {
|
|
|
11
7
|
} from "@applicaster/zapp-react-native-redux/hooks";
|
|
12
8
|
import { HooksManager } from "@applicaster/zapp-react-native-utils/appUtils/HooksManager";
|
|
13
9
|
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
LONG_KEY_PRESS_TIMEOUT,
|
|
17
|
-
QUICK_BRICK_NAVBAR,
|
|
18
|
-
QUICK_BRICK_CONTENT,
|
|
19
|
-
} from "@applicaster/quick-brick-core/const";
|
|
20
|
-
import { useZappHooksModalState } from "@applicaster/zapp-react-dom-ui-components/Components/ZappHooksModal/hooks/useZappHooksModalState";
|
|
10
|
+
import { LONG_KEY_PRESS_TIMEOUT } from "@applicaster/quick-brick-core/const";
|
|
21
11
|
import { ZappHookModalContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
|
|
22
|
-
import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
|
|
23
12
|
import { HookModalContextT } from "@applicaster/zapp-react-native-ui-components/Contexts/ZappHookModalContext";
|
|
24
13
|
import { HOOKS_EVENTS } from "../../appUtils/HooksManager/constants";
|
|
25
|
-
import {
|
|
26
|
-
getNavigationProps,
|
|
27
|
-
getRiverFromRoute,
|
|
28
|
-
getTargetRoute,
|
|
29
|
-
} from "../../navigationUtils";
|
|
30
|
-
import { platformSelect } from "../../reactUtils";
|
|
14
|
+
import { getRiverFromRoute, getTargetRoute } from "../../navigationUtils";
|
|
31
15
|
import { useConnectionInfo } from "../connection";
|
|
32
|
-
import { getTargetScreenData } from "../screen/useTargetScreenData";
|
|
33
16
|
|
|
34
|
-
import { isTV
|
|
17
|
+
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
35
18
|
import { useNavbarState } from "../screen";
|
|
36
|
-
import { useNavigation } from "./useNavigation";
|
|
37
|
-
import { useModalStore } from "../../modalState";
|
|
38
|
-
import { ScreenDataContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenDataContext";
|
|
39
19
|
|
|
40
20
|
export { useNavigation } from "./useNavigation";
|
|
41
21
|
|
|
22
|
+
export { useRoute } from "./useRoute";
|
|
23
|
+
|
|
24
|
+
export { usePathname } from "./usePathname";
|
|
25
|
+
|
|
26
|
+
export { useNavigationPluginData } from "./useNavigationPluginData";
|
|
27
|
+
|
|
28
|
+
export { useNavigationType } from "./useNavigationType";
|
|
29
|
+
|
|
30
|
+
export { useGetBottomTabBarHeight } from "./useGetBottomTabBarHeight";
|
|
31
|
+
|
|
32
|
+
export { useIsScreenActive } from "./useIsScreenActive";
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
useUniqueRouteSuffix,
|
|
36
|
+
useNavbarId,
|
|
37
|
+
useContentId,
|
|
38
|
+
} from "./useUniqueRouteSuffix";
|
|
39
|
+
|
|
42
40
|
/**
|
|
43
41
|
* This function helps to decide wether the navbar should be presented on the screen
|
|
44
42
|
* based on route and / or screen Data
|
|
@@ -125,8 +123,6 @@ export function isNavBarVisible(
|
|
|
125
123
|
|
|
126
124
|
const { ProfilerBridge } = NativeModules;
|
|
127
125
|
|
|
128
|
-
export const usePathname = () => React.useContext(PathnameContext);
|
|
129
|
-
|
|
130
126
|
export const useBackHandler = (cb: () => boolean) => {
|
|
131
127
|
React.useEffect(() => {
|
|
132
128
|
BackHandler.addEventListener("hardwareBackPress", cb);
|
|
@@ -137,88 +133,6 @@ export const useBackHandler = (cb: () => boolean) => {
|
|
|
137
133
|
}, [cb]);
|
|
138
134
|
};
|
|
139
135
|
|
|
140
|
-
// starts with modal/
|
|
141
|
-
const isModalPathname = (pathname: string) => /^modal\//.test(pathname);
|
|
142
|
-
|
|
143
|
-
const isVideoModalPathname = (pathname: string) =>
|
|
144
|
-
/^video-modal\//.test(pathname);
|
|
145
|
-
|
|
146
|
-
const isHookModalPathname = (pathname: string) =>
|
|
147
|
-
/^hooks-modal\//.test(pathname);
|
|
148
|
-
|
|
149
|
-
const isHookPathname = (pathname: string) => /^\/hooks\//.test(pathname);
|
|
150
|
-
|
|
151
|
-
type VariousScreenData = LegacyNavigationScreenData | ZappRiver | ZappEntry;
|
|
152
|
-
|
|
153
|
-
export const useRoute = (): {
|
|
154
|
-
screenData: VariousScreenData;
|
|
155
|
-
pathname: string;
|
|
156
|
-
} => {
|
|
157
|
-
const pathname = usePathname() || "";
|
|
158
|
-
const navigator = useNavigation();
|
|
159
|
-
const screenDataContext = legacyScreenData(useContext(ScreenDataContext));
|
|
160
|
-
|
|
161
|
-
const { plugins, contentTypes, rivers } = usePickFromState([
|
|
162
|
-
"plugins",
|
|
163
|
-
"rivers",
|
|
164
|
-
"contentTypes",
|
|
165
|
-
]);
|
|
166
|
-
|
|
167
|
-
const { modalState } = useModalStore();
|
|
168
|
-
const hookModalState = useZappHooksModalState();
|
|
169
|
-
|
|
170
|
-
const modalScreenData = modalState.screen;
|
|
171
|
-
|
|
172
|
-
const hookModalScreenData = hookModalState.state.screenData?.payload;
|
|
173
|
-
|
|
174
|
-
const videoModalScreenData =
|
|
175
|
-
navigator.videoModalState?.item &&
|
|
176
|
-
legacyScreenData(
|
|
177
|
-
{
|
|
178
|
-
entry: navigator.videoModalState?.item as ZappEntry,
|
|
179
|
-
screen: getTargetScreenData(
|
|
180
|
-
navigator.videoModalState?.item as ZappEntry,
|
|
181
|
-
rivers,
|
|
182
|
-
contentTypes
|
|
183
|
-
),
|
|
184
|
-
},
|
|
185
|
-
plugins
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
// There are 4 route scenarios
|
|
189
|
-
// For regular screens take date from navigator stack.
|
|
190
|
-
// is path is model grab screenData from modal state
|
|
191
|
-
// if path is video modal grab screenData from video state
|
|
192
|
-
// if path is hook modal grab screenData from hook state
|
|
193
|
-
// if path is hook grab screenData from screenData
|
|
194
|
-
|
|
195
|
-
if (isModalPathname(pathname)) {
|
|
196
|
-
const screenData = modalScreenData ?? ({} as ZappEntry);
|
|
197
|
-
|
|
198
|
-
return { screenData, pathname };
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (isVideoModalPathname(pathname)) {
|
|
202
|
-
const screenData = videoModalScreenData as LegacyNavigationScreenData;
|
|
203
|
-
|
|
204
|
-
return { screenData, pathname };
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (isHookModalPathname(pathname)) {
|
|
208
|
-
const screenData = hookModalScreenData;
|
|
209
|
-
|
|
210
|
-
return { screenData, pathname };
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (isHookPathname(pathname)) {
|
|
214
|
-
return { screenData: screenDataContext, pathname };
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const screenData = screenDataContext;
|
|
218
|
-
|
|
219
|
-
return { screenData, pathname };
|
|
220
|
-
};
|
|
221
|
-
|
|
222
136
|
type Callbacks = Partial<{
|
|
223
137
|
handleHookPresent: ({
|
|
224
138
|
route,
|
|
@@ -320,16 +234,19 @@ export const useZappHooksForEntry = (
|
|
|
320
234
|
callbacks?.handleHookComplete?.(props);
|
|
321
235
|
};
|
|
322
236
|
|
|
323
|
-
const hookManager = HooksManager(hooksOptions)
|
|
237
|
+
const hookManager = HooksManager(hooksOptions);
|
|
238
|
+
|
|
239
|
+
hookManager.subscriber
|
|
324
240
|
.on(HOOKS_EVENTS.PRESENT_SCREEN_HOOK, handleHookPresent)
|
|
325
241
|
.on(HOOKS_EVENTS.ERROR, handleHookError)
|
|
326
242
|
.on(HOOKS_EVENTS.CANCEL, handleHookCancel)
|
|
327
243
|
.on(HOOKS_EVENTS.START_BACKGROUND_HOOK, handleBackgroundHook)
|
|
328
|
-
.on(HOOKS_EVENTS.COMPLETE, handleHookComplete)
|
|
329
|
-
|
|
244
|
+
.on(HOOKS_EVENTS.COMPLETE, handleHookComplete);
|
|
245
|
+
|
|
246
|
+
hookManager.handleHooks(entry);
|
|
330
247
|
|
|
331
248
|
return () => {
|
|
332
|
-
hookManager
|
|
249
|
+
hookManager.subscriber
|
|
333
250
|
.removeHandler(HOOKS_EVENTS.PRESENT_SCREEN_HOOK, handleHookPresent)
|
|
334
251
|
.removeHandler(HOOKS_EVENTS.ERROR, handleHookError)
|
|
335
252
|
.removeHandler(HOOKS_EVENTS.CANCEL, handleHookCancel)
|
|
@@ -339,34 +256,6 @@ export const useZappHooksForEntry = (
|
|
|
339
256
|
}, [entry.id]);
|
|
340
257
|
};
|
|
341
258
|
|
|
342
|
-
export enum MenuTypes {
|
|
343
|
-
drawer = "DRAWER",
|
|
344
|
-
bottomTabBar = "BOTTOM_TAB_BAR",
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
export const useNavigationPluginData = (): ZappNavigation | undefined => {
|
|
348
|
-
const {
|
|
349
|
-
screenData: useRouteScreenData,
|
|
350
|
-
}: { screenData: QuickBrickNavigationData | null } = useRoute();
|
|
351
|
-
|
|
352
|
-
const navigations = useRouteScreenData?.targetScreen
|
|
353
|
-
? (useRouteScreenData.targetScreen as ZappRiver).navigations
|
|
354
|
-
: (useRouteScreenData as ZappRiver).navigations;
|
|
355
|
-
|
|
356
|
-
const navigationMenu = navigations?.find((nav) => nav.category === "menu");
|
|
357
|
-
|
|
358
|
-
return navigationMenu;
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
export const useNavigationType = (): MenuTypes => {
|
|
362
|
-
const navigationMenu = useNavigationPluginData();
|
|
363
|
-
|
|
364
|
-
return !navigationMenu ||
|
|
365
|
-
navigationMenu.navigation_type === "quick_brick_side_menu"
|
|
366
|
-
? MenuTypes.drawer
|
|
367
|
-
: MenuTypes.bottomTabBar;
|
|
368
|
-
};
|
|
369
|
-
|
|
370
259
|
export const useProfilerLogging = () => {
|
|
371
260
|
const logTimestamp = (data: string) =>
|
|
372
261
|
InteractionManager.runAfterInteractions(() => {
|
|
@@ -411,81 +300,3 @@ export const useIsNavBarVisible = (): boolean => {
|
|
|
411
300
|
|
|
412
301
|
return useMemo(() => visible, [visible]);
|
|
413
302
|
};
|
|
414
|
-
|
|
415
|
-
const useGetNavBarTopBorderWidth = (): number => {
|
|
416
|
-
const navigator = useNavigation();
|
|
417
|
-
|
|
418
|
-
const navProps = getNavigationProps({
|
|
419
|
-
navigator,
|
|
420
|
-
title: "",
|
|
421
|
-
category: "menu",
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
return Number(((navProps?.styles as any)?.top_border_width as number) ?? 0);
|
|
425
|
-
};
|
|
426
|
-
|
|
427
|
-
const TAB_BAR_HEIGHT_IOS = 49;
|
|
428
|
-
const TAB_BAR_HEIGHT_ANDROID = 56;
|
|
429
|
-
|
|
430
|
-
const useGetTabBarHeight = () =>
|
|
431
|
-
platformSelect({
|
|
432
|
-
ios: TAB_BAR_HEIGHT_IOS + (useSafeAreaInsets().bottom ?? 0),
|
|
433
|
-
android: TAB_BAR_HEIGHT_ANDROID,
|
|
434
|
-
}) as number;
|
|
435
|
-
|
|
436
|
-
export const useGetBottomTabBarHeight = (): number => {
|
|
437
|
-
const topBorderWidth = useGetNavBarTopBorderWidth();
|
|
438
|
-
const tabBarHeight = useGetTabBarHeight();
|
|
439
|
-
|
|
440
|
-
const isBottomBarNavigation = useNavigationType() === MenuTypes.bottomTabBar;
|
|
441
|
-
|
|
442
|
-
return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
// If current screen is active/focused (visible to the user)
|
|
446
|
-
export const useIsScreenActive = () => {
|
|
447
|
-
const pathname = usePathname();
|
|
448
|
-
const { currentRoute, videoModalState } = useNavigation();
|
|
449
|
-
|
|
450
|
-
if (
|
|
451
|
-
videoModalState.visible &&
|
|
452
|
-
["FULLSCREEN", "MAXIMIZED", "PIP"].includes(videoModalState.mode)
|
|
453
|
-
) {
|
|
454
|
-
return false;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
return pathname === currentRoute;
|
|
458
|
-
};
|
|
459
|
-
|
|
460
|
-
type Return = (prefix: string) => string;
|
|
461
|
-
|
|
462
|
-
export const useUniqueRouteSuffix = (): Return => {
|
|
463
|
-
const pathname = usePathname();
|
|
464
|
-
const { currentRoute } = useNavigation();
|
|
465
|
-
|
|
466
|
-
const suffix = `currentRoute:${currentRoute}_pathname:${pathname}`;
|
|
467
|
-
|
|
468
|
-
const withUniqueRouteSuffix = React.useCallback((prefix: string) => {
|
|
469
|
-
if (isWeb()) {
|
|
470
|
-
// we should use extended route prefix only on Web, where we have stack-navigator
|
|
471
|
-
return `${prefix}___${suffix}`;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// for other platforms use previous version
|
|
475
|
-
return prefix;
|
|
476
|
-
}, []);
|
|
477
|
-
|
|
478
|
-
return withUniqueRouteSuffix;
|
|
479
|
-
};
|
|
480
|
-
|
|
481
|
-
export const useNavbarId = () => {
|
|
482
|
-
const withUniqueRouteSuffix = useUniqueRouteSuffix();
|
|
483
|
-
|
|
484
|
-
return withUniqueRouteSuffix(QUICK_BRICK_NAVBAR);
|
|
485
|
-
};
|
|
486
|
-
|
|
487
|
-
export const useContentId = () => {
|
|
488
|
-
const withUniqueRouteSuffix = useUniqueRouteSuffix();
|
|
489
|
-
|
|
490
|
-
return withUniqueRouteSuffix(QUICK_BRICK_CONTENT);
|
|
491
|
-
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useGetNavBarTopBorderWidth } from "./useGetNavBarTopBorderWidth";
|
|
2
|
+
import { useGetTabBarHeight } from "./useGetTabBarHeight";
|
|
3
|
+
import { MenuTypes, useNavigationType } from "./useNavigationType";
|
|
4
|
+
|
|
5
|
+
export const useGetBottomTabBarHeight = (): number => {
|
|
6
|
+
const topBorderWidth = useGetNavBarTopBorderWidth();
|
|
7
|
+
const tabBarHeight = useGetTabBarHeight();
|
|
8
|
+
|
|
9
|
+
const isBottomBarNavigation = useNavigationType() === MenuTypes.bottomTabBar;
|
|
10
|
+
|
|
11
|
+
return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
|
|
12
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getNavigationProps } from "../../navigationUtils";
|
|
2
|
+
import { useNavigation } from "./useNavigation";
|
|
3
|
+
|
|
4
|
+
export const useGetNavBarTopBorderWidth = (): number => {
|
|
5
|
+
const navigator = useNavigation();
|
|
6
|
+
|
|
7
|
+
const navProps = getNavigationProps({
|
|
8
|
+
navigator,
|
|
9
|
+
title: "",
|
|
10
|
+
category: "menu",
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
return Number(((navProps?.styles as any)?.top_border_width as number) ?? 0);
|
|
14
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
2
|
+
|
|
3
|
+
import { platformSelect } from "../../reactUtils";
|
|
4
|
+
|
|
5
|
+
const TAB_BAR_HEIGHT_IOS = 49;
|
|
6
|
+
const TAB_BAR_HEIGHT_ANDROID = 56;
|
|
7
|
+
|
|
8
|
+
export const useGetTabBarHeight = () =>
|
|
9
|
+
platformSelect({
|
|
10
|
+
ios: TAB_BAR_HEIGHT_IOS + (useSafeAreaInsets().bottom ?? 0),
|
|
11
|
+
android: TAB_BAR_HEIGHT_ANDROID,
|
|
12
|
+
}) as number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useNavigation } from "./useNavigation";
|
|
2
|
+
import { usePathname } from "./usePathname";
|
|
3
|
+
|
|
4
|
+
// If current screen is active/focused (visible to the user)
|
|
5
|
+
export const useIsScreenActive = () => {
|
|
6
|
+
const pathname = usePathname();
|
|
7
|
+
const { currentRoute, videoModalState } = useNavigation();
|
|
8
|
+
|
|
9
|
+
if (
|
|
10
|
+
videoModalState.visible &&
|
|
11
|
+
["FULLSCREEN", "MAXIMIZED", "PIP"].includes(videoModalState.mode)
|
|
12
|
+
) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return pathname === currentRoute;
|
|
17
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useRoute } from "./useRoute";
|
|
2
|
+
|
|
3
|
+
export const useNavigationPluginData = (): ZappNavigation | undefined => {
|
|
4
|
+
const {
|
|
5
|
+
screenData: useRouteScreenData,
|
|
6
|
+
}: { screenData: QuickBrickNavigationData | null } = useRoute();
|
|
7
|
+
|
|
8
|
+
const navigations = useRouteScreenData?.targetScreen
|
|
9
|
+
? (useRouteScreenData.targetScreen as ZappRiver).navigations
|
|
10
|
+
: (useRouteScreenData as ZappRiver).navigations;
|
|
11
|
+
|
|
12
|
+
const navigationMenu = navigations?.find((nav) => nav.category === "menu");
|
|
13
|
+
|
|
14
|
+
return navigationMenu;
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useNavigationPluginData } from "./useNavigationPluginData";
|
|
2
|
+
|
|
3
|
+
export enum MenuTypes {
|
|
4
|
+
drawer = "DRAWER",
|
|
5
|
+
bottomTabBar = "BOTTOM_TAB_BAR",
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const useNavigationType = (): MenuTypes => {
|
|
9
|
+
const navigationMenu = useNavigationPluginData();
|
|
10
|
+
|
|
11
|
+
return !navigationMenu ||
|
|
12
|
+
navigationMenu.navigation_type === "quick_brick_side_menu"
|
|
13
|
+
? MenuTypes.drawer
|
|
14
|
+
: MenuTypes.bottomTabBar;
|
|
15
|
+
};
|