@applicaster/zapp-react-native-utils 16.0.0-alpha.6593152532 → 16.0.0-alpha.7343517668
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/ActionExecutorContext.tsx +4 -3
- package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -2
- package/analyticsUtils/PlayerAnalyticsManager.ts +11 -1
- package/analyticsUtils/__tests__/analyticsMapper.test.ts +35 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testACP_events.json +1 -1
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testBlockUnlistedParams_rules.json +1 -1
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEmptyRenameKeepsName_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEmptyRenameKeepsName_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testEventRegex_events.json +3 -9
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testIgnoreOrdering_events.json +18 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testIgnoreOrdering_rules.json +16 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexEventNoFallback_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexEventNoFallback_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexMultiGroupRename_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexMultiGroupRename_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexNonNamedFullMatch_events.json +4 -0
- package/analyticsUtils/__tests__/fixtures/analytics_mapper_testRegexNonNamedFullMatch_rules.json +6 -0
- package/analyticsUtils/__tests__/fixtures/index.js +20 -0
- package/analyticsUtils/analyticsMapper.ts +4 -1
- package/analyticsUtils/playerAnalyticsTracker.ts +26 -3
- package/appUtils/HooksManager/index.ts +3 -8
- package/appUtils/contextKeysManager/utils/index.ts +38 -25
- package/appUtils/playerManager/__tests__/playerFactory.test.ts +150 -0
- package/appUtils/playerManager/playerFactory.ts +17 -34
- package/cellUtils/index.ts +3 -5
- package/colorUtils/__tests__/isTransparentColor.test.ts +76 -0
- package/colorUtils/__tests__/isValidColor.test.ts +70 -0
- package/colorUtils/index.ts +50 -0
- package/manifestUtils/defaultManifestConfigurations/generalContent.js +35 -0
- package/package.json +2 -2
- package/pipesUtils/__tests__/buildUrlWithQuery.test.ts +33 -0
- package/pipesUtils/__tests__/withPipesEndpoint.test.tsx +56 -0
- package/pipesUtils/index.ts +1 -0
- package/pipesUtils/withPipesEndpoint.tsx +54 -0
- package/playerUtils/index.ts +24 -2
- package/reactHooks/cell-click/index.ts +15 -7
- package/reactHooks/feed/__mocks__/useMarkPipesDataStale.ts +4 -0
- package/reactHooks/feed/index.ts +5 -1
- package/reactHooks/feed/useBatchLoading.ts +9 -1
- package/reactHooks/feed/{usePipesCacheReset.ts → useMarkPipesDataStale.ts} +12 -4
- package/reactHooks/screen/__tests__/useIsStandaloneFullscreen.test.ts +114 -0
- package/reactHooks/screen/index.ts +2 -0
- package/reactHooks/screen/useIsStandaloneFullscreen.ts +12 -0
- package/reactHooks/utils/index.ts +3 -2
- package/reactHooks/videoModal/hooks/useVideoModalScreenData.tsx +22 -4
- package/riverComponetsMeasurementProvider/index.tsx +13 -13
- package/zappFrameworkUtils/HookCallback/callbackNavigationAction.ts +1 -1
- package/reactHooks/feed/__mocks__/usePipesCacheReset.ts +0 -1
|
@@ -2,17 +2,19 @@ import React from "react";
|
|
|
2
2
|
|
|
3
3
|
import { getDatasourceUrl } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/getDatasourceUrl";
|
|
4
4
|
import { usePipesContexts } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/usePipesContexts";
|
|
5
|
-
import {
|
|
5
|
+
import { markPipesDataStale } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
6
6
|
|
|
7
7
|
import { useRoute } from "../navigation";
|
|
8
8
|
import { useAppDispatch } from "@applicaster/zapp-react-native-redux";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Mark a river's `clear_cache_on_reload` feeds as stale when the screen is
|
|
12
|
+
* unmounted. The cached data is kept (so a screen sharing the same feed does
|
|
13
|
+
* not lose it mid-mount) and revalidated on next access.
|
|
12
14
|
* @param {string} riverId screen id
|
|
13
15
|
* @param {Array} riverComponents list of UI components
|
|
14
16
|
*/
|
|
15
|
-
export const
|
|
17
|
+
export const useMarkPipesDataStale = (riverId, riverComponents) => {
|
|
16
18
|
const dispatch = useAppDispatch();
|
|
17
19
|
const { screenData, pathname } = useRoute();
|
|
18
20
|
const pipesContexts = usePipesContexts(riverId, pathname);
|
|
@@ -35,10 +37,16 @@ export const usePipesCacheReset = (riverId, riverComponents) => {
|
|
|
35
37
|
);
|
|
36
38
|
|
|
37
39
|
if (url) {
|
|
38
|
-
dispatch(
|
|
40
|
+
dispatch(markPipesDataStale(url, { riverId }));
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
});
|
|
42
44
|
};
|
|
43
45
|
}, []);
|
|
44
46
|
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated Renamed to `useMarkPipesDataStale`. Kept as an alias for backward
|
|
50
|
+
* compatibility with external consumers.
|
|
51
|
+
*/
|
|
52
|
+
export const usePipesCacheReset = useMarkPipesDataStale;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { renderHook } from "@testing-library/react-native";
|
|
2
|
+
import { useIsStandaloneFullscreen } from "../useIsStandaloneFullscreen";
|
|
3
|
+
|
|
4
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
5
|
+
import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
|
|
6
|
+
|
|
7
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks");
|
|
8
|
+
jest.mock("@applicaster/zapp-react-native-utils/booleanUtils");
|
|
9
|
+
|
|
10
|
+
const mockUseNavigation = useNavigation as jest.Mock;
|
|
11
|
+
const mockToBoolean = toBooleanWithDefaultFalse as jest.Mock;
|
|
12
|
+
|
|
13
|
+
describe("useIsStandaloneFullscreen", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
jest.clearAllMocks();
|
|
16
|
+
|
|
17
|
+
mockUseNavigation.mockReturnValue({
|
|
18
|
+
canGoBack: jest.fn().mockReturnValue(false),
|
|
19
|
+
screenData: {
|
|
20
|
+
general: { allow_screen_plugin_presentation: true },
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
mockToBoolean.mockReturnValue(false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("returns true when cannot go back and screen plugin presentation is allowed", () => {
|
|
28
|
+
mockToBoolean.mockReturnValue(true);
|
|
29
|
+
|
|
30
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
31
|
+
|
|
32
|
+
expect(mockToBoolean).toHaveBeenCalledWith(true);
|
|
33
|
+
expect(result.current).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("returns false when can go back even if screen plugin presentation is allowed", () => {
|
|
37
|
+
mockUseNavigation.mockReturnValue({
|
|
38
|
+
canGoBack: jest.fn().mockReturnValue(true),
|
|
39
|
+
screenData: {
|
|
40
|
+
general: { allow_screen_plugin_presentation: true },
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
mockToBoolean.mockReturnValue(false);
|
|
45
|
+
|
|
46
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
47
|
+
|
|
48
|
+
expect(mockToBoolean).toHaveBeenCalledWith(false);
|
|
49
|
+
expect(result.current).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("returns false when cannot go back but screen plugin presentation is not allowed", () => {
|
|
53
|
+
mockUseNavigation.mockReturnValue({
|
|
54
|
+
canGoBack: jest.fn().mockReturnValue(false),
|
|
55
|
+
screenData: {
|
|
56
|
+
general: { allow_screen_plugin_presentation: false },
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
mockToBoolean.mockReturnValue(false);
|
|
61
|
+
|
|
62
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
63
|
+
|
|
64
|
+
expect(mockToBoolean).toHaveBeenCalledWith(false);
|
|
65
|
+
expect(result.current).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("returns false when screen plugin presentation flag is undefined", () => {
|
|
69
|
+
mockUseNavigation.mockReturnValue({
|
|
70
|
+
canGoBack: jest.fn().mockReturnValue(false),
|
|
71
|
+
screenData: { general: {} },
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
mockToBoolean.mockReturnValue(false);
|
|
75
|
+
|
|
76
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
77
|
+
|
|
78
|
+
expect(mockToBoolean).toHaveBeenCalledWith(undefined);
|
|
79
|
+
expect(result.current).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("returns false when navigator is undefined", () => {
|
|
83
|
+
mockUseNavigation.mockReturnValue(undefined);
|
|
84
|
+
mockToBoolean.mockReturnValue(false);
|
|
85
|
+
|
|
86
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
87
|
+
|
|
88
|
+
expect(mockToBoolean).toHaveBeenCalledWith(undefined);
|
|
89
|
+
expect(result.current).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("returns false when screenData is undefined", () => {
|
|
93
|
+
mockUseNavigation.mockReturnValue({
|
|
94
|
+
canGoBack: jest.fn().mockReturnValue(false),
|
|
95
|
+
screenData: undefined,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
mockToBoolean.mockReturnValue(false);
|
|
99
|
+
|
|
100
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
101
|
+
|
|
102
|
+
expect(mockToBoolean).toHaveBeenCalledWith(undefined);
|
|
103
|
+
expect(result.current).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("passes the combined condition through toBooleanWithDefaultFalse", () => {
|
|
107
|
+
mockToBoolean.mockImplementation((val) => Boolean(val));
|
|
108
|
+
|
|
109
|
+
const { result } = renderHook(() => useIsStandaloneFullscreen());
|
|
110
|
+
|
|
111
|
+
expect(mockToBoolean).toHaveBeenCalledWith(true);
|
|
112
|
+
expect(result.current).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -16,3 +16,5 @@ export { useScreenBackgroundColor } from "./useScreenBackgroundColor";
|
|
|
16
16
|
export { useCurrentScreenIsHook } from "./useCurrentScreenIsHook";
|
|
17
17
|
|
|
18
18
|
export { useCurrentScreenIsStartupHook } from "./useCurrentScreenIsStartupHook";
|
|
19
|
+
|
|
20
|
+
export { useIsStandaloneFullscreen } from "./useIsStandaloneFullscreen";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
2
|
+
import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
|
|
3
|
+
|
|
4
|
+
export const useIsStandaloneFullscreen = (): boolean => {
|
|
5
|
+
const navigator = useNavigation();
|
|
6
|
+
|
|
7
|
+
return toBooleanWithDefaultFalse(
|
|
8
|
+
!navigator?.canGoBack() &&
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
navigator?.screenData?.general?.allow_screen_plugin_presentation
|
|
11
|
+
);
|
|
12
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This hook returns a previous value that was passed to it.
|
|
@@ -40,6 +40,7 @@ export const shouldDispatchData = (
|
|
|
40
40
|
) => {
|
|
41
41
|
const currentFeedHasData = feed?.data;
|
|
42
42
|
const isLocalFeed = checkIsLocalFeed(url);
|
|
43
|
+
const isFeedStale = feed?.stale;
|
|
43
44
|
|
|
44
|
-
return !currentFeedHasData || clearCache || isLocalFeed;
|
|
45
|
+
return !currentFeedHasData || clearCache || isFeedStale || isLocalFeed;
|
|
45
46
|
};
|
|
@@ -2,6 +2,12 @@ import React from "react";
|
|
|
2
2
|
import { useContentTypes } from "@applicaster/zapp-react-native-redux/hooks";
|
|
3
3
|
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
4
4
|
import { useRivers } from "../../state";
|
|
5
|
+
import { createLogger } from "../../../logger";
|
|
6
|
+
|
|
7
|
+
const { log_warning } = createLogger({
|
|
8
|
+
subsystem: "zapp-react-native-utils/reactHooks/videoModal",
|
|
9
|
+
category: "useVideoModalScreenData",
|
|
10
|
+
});
|
|
5
11
|
|
|
6
12
|
export const useVideoModalScreenData = ():
|
|
7
13
|
| (ZappEntry & { targetScreen: any }) // TODO: fix ZappEntry type ( was ZappRiver but conflict )
|
|
@@ -14,10 +20,22 @@ export const useVideoModalScreenData = ():
|
|
|
14
20
|
const rivers = useRivers();
|
|
15
21
|
|
|
16
22
|
return React.useMemo(() => {
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
const itemType = item?.type?.value;
|
|
24
|
+
|
|
25
|
+
if (!itemType) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
19
28
|
|
|
20
|
-
|
|
29
|
+
const screenId = contentTypes[itemType]?.screen_id;
|
|
30
|
+
|
|
31
|
+
if (!screenId) {
|
|
32
|
+
log_warning(
|
|
33
|
+
`Type mapping is missing for item type: ${itemType}, title: ${item.title}`
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return;
|
|
21
37
|
}
|
|
22
|
-
|
|
38
|
+
|
|
39
|
+
return { ...item, targetScreen: rivers?.[screenId] };
|
|
40
|
+
}, [contentTypes, item, rivers]);
|
|
23
41
|
};
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { NativeModules,
|
|
2
|
+
import { NativeModules, View, StyleSheet } from "react-native";
|
|
3
3
|
import { getXray } from "@applicaster/zapp-react-native-utils/logger";
|
|
4
4
|
|
|
5
|
-
import { isApplePlatform, isWeb } from "../reactUtils";
|
|
5
|
+
import { isApplePlatform, isWeb, isTV } from "../reactUtils";
|
|
6
6
|
import { useRivers } from "../reactHooks";
|
|
7
7
|
|
|
8
|
+
const isTVPlatform = isTV();
|
|
9
|
+
|
|
10
|
+
const styles = StyleSheet.create({
|
|
11
|
+
container: isTVPlatform
|
|
12
|
+
? {
|
|
13
|
+
flex: 1,
|
|
14
|
+
}
|
|
15
|
+
: {},
|
|
16
|
+
});
|
|
17
|
+
|
|
8
18
|
const layoutReducer = (state, { payload }) => {
|
|
9
19
|
return state.map((item, index, _state) => ({
|
|
10
20
|
height: index === payload.index ? payload.height : item.height,
|
|
@@ -30,12 +40,6 @@ type MeasurementContext = {
|
|
|
30
40
|
onLayout: (index: number) => (event) => void;
|
|
31
41
|
};
|
|
32
42
|
|
|
33
|
-
const styles = StyleSheet.create({
|
|
34
|
-
container: {
|
|
35
|
-
flex: 1,
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
|
|
39
43
|
const { Logger } = getXray();
|
|
40
44
|
|
|
41
45
|
const logger = new Logger("general", "ui");
|
|
@@ -152,9 +156,5 @@ export const ScreenLoadingMeasurementsListItemWrapper = ({
|
|
|
152
156
|
}: ItemProps) => {
|
|
153
157
|
const { onLayout } = React.useContext(MeasurementsSettersContext);
|
|
154
158
|
|
|
155
|
-
return (
|
|
156
|
-
<View style={styles.container} onLayout={onLayout?.(index)}>
|
|
157
|
-
{children}
|
|
158
|
-
</View>
|
|
159
|
-
);
|
|
159
|
+
return <View onLayout={onLayout?.(index)}>{children}</View>;
|
|
160
160
|
};
|
|
@@ -197,7 +197,7 @@ export const useCallbackNavigationAction = (
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
hookCallback?.({ ...args, success: false,
|
|
200
|
+
hookCallback?.({ ...args, success: false, abort: true });
|
|
201
201
|
const currentNavigation = navigationRef.current;
|
|
202
202
|
|
|
203
203
|
switch (data.action) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const usePipesCacheReset = jest.fn();
|