@applicaster/zapp-react-native-ui-components 15.0.0-rc.98 → 15.1.0-rc.1
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/BaseFocusable/index.ios.ts +2 -12
- package/Components/Cell/FocusableWrapper.tsx +0 -3
- package/Components/Cell/TvOSCellComponent.tsx +0 -5
- package/Components/Focusable/Focusable.tsx +2 -4
- package/Components/Focusable/FocusableTvOS.tsx +1 -18
- package/Components/Focusable/__tests__/__snapshots__/FocusableTvOS.test.tsx.snap +0 -1
- package/Components/FocusableGroup/FocusableTvOS.tsx +1 -30
- package/Components/GeneralContentScreen/GeneralContentScreen.tsx +39 -28
- package/Components/GeneralContentScreen/__tests__/GeneralContentScreen.test.tsx +104 -0
- package/Components/GeneralContentScreen/utils/__tests__/getScreenDataSource.test.ts +19 -0
- package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +1 -1
- package/Components/GeneralContentScreen/utils/getScreenDataSource.ts +9 -0
- package/Components/HandlePlayable/HandlePlayable.tsx +24 -42
- package/Components/HandlePlayable/utils.ts +31 -0
- package/Components/HookRenderer/HookRenderer.tsx +40 -10
- package/Components/HookRenderer/__tests__/HookRenderer.test.tsx +60 -0
- package/Components/Layout/TV/LayoutBackground.tsx +2 -5
- package/Components/Layout/TV/ScreenContainer.tsx +6 -2
- package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +5 -0
- package/Components/Layout/TV/index.tsx +4 -3
- package/Components/Layout/TV/index.web.tsx +4 -3
- package/Components/LinkHandler/LinkHandler.tsx +2 -2
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +10 -4
- package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +1 -5
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +3 -11
- package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +1 -9
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +14 -15
- package/Components/MasterCell/DefaultComponents/LiveImage/__tests__/prepareEntry.test.ts +352 -0
- package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +136 -0
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +34 -16
- package/Components/MasterCell/DefaultComponents/SecondaryImage/hooks/__tests__/useGetImageDimensions.test.ts +6 -7
- package/Components/MasterCell/DefaultComponents/Text/index.tsx +2 -6
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +2 -6
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/getPluginIdentifier.test.ts +11 -233
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +15 -19
- package/Components/Navigator/StackNavigator.tsx +6 -0
- package/Components/OfflineHandler/NotificationView/NotificationView.tsx +2 -2
- package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +18 -17
- package/Components/OfflineHandler/__tests__/index.test.tsx +18 -27
- package/Components/PlayerContainer/PlayerContainer.tsx +14 -32
- package/Components/PreloaderWrapper/__tests__/index.test.tsx +26 -0
- package/Components/PreloaderWrapper/index.tsx +15 -0
- package/Components/River/ComponentsMap/ComponentsMap.tsx +15 -0
- package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +1 -1
- package/Components/River/RefreshControl.tsx +9 -3
- package/Components/River/RiverItem.tsx +26 -20
- package/Components/River/TV/River.tsx +14 -31
- package/Components/River/TV/index.tsx +4 -8
- package/Components/River/TV/withTVEventHandler.tsx +36 -0
- package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -0
- package/Components/Screen/TV/index.web.tsx +2 -4
- package/Components/Screen/__tests__/Screen.test.tsx +43 -65
- package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +44 -68
- package/Components/Screen/hooks.ts +76 -5
- package/Components/Screen/index.tsx +10 -3
- package/Components/Screen/orientationHandler.ts +3 -3
- package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +46 -0
- package/Components/ScreenFeedLoader/__tests__/ScreenFeedLoader.test.tsx +94 -0
- package/Components/ScreenFeedLoader/index.ts +1 -0
- package/Components/ScreenResolver/__tests__/screenResolver.test.js +24 -0
- package/Components/ScreenResolver/hooks/index.ts +3 -0
- package/Components/ScreenResolver/hooks/useGetComponent.ts +15 -0
- package/Components/ScreenResolver/hooks/useScreenComponentResolver.tsx +90 -0
- package/Components/ScreenResolver/index.tsx +9 -115
- package/Components/ScreenResolver/utils/__tests__/getScreenTypeProps.test.ts +45 -0
- package/Components/ScreenResolver/utils/getScreenTypeProps.ts +43 -0
- package/Components/ScreenResolver/utils/index.ts +1 -0
- package/Components/ScreenResolver/withDefaultScreenContext.tsx +16 -0
- package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +25 -0
- package/Components/ScreenResolverFeedProvider/__tests__/ScreenResolverFeedProvider.test.tsx +44 -0
- package/Components/ScreenResolverFeedProvider/index.ts +1 -0
- package/Components/ScreenRevealManager/ScreenRevealManager.ts +8 -40
- package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +69 -86
- package/Components/ScreenRevealManager/withScreenRevealManager.tsx +4 -1
- package/Components/Tabs/TabContent.tsx +4 -7
- package/Components/Transitioner/Scene.tsx +9 -15
- package/Components/Transitioner/index.js +3 -3
- package/Components/VideoLive/LiveImageManager.ts +199 -54
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -33
- package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +2 -17
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +5 -5
- package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +7 -15
- package/Components/VideoModal/utils.ts +9 -12
- package/Components/Viewport/ViewportEvents/__tests__/viewportEvents.test.js +1 -1
- package/Components/ZappFrameworkComponents/BarView/BarView.tsx +6 -4
- package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +2 -2
- package/Components/ZappUIComponent/index.tsx +12 -6
- package/Components/index.js +1 -1
- package/Contexts/ScreenContext/__tests__/index.test.tsx +57 -0
- package/Contexts/ScreenContext/index.tsx +64 -26
- package/Contexts/ScreenTrackedViewPositionsContext/__tests__/index.test.tsx +1 -1
- package/Contexts/ZappPipesContext/ZappPipesContextFactory.tsx +18 -7
- package/Decorators/Analytics/index.tsx +5 -6
- package/Decorators/ConfigurationWrapper/__tests__/__snapshots__/withConfigurationProvider.test.tsx.snap +0 -1
- package/Decorators/ConfigurationWrapper/const.ts +0 -1
- package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -7
- package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +212 -5
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +1 -1
- package/Decorators/ZappPipesDataConnector/index.tsx +2 -2
- package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +1 -1
- package/Helpers/DataSourceHelper/index.js +19 -0
- package/events/index.ts +2 -0
- package/events/scrollEndReached.ts +15 -0
- package/package.json +5 -5
- package/Components/MasterCell/DefaultComponents/Text/utils/__tests__/withAdjustedLineHeight.test.ts +0 -46
- package/Components/MasterCell/DefaultComponents/Text/utils/index.ts +0 -21
- package/Components/PlayerContainer/ErrorDisplay/ErrorDisplay.tsx +0 -57
- package/Components/PlayerContainer/ErrorDisplay/index.ts +0 -9
- package/Components/PlayerContainer/useRestrictMobilePlayback.tsx +0 -101
- package/Components/River/TV/utils/__tests__/toStringOrEmpty.test.ts +0 -30
- package/Components/River/TV/utils/index.ts +0 -4
- package/Components/River/TV/withFocusableGroupForContent.tsx +0 -71
- package/Helpers/DataSourceHelper/__tests__/itemLimitForData.test.ts +0 -80
- package/Helpers/DataSourceHelper/index.ts +0 -19
- /package/Components/HookRenderer/{index.tsx → index.ts} +0 -0
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { View, StyleSheet } from "react-native";
|
|
3
|
-
|
|
4
|
-
import { FocusableGroup } from "@applicaster/zapp-react-native-ui-components/Components/FocusableGroup";
|
|
5
|
-
import { riverFocusManager } from "@applicaster/zapp-react-native-utils/appUtils/RiverFocusManager";
|
|
6
|
-
|
|
7
|
-
import { topMenuLayoutChange$ } from "@applicaster/zapp-react-native-tvos-app/Layout/topMenu";
|
|
8
|
-
|
|
9
|
-
const styles = StyleSheet.create({
|
|
10
|
-
flexOne: {
|
|
11
|
-
flex: 1,
|
|
12
|
-
},
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export const withFocusableGroupForContent = (Component) => {
|
|
16
|
-
return function WithFocusableGroupForContent(props) {
|
|
17
|
-
const { screenId, isInsideContainer } = props;
|
|
18
|
-
|
|
19
|
-
const [topMenuHeight, setTopMenuHeight] = React.useState(0);
|
|
20
|
-
|
|
21
|
-
React.useEffect(() => {
|
|
22
|
-
const subscription = topMenuLayoutChange$.subscribe((layout) => {
|
|
23
|
-
setTopMenuHeight(layout.height);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
return () => {
|
|
27
|
-
subscription.unsubscribe();
|
|
28
|
-
};
|
|
29
|
-
}, []);
|
|
30
|
-
|
|
31
|
-
const focusableId = React.useMemo(
|
|
32
|
-
() =>
|
|
33
|
-
riverFocusManager.screenFocusableGroupId({
|
|
34
|
-
screenId,
|
|
35
|
-
isInsideContainer,
|
|
36
|
-
}),
|
|
37
|
-
[screenId, isInsideContainer]
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
if (isInsideContainer) {
|
|
41
|
-
return <Component {...props} />;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<FocusableGroup
|
|
46
|
-
key={focusableId}
|
|
47
|
-
id={focusableId}
|
|
48
|
-
// The top menu is rendered in its own FocusableGroup, anchored at the top of the screen.
|
|
49
|
-
// When the "content" FocusableGroup starts at y = 0 as well, the two groups visually overlap.
|
|
50
|
-
// On TvOS platform this overlap can confuse the focus engine, because the focusable bounds of
|
|
51
|
-
// the top-menu group and the content group intersect, leading to erratic navigation between
|
|
52
|
-
// the menu and the content (e.g. unexpected jumps or focus getting "stuck").
|
|
53
|
-
//
|
|
54
|
-
// To avoid this, we shift the entire content FocusableGroup down by the dynamic top menu
|
|
55
|
-
// height (marginTop: topMenuHeight). This separates the focus regions of the two groups in
|
|
56
|
-
// focus space, so they no longer intersect.
|
|
57
|
-
//
|
|
58
|
-
// The inner <View> below then applies the inverse margin (marginTop: -topMenuHeight) so that
|
|
59
|
-
// the actual visual position of the content on screen does not change; only the focusable
|
|
60
|
-
// bounds of the outer group are offset.
|
|
61
|
-
style={[styles.flexOne, { marginTop: topMenuHeight }]}
|
|
62
|
-
// this group does not have parent
|
|
63
|
-
groupId={undefined}
|
|
64
|
-
>
|
|
65
|
-
<View style={[styles.flexOne, { marginTop: -1 * topMenuHeight }]}>
|
|
66
|
-
<Component {...props} groupId={focusableId} />
|
|
67
|
-
</View>
|
|
68
|
-
</FocusableGroup>
|
|
69
|
-
);
|
|
70
|
-
};
|
|
71
|
-
};
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { itemLimitForData } from "..";
|
|
2
|
-
|
|
3
|
-
describe("itemLimitForData (no mocks)", () => {
|
|
4
|
-
test("returns full array when item_limit is undefined (default Infinity)", () => {
|
|
5
|
-
// @ts-ignore
|
|
6
|
-
const result = itemLimitForData([1, 2, 3], {
|
|
7
|
-
rules: { item_limit: undefined },
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
expect(result).toEqual([1, 2, 3]);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
test("enforces positive numeric item_limit", () => {
|
|
14
|
-
// @ts-ignore
|
|
15
|
-
const result = itemLimitForData([1, 2, 3, 4], {
|
|
16
|
-
rules: { item_limit: 2 },
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
expect(result).toEqual([1, 2]);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test("returns empty array when entry is empty", () => {
|
|
23
|
-
const result = itemLimitForData([], {
|
|
24
|
-
rules: { item_limit: 3 },
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
expect(result).toEqual([]);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("defaults entry to empty array when it is undefined", () => {
|
|
31
|
-
const result = itemLimitForData(undefined, {
|
|
32
|
-
rules: { item_limit: 5 },
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
expect(result).toEqual([]);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test("handles missing component", () => {
|
|
39
|
-
// @ts-ignore
|
|
40
|
-
const result = itemLimitForData([10, 20, 30], undefined);
|
|
41
|
-
// missing component → item_limit = undefined → fallback to Infinity
|
|
42
|
-
expect(result).toEqual([10, 20, 30]);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test("handles missing rules object", () => {
|
|
46
|
-
// @ts-ignore
|
|
47
|
-
const result = itemLimitForData([10, 20, 30], {});
|
|
48
|
-
|
|
49
|
-
expect(result).toEqual([10, 20, 30]);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test("non-positive item_limit should fall back to Infinity", () => {
|
|
53
|
-
// @ts-ignore
|
|
54
|
-
const result = itemLimitForData([1, 2, 3], {
|
|
55
|
-
rules: { item_limit: -10 },
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// -10 → invalid → fallback to Infinity → no limit
|
|
59
|
-
expect(result).toEqual([1, 2, 3]);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("zero item_limit should fall back to Infinity", () => {
|
|
63
|
-
// @ts-ignore
|
|
64
|
-
const result = itemLimitForData([1, 2, 3], {
|
|
65
|
-
rules: { item_limit: 0 },
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// 0 → invalid → fallback to Infinity
|
|
69
|
-
expect(result).toEqual([1, 2, 3]);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("NaN item_limit should fall back to Infinity", () => {
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
const result = itemLimitForData([1, 2, 3], {
|
|
75
|
-
rules: { item_limit: NaN },
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
expect(result).toEqual([1, 2, 3]);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { toPositiveNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
2
|
-
|
|
3
|
-
export function itemLimitForData(
|
|
4
|
-
entry: ZappEntry[],
|
|
5
|
-
component: {
|
|
6
|
-
rules?: { item_limit?: number | string };
|
|
7
|
-
}
|
|
8
|
-
) {
|
|
9
|
-
if (!component?.rules?.item_limit) {
|
|
10
|
-
return entry;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const itemLimit = toPositiveNumberWithDefault(
|
|
14
|
-
Infinity,
|
|
15
|
-
component?.rules?.item_limit
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
return (entry || []).slice(0, itemLimit);
|
|
19
|
-
}
|
|
File without changes
|