@applicaster/zapp-react-native-ui-components 15.1.0-rc.3 → 16.0.0-alpha.7128076344
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 +12 -2
- package/Components/Cell/FocusableWrapper.tsx +3 -0
- package/Components/Cell/TvOSCellComponent.tsx +6 -3
- package/Components/Focusable/Focusable.tsx +4 -2
- package/Components/Focusable/FocusableTvOS.tsx +18 -1
- package/Components/Focusable/__tests__/__snapshots__/FocusableTvOS.test.tsx.snap +1 -0
- package/Components/FocusableGroup/FocusableTvOS.tsx +30 -1
- package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +1 -1
- package/Components/HandlePlayable/HandlePlayable.tsx +13 -8
- package/Components/Layout/TV/LayoutBackground.tsx +5 -2
- package/Components/Layout/TV/NavBarContainer.tsx +1 -10
- package/Components/Layout/TV/ScreenContainer.tsx +2 -6
- package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +7 -12
- package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +7 -12
- package/Components/Layout/TV/index.tsx +3 -4
- package/Components/Layout/TV/index.web.tsx +3 -4
- package/Components/LinkHandler/LinkHandler.tsx +2 -2
- package/Components/MasterCell/CONFIG_BUILDER_TO_REACT_COMPONENT.md +144 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/model.test.ts +80 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/placement.test.ts +187 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/selectors.test.ts +45 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/style.test.ts +49 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/ActionButtonController.tsx +165 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/__tests__/ActionButtonController.test.tsx +405 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/index.ts +1 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/model.ts +47 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/placement.ts +170 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/selectors.ts +26 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/style.ts +29 -0
- package/Components/MasterCell/DefaultComponents/ActionButtonsCore/types.ts +37 -0
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -10
- package/Components/MasterCell/DefaultComponents/Button.tsx +0 -15
- package/Components/MasterCell/DefaultComponents/ButtonContainerView/components/HorizontalSeparator.tsx +8 -0
- package/Components/MasterCell/DefaultComponents/ButtonContainerView/index.tsx +15 -0
- package/Components/MasterCell/DefaultComponents/ButtonContainerView/index.tv.android.tsx +58 -0
- package/Components/MasterCell/DefaultComponents/{tv/ButtonContainerView/index.tsx → ButtonContainerView/index.tv.tsx} +3 -11
- package/Components/MasterCell/DefaultComponents/ButtonContainerView/index.web.ts +1 -0
- package/Components/MasterCell/DefaultComponents/ButtonContainerView/types.ts +40 -0
- package/Components/MasterCell/DefaultComponents/DataProvider/index.tsx +163 -0
- package/Components/MasterCell/DefaultComponents/FocusableView/index.android.tsx +2 -23
- package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -22
- package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +8 -2
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +11 -3
- package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +9 -1
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +15 -14
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +1 -2
- package/Components/MasterCell/DefaultComponents/PressableView.tsx +34 -0
- package/Components/MasterCell/DefaultComponents/SecondaryImage/hooks/__tests__/useGetImageDimensions.test.ts +7 -6
- package/Components/MasterCell/DefaultComponents/Text/hooks/useText.ts +11 -0
- package/Components/MasterCell/DefaultComponents/__tests__/DataProvider.test.tsx +141 -0
- package/Components/MasterCell/DefaultComponents/index.ts +9 -3
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/ActionButton.tsx +135 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Asset.ts +33 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/AssetComponent.tsx +22 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Button.ts +125 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Spacer.ts +16 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabel.ts +67 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabelsContainer.ts +37 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/PressableView.test.tsx +393 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/builders.test.ts +141 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/index.test.ts +343 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/helpers.ts +105 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/index.ts +122 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/__tests__/insertButtons.test.ts +118 -0
- package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/index.ts +238 -0
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/Asset.ts +4 -18
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/Button.ts +24 -73
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/TextLabelsContainer.ts +37 -18
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/TvActionButton.tsx +27 -0
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/__tests__/index.test.ts +89 -0
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/__tests__/renderedTree.test.tsx +231 -0
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +47 -48
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/getPluginIdentifier.test.ts +115 -29
- package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +101 -144
- package/Components/MasterCell/MappingFunctions/index.js +3 -2
- package/Components/MasterCell/README.md +4 -0
- package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +24 -0
- package/Components/MasterCell/__tests__/configInflater.test.js +1 -0
- package/Components/MasterCell/__tests__/elementMapper.test.js +46 -0
- package/Components/MasterCell/dataAdapter.ts +4 -1
- package/Components/MasterCell/elementMapper.tsx +52 -7
- package/Components/MasterCell/utils/__tests__/cloneChildrenWithIds.test.tsx +43 -0
- package/Components/MasterCell/utils/__tests__/useFilterChildren.test.tsx +80 -0
- package/Components/MasterCell/utils/index.ts +85 -15
- package/Components/OfflineHandler/NotificationView/NotificationView.tsx +2 -2
- package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +17 -18
- package/Components/OfflineHandler/__tests__/index.test.tsx +27 -18
- package/Components/PlayerContainer/PlayerContainer.tsx +14 -13
- package/Components/River/ComponentsMap/ComponentsMap.tsx +6 -19
- package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +1 -1
- package/Components/River/RefreshControl.tsx +19 -88
- package/Components/River/River.tsx +9 -82
- package/Components/River/TV/River.tsx +31 -14
- package/Components/River/TV/index.tsx +8 -4
- package/Components/River/TV/utils/__tests__/toStringOrEmpty.test.ts +30 -0
- package/Components/River/TV/utils/index.ts +4 -0
- package/Components/River/TV/withFocusableGroupForContent.tsx +71 -0
- package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -0
- package/Components/River/__tests__/componentsMap.test.js +38 -0
- package/Components/River/hooks/__tests__/usePullToRefresh.test.ts +132 -0
- package/Components/River/hooks/index.ts +1 -0
- package/Components/River/hooks/usePullToRefresh.ts +51 -0
- package/Components/Screen/TV/index.web.tsx +4 -2
- package/Components/Screen/__tests__/Screen.test.tsx +65 -42
- package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +68 -44
- package/Components/Screen/hooks.ts +2 -3
- package/Components/Screen/index.tsx +2 -3
- package/Components/Screen/orientationHandler.ts +3 -3
- package/Components/ScreenResolver/index.tsx +9 -5
- package/Components/ScreenRevealManager/ScreenRevealManager.ts +40 -8
- package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +86 -69
- package/Components/Tabs/TabContent.tsx +7 -4
- package/Components/TopCutoffOverlay/__tests__/TopCutoffOverlay.test.tsx +201 -0
- package/Components/TopCutoffOverlay/hooks/__tests__/useMarginTop.test.ts +130 -0
- package/Components/TopCutoffOverlay/hooks/index.ts +1 -0
- package/Components/TopCutoffOverlay/hooks/useMarginTop.ts +59 -0
- package/Components/TopCutoffOverlay/index.tsx +55 -0
- package/Components/Transitioner/index.js +3 -3
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +5 -5
- package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +15 -7
- package/Components/VideoModal/utils.ts +12 -9
- package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +0 -2
- package/Components/Viewport/ViewportAware/index.tsx +16 -7
- package/Components/Viewport/ViewportEvents/__tests__/viewportEvents.test.js +1 -1
- package/Components/ZappFrameworkComponents/BarView/BarView.tsx +4 -6
- package/Components/ZappFrameworkComponents/BarView/__tests__/BarView.test.tsx +2 -2
- package/Components/default-cell-renderer/viewTrees/mobile/index.ts +0 -3
- package/Contexts/ScreenContext/index.tsx +25 -18
- package/Contexts/ScreenTrackedViewPositionsContext/__tests__/index.test.tsx +1 -1
- package/Decorators/Analytics/index.tsx +6 -5
- package/Decorators/ConfigurationWrapper/__tests__/__snapshots__/withConfigurationProvider.test.tsx.snap +1 -0
- package/Decorators/ConfigurationWrapper/const.ts +1 -0
- package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +39 -21
- 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/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +18 -7
- package/Helpers/DataSourceHelper/__tests__/itemLimitForData.test.ts +80 -0
- package/Helpers/DataSourceHelper/index.ts +19 -0
- package/package.json +5 -5
- package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +0 -135
- package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/types.ts +0 -25
- package/Components/River/TV/withTVEventHandler.tsx +0 -36
- package/Helpers/DataSourceHelper/index.js +0 -19
|
@@ -3,7 +3,7 @@ import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUt
|
|
|
3
3
|
|
|
4
4
|
import * as zappPipesRedux from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
5
5
|
import configureStore from "redux-mock-store";
|
|
6
|
-
import thunk from "redux-thunk";
|
|
6
|
+
import { thunk } from "redux-thunk";
|
|
7
7
|
|
|
8
8
|
import { zappPipesDataConnector } from "../index";
|
|
9
9
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// <reference types="@applicaster/zapp-react-native-ui-components" />
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
|
|
5
|
-
import {
|
|
5
|
+
import { usePlugins } from "@applicaster/zapp-react-native-redux/hooks";
|
|
6
6
|
import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
|
|
7
7
|
import { useScreenContext } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
|
|
8
8
|
import { ResolverSelector } from "./ResolverSelector";
|
|
@@ -23,7 +23,7 @@ export function zappPipesDataConnector(
|
|
|
23
23
|
) {
|
|
24
24
|
return function WrappedWithZappPipesData(props: Props) {
|
|
25
25
|
const { screenData } = useRoute();
|
|
26
|
-
const
|
|
26
|
+
const plugins = usePlugins();
|
|
27
27
|
const screenContextData = useScreenContext();
|
|
28
28
|
|
|
29
29
|
const {
|
|
@@ -76,7 +76,7 @@ export function StaticFeedResolver({
|
|
|
76
76
|
|
|
77
77
|
const zappPipesDataProps = useMemo(
|
|
78
78
|
() => ({
|
|
79
|
-
zappPipesData: { url, loading, data, error },
|
|
79
|
+
zappPipesData: { url, loading, data, error }, // todo: add applyItemLimit
|
|
80
80
|
reloadData,
|
|
81
81
|
loadNextData: undefined, // Static resolver doesn't support pagination
|
|
82
82
|
}),
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
getInflatedDataSourceUrl,
|
|
10
10
|
getSearchContext,
|
|
11
11
|
useFeedLoader,
|
|
12
|
-
useFeedRefresh,
|
|
13
12
|
useRoute,
|
|
14
13
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
14
|
+
import { refreshCoordinator } from "@applicaster/zapp-react-native-utils/refreshUtils/RefreshCoordinator";
|
|
15
15
|
|
|
16
16
|
import { ComponentDataSourceContext, ZappPipesDataProps } from "../types";
|
|
17
17
|
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
@@ -199,6 +199,8 @@ export function UrlFeedResolver({
|
|
|
199
199
|
const { pathname } = useRoute();
|
|
200
200
|
const screenStateStore = useScreenStateStore();
|
|
201
201
|
|
|
202
|
+
const screenId = (screenContext?.id || "unknown_screen_id") as string;
|
|
203
|
+
|
|
202
204
|
// Setup listeners for data source URL
|
|
203
205
|
useEffect(() => {
|
|
204
206
|
if (!reloadData) {
|
|
@@ -214,10 +216,19 @@ export function UrlFeedResolver({
|
|
|
214
216
|
url: dataSourceUrl,
|
|
215
217
|
pathname,
|
|
216
218
|
screenStateStore,
|
|
219
|
+
component,
|
|
220
|
+
screenId,
|
|
217
221
|
callback: reloadData,
|
|
218
222
|
});
|
|
219
223
|
}
|
|
220
|
-
}, [
|
|
224
|
+
}, [
|
|
225
|
+
dataSourceUrl,
|
|
226
|
+
reloadData,
|
|
227
|
+
pathname,
|
|
228
|
+
screenStateStore,
|
|
229
|
+
component,
|
|
230
|
+
screenId,
|
|
231
|
+
]);
|
|
221
232
|
|
|
222
233
|
// Setup favorites listener
|
|
223
234
|
useEffect(() => {
|
|
@@ -230,11 +241,11 @@ export function UrlFeedResolver({
|
|
|
230
241
|
}
|
|
231
242
|
}, [type, reloadData]);
|
|
232
243
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
});
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
const unregister = refreshCoordinator.register(component, screenId);
|
|
246
|
+
|
|
247
|
+
return () => unregister();
|
|
248
|
+
}, [component, screenId]);
|
|
238
249
|
|
|
239
250
|
const loadNextData = useMemo(
|
|
240
251
|
() => (!isLast && isVerticalListOrGrid(component) ? undefined : loadNext),
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-ui-components",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "16.0.0-alpha.7128076344",
|
|
4
4
|
"description": "Applicaster Zapp React Native ui components for the Quick Brick App",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@applicaster/applicaster-types": "
|
|
32
|
-
"@applicaster/zapp-react-native-bridge": "
|
|
33
|
-
"@applicaster/zapp-react-native-redux": "
|
|
34
|
-
"@applicaster/zapp-react-native-utils": "
|
|
31
|
+
"@applicaster/applicaster-types": "16.0.0-alpha.7128076344",
|
|
32
|
+
"@applicaster/zapp-react-native-bridge": "16.0.0-alpha.7128076344",
|
|
33
|
+
"@applicaster/zapp-react-native-redux": "16.0.0-alpha.7128076344",
|
|
34
|
+
"@applicaster/zapp-react-native-utils": "16.0.0-alpha.7128076344",
|
|
35
35
|
"fast-json-stable-stringify": "^2.1.0",
|
|
36
36
|
"promise": "^8.3.0",
|
|
37
37
|
"url": "^0.11.0",
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { View, ButtonProps } from "react-native";
|
|
3
|
-
import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable";
|
|
4
|
-
import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
|
|
5
|
-
import * as R from "ramda";
|
|
6
|
-
import { useInitialFocus } from "@applicaster/zapp-react-native-utils/focusManager";
|
|
7
|
-
import { getXray } from "@applicaster/zapp-react-native-utils/logger";
|
|
8
|
-
import { useFocusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable/index.android";
|
|
9
|
-
import {
|
|
10
|
-
useIsRTL,
|
|
11
|
-
applyRTLStylesIfNeeded,
|
|
12
|
-
} from "@applicaster/zapp-react-native-utils/localizationUtils";
|
|
13
|
-
|
|
14
|
-
const { Logger } = getXray();
|
|
15
|
-
|
|
16
|
-
import {
|
|
17
|
-
cloneElementsWithIds,
|
|
18
|
-
insertBetween,
|
|
19
|
-
recursiveCloneElementsWithState,
|
|
20
|
-
useFilterChildren,
|
|
21
|
-
} from "../../../utils";
|
|
22
|
-
|
|
23
|
-
import type {
|
|
24
|
-
HorizontalSeparatorProps,
|
|
25
|
-
ContainerProps,
|
|
26
|
-
ContainerChildren,
|
|
27
|
-
} from "./types";
|
|
28
|
-
|
|
29
|
-
const logger = new Logger("plugin", "plugins/navigation-action");
|
|
30
|
-
|
|
31
|
-
const generateId = (cellUUID, suffixId) => `${cellUUID}--${suffixId}`;
|
|
32
|
-
|
|
33
|
-
const HorizontalSeparator = ({ width }: HorizontalSeparatorProps) => (
|
|
34
|
-
<View style={{ width }} />
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
export function ButtonContainerView({
|
|
38
|
-
style,
|
|
39
|
-
children,
|
|
40
|
-
...otherProps
|
|
41
|
-
}: ContainerProps) {
|
|
42
|
-
const isRTL = useIsRTL();
|
|
43
|
-
|
|
44
|
-
const horizontalGutter = R.pathOr(0, ["horizontalGutter"], otherProps);
|
|
45
|
-
|
|
46
|
-
const filteredChildren = useFilterChildren<ContainerChildren>(children);
|
|
47
|
-
|
|
48
|
-
const buttonIds = filteredChildren.map((child) => {
|
|
49
|
-
const { cellUUID, suffixId } = child.props;
|
|
50
|
-
|
|
51
|
-
return generateId(cellUUID, suffixId);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
useInitialFocus(otherProps.state === "focused", R.head(buttonIds));
|
|
55
|
-
|
|
56
|
-
if (R.isEmpty(filteredChildren)) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<View style={applyRTLStylesIfNeeded(style, isRTL)}>
|
|
62
|
-
{insertBetween(
|
|
63
|
-
(index) => (
|
|
64
|
-
<HorizontalSeparator
|
|
65
|
-
key={`separator_${index}`}
|
|
66
|
-
width={horizontalGutter}
|
|
67
|
-
/>
|
|
68
|
-
),
|
|
69
|
-
cloneElementsWithIds(buttonIds, filteredChildren)
|
|
70
|
-
)}
|
|
71
|
-
</View>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function FocusableViewComponent(
|
|
76
|
-
{ style, children, item, ...otherProps }: ButtonProps,
|
|
77
|
-
ref
|
|
78
|
-
) {
|
|
79
|
-
const {
|
|
80
|
-
cellUUID,
|
|
81
|
-
groupId,
|
|
82
|
-
suffixId,
|
|
83
|
-
normalStyles,
|
|
84
|
-
focusedStyles,
|
|
85
|
-
nextFocusLeft,
|
|
86
|
-
nextFocusRight,
|
|
87
|
-
pluginIdentifier,
|
|
88
|
-
disableFocus,
|
|
89
|
-
} = otherProps;
|
|
90
|
-
|
|
91
|
-
const parentFocus = useFocusable();
|
|
92
|
-
|
|
93
|
-
const actionContext = useActions(pluginIdentifier);
|
|
94
|
-
|
|
95
|
-
const onPress = () => {
|
|
96
|
-
if (!actionContext) {
|
|
97
|
-
logger.warning(
|
|
98
|
-
`Cannot resolve action context for ${pluginIdentifier} - please make sure the plugin is installed and up to date`
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
actionContext?.invokeAction?.(item);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<Focusable
|
|
109
|
-
id={generateId(cellUUID, suffixId)}
|
|
110
|
-
disableFocus={disableFocus}
|
|
111
|
-
groupId={groupId}
|
|
112
|
-
onPress={onPress}
|
|
113
|
-
nextFocusUp={parentFocus?.nextFocusUp}
|
|
114
|
-
nextFocusDown={parentFocus?.nextFocusDown}
|
|
115
|
-
nextFocusLeft={nextFocusLeft || parentFocus?.nextFocusLeft}
|
|
116
|
-
nextFocusRight={nextFocusRight || parentFocus?.nextFocusRight}
|
|
117
|
-
ref={ref}
|
|
118
|
-
>
|
|
119
|
-
{(isFocused) => {
|
|
120
|
-
const additionalStyles = isFocused ? focusedStyles : normalStyles;
|
|
121
|
-
|
|
122
|
-
return (
|
|
123
|
-
<View
|
|
124
|
-
style={{
|
|
125
|
-
...style,
|
|
126
|
-
...additionalStyles,
|
|
127
|
-
}}
|
|
128
|
-
>
|
|
129
|
-
{recursiveCloneElementsWithState(isFocused, children)}
|
|
130
|
-
</View>
|
|
131
|
-
);
|
|
132
|
-
}}
|
|
133
|
-
</Focusable>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { ImageStyle } from "react-native";
|
|
2
|
-
|
|
3
|
-
export type ContainerProps = Record<string, any> & {
|
|
4
|
-
buttonsToggleEnabled: boolean;
|
|
5
|
-
skipButtons: boolean;
|
|
6
|
-
style: ImageStyle;
|
|
7
|
-
children: ContainerChildren[];
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export type ButtonProps = Record<string, any> & {
|
|
11
|
-
style: ImageStyle;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export type HorizontalSeparatorProps = {
|
|
15
|
-
width: number;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export type ContainerChildren = {
|
|
19
|
-
props: {
|
|
20
|
-
item: any;
|
|
21
|
-
pluginIdentifier: string;
|
|
22
|
-
cellUUID: string;
|
|
23
|
-
suffixId: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/* eslint max-len: off */
|
|
2
|
-
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { TVEventHandlerComponent } from "@applicaster/zapp-react-native-tvos-ui-components/Components/TVEventHandlerComponent";
|
|
5
|
-
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
6
|
-
import { useIsStandaloneFullscreen } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
|
|
7
|
-
|
|
8
|
-
export const withTvEventHandler = (Component) => {
|
|
9
|
-
return function WithTVEventHandler(props) {
|
|
10
|
-
const navigator = useNavigation();
|
|
11
|
-
|
|
12
|
-
const isStandaloneFullscreen = useIsStandaloneFullscreen();
|
|
13
|
-
|
|
14
|
-
const remoteHandler = (event) => {
|
|
15
|
-
const { eventType } = event;
|
|
16
|
-
|
|
17
|
-
const canGoBack = navigator.canGoBack();
|
|
18
|
-
|
|
19
|
-
if (eventType === "menu" && isStandaloneFullscreen) {
|
|
20
|
-
navigator.goHome();
|
|
21
|
-
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (eventType === "menu" && canGoBack) {
|
|
26
|
-
navigator.goBack();
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<TVEventHandlerComponent tvEventHandler={remoteHandler}>
|
|
32
|
-
<Component {...props} />
|
|
33
|
-
</TVEventHandlerComponent>
|
|
34
|
-
);
|
|
35
|
-
};
|
|
36
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import * as R from "ramda";
|
|
2
|
-
|
|
3
|
-
export function itemLimitForData(entry = [], component) {
|
|
4
|
-
const itemLimitValue = Number(R.path(["rules", "item_limit"], component));
|
|
5
|
-
|
|
6
|
-
const itemLimit =
|
|
7
|
-
itemLimitValue && itemLimitValue > 0
|
|
8
|
-
? itemLimitValue
|
|
9
|
-
: Number.MAX_SAFE_INTEGER;
|
|
10
|
-
|
|
11
|
-
const isInRange = (min, max) => R.both(R.gte(R.__, min), R.lt(R.__, max));
|
|
12
|
-
|
|
13
|
-
const entryShouldBeSliced = (entry) =>
|
|
14
|
-
isInRange(0, R.length(entry))(itemLimit);
|
|
15
|
-
|
|
16
|
-
const sliceEntriesUpToItemLimit = R.slice(0, itemLimit);
|
|
17
|
-
|
|
18
|
-
return R.when(entryShouldBeSliced, sliceEntriesUpToItemLimit)(entry);
|
|
19
|
-
}
|