@applicaster/zapp-react-native-ui-components 15.0.0-alpha.2239032089 → 15.0.0-alpha.3339012525

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.
@@ -8,8 +8,6 @@ import { withFocusableContext } from "../../Contexts/FocusableGroupContext/withF
8
8
  import { StyleSheet, ViewStyle } from "react-native";
9
9
  import { AccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager";
10
10
 
11
- import { isSearchInputId } from "@applicaster/search-screen/src/tv/utils";
12
-
13
11
  type Props = {
14
12
  initialFocus?: boolean;
15
13
  id: string;
@@ -108,7 +106,7 @@ class Focusable extends BaseFocusable<Props> {
108
106
  onMouseEnter() {
109
107
  const { id } = this.props;
110
108
 
111
- if (!isSearchInputId(id)) {
109
+ if (id !== "search_input_group_id") {
112
110
  this.mouse = true;
113
111
  this.props?.handleFocus?.({ mouse: true });
114
112
 
@@ -122,7 +120,7 @@ class Focusable extends BaseFocusable<Props> {
122
120
  onMouseLeave() {
123
121
  const { id } = this.props;
124
122
 
125
- if (!isSearchInputId(id)) {
123
+ if (id !== "search_input_group_id") {
126
124
  this.mouse = false;
127
125
  this.blur(null);
128
126
  }
@@ -10,9 +10,8 @@ import {
10
10
  forceFocusableFocus,
11
11
  } from "@applicaster/zapp-react-native-utils/appUtils/focusManager/index.ios";
12
12
  import { findNodeHandle, ViewStyle } from "react-native";
13
- import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
14
13
 
15
- import { emitFocused } from "@applicaster/zapp-react-native-utils/appUtils/focusManagerAux/utils/utils.ios";
14
+ function noop() {}
16
15
 
17
16
  type Props = {
18
17
  id: string;
@@ -85,9 +84,6 @@ export class Focusable extends BaseFocusable<Props> {
85
84
  });
86
85
  }
87
86
 
88
- const id: string = nativeEvent.itemID;
89
- emitFocused(id);
90
-
91
87
  onFocus(nativeEvent);
92
88
  }
93
89
 
@@ -34,11 +34,6 @@ type Props = {
34
34
  };
35
35
 
36
36
  export class FocusableGroup extends BaseFocusable<Props> {
37
- constructor(props) {
38
- super(props);
39
- this.isGroup = true;
40
- }
41
-
42
37
  render() {
43
38
  const {
44
39
  children,
@@ -142,17 +142,15 @@ export const useCurationAPI = (
142
142
  const url = path(SOURCE_PATH, component);
143
143
  const mapping = path(MAPPING_PATH, component);
144
144
 
145
- map[component.id] = mapping
146
- ? getInflatedDataSourceUrl({
147
- source: url,
148
- contexts: {
149
- entry: entryContext,
150
- screen: screenContext,
151
- search: getSearchContext(searchContext, mapping),
152
- },
153
- mapping,
154
- })
155
- : url;
145
+ map[component.id] = getInflatedDataSourceUrl({
146
+ source: url,
147
+ contexts: {
148
+ entry: entryContext,
149
+ screen: screenContext,
150
+ search: getSearchContext(searchContext, mapping),
151
+ },
152
+ mapping,
153
+ });
156
154
  });
157
155
 
158
156
  return map;
@@ -4,7 +4,6 @@ import * as React from "react";
4
4
  import { Text } from "react-native";
5
5
  import * as R from "ramda";
6
6
 
7
- import { isNil } from "@applicaster/zapp-react-native-utils/utils";
8
7
  import { GeneralContentScreen } from "../../GeneralContentScreen";
9
8
  import { ScreenResolver } from "@applicaster/zapp-react-native-ui-components/Components/ScreenResolver";
10
9
  import { utilsLogger } from "@applicaster/zapp-react-native-utils/logger";
@@ -25,7 +24,6 @@ type Props = {
25
24
  isInsideContainer?: boolean;
26
25
  extraAnchorPointYOffset: number;
27
26
  river?: ZappRiver | ZappEntry;
28
- groupId: string;
29
27
  };
30
28
 
31
29
  export const River = (props: Props) => {
@@ -37,7 +35,6 @@ export const River = (props: Props) => {
37
35
  componentsMapExtraProps,
38
36
  isInsideContainer,
39
37
  extraAnchorPointYOffset,
40
- groupId,
41
38
  } = props;
42
39
 
43
40
  const { title: screenTitle, summary: screenSummary } = useNavbarState();
@@ -55,7 +52,7 @@ export const River = (props: Props) => {
55
52
  );
56
53
 
57
54
  const stringOrEmpty = (value: string | number | undefined): string =>
58
- isNil(value) ? "" : String(value);
55
+ R.isNil(value) ? "" : String(value);
59
56
 
60
57
  React.useEffect(() => {
61
58
  if (!isInsideContainer) {
@@ -95,10 +92,8 @@ export const River = (props: Props) => {
95
92
  <ScreenResolver
96
93
  screenType={river.type}
97
94
  screenId={screenId}
98
- screenData={Object.assign(river || {}, { groupId: extraData?.groupId })}
99
- componentsMapExtraProps={Object.assign(componentsMapExtraProps || {}, {
100
- groupId,
101
- })}
95
+ screenData={R.merge(river, { groupId: extraData?.groupId })}
96
+ componentsMapExtraProps={componentsMapExtraProps}
102
97
  {...extraData}
103
98
  />
104
99
  );
@@ -111,7 +106,6 @@ export const River = (props: Props) => {
111
106
  isScreenWrappedInContainer={isInsideContainer}
112
107
  extraAnchorPointYOffset={extraAnchorPointYOffset}
113
108
  componentsMapExtraProps={componentsMapExtraProps}
114
- groupId={groupId}
115
109
  />
116
110
  );
117
111
  };
@@ -1,11 +1,11 @@
1
1
  import { compose } from "ramda";
2
2
  import { River as RiverComponent } from "./River";
3
+ import { withTvEventHandler } from "./withTVEventHandler";
3
4
  import { withComponentsMapOffsetContext } from "../../../Contexts/ComponentsMapOffsetContext";
4
5
  import { withRiverDataLoader } from "./withRiverDataLoader";
5
- import { withFocusableGroupForContent } from "./withFocusableGroupForContent";
6
6
 
7
7
  export const River = compose(
8
+ withTvEventHandler,
8
9
  withComponentsMapOffsetContext,
9
- withRiverDataLoader,
10
- withFocusableGroupForContent
10
+ withRiverDataLoader
11
11
  )(RiverComponent);
@@ -0,0 +1,27 @@
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
+
7
+ export const withTvEventHandler = (Component) => {
8
+ return function WithTVEventHandler(props) {
9
+ const navigator = useNavigation();
10
+
11
+ const remoteHandler = (event) => {
12
+ const { eventType } = event;
13
+
14
+ const canGoBack = navigator.canGoBack();
15
+
16
+ if (eventType === "menu" && canGoBack) {
17
+ navigator.goBack();
18
+ }
19
+ };
20
+
21
+ return (
22
+ <TVEventHandlerComponent tvEventHandler={remoteHandler}>
23
+ <Component {...props} />
24
+ </TVEventHandlerComponent>
25
+ );
26
+ };
27
+ };
@@ -16,6 +16,7 @@ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
16
16
  import { useScreenAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks";
17
17
 
18
18
  import { useCallbackActions } from "@applicaster/zapp-react-native-utils/zappFrameworkUtils/HookCallback/useCallbackActions";
19
+ import { ScreenResultCallback } from "@applicaster/zapp-react-native-utils/zappFrameworkUtils/HookCallback/callbackNavigationAction";
19
20
 
20
21
  const logger = componentsLogger.addSubsystem("ScreenResolver");
21
22
 
@@ -26,6 +27,7 @@ type Props = {
26
27
  feedId?: string;
27
28
  feedTitle?: string;
28
29
  focused?: boolean;
30
+ resultCallback?: ScreenResultCallback;
29
31
  parentFocus?: {
30
32
  nextFocusDown?: React.Ref<any>;
31
33
  nextFocusRight?: React.Ref<any>;
@@ -61,13 +63,17 @@ export function ScreenResolverComponent(props: Props) {
61
63
 
62
64
  React.useEffect(() => {
63
65
  setScreenContext(rivers[screenId]);
64
- }, [screenId]);
66
+ }, [rivers, screenId, setScreenContext]);
65
67
 
66
- const callbackAction = useCallbackActions(
68
+ const parentCallback = props.resultCallback;
69
+
70
+ const screenAction = useCallbackActions(
67
71
  hookPlugin || screenData,
68
72
  screenData.callback
69
73
  );
70
74
 
75
+ const callbackAction = parentCallback || screenAction;
76
+
71
77
  const ScreenPlugin =
72
78
  findPluginByType(screenType, plugins, { skipWarning: true }) ||
73
79
  findPluginByIdentifier(screenType, plugins) ||
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
- import { StyleSheet } from "react-native";
3
- import { SafeAreaView } from "react-native-safe-area-context";
2
+ import { StyleSheet, View } from "react-native";
4
3
 
5
4
  import { useIsRTL } from "@applicaster/zapp-react-native-utils/localizationUtils";
6
5
  import CloseButton from "./Buttons/CloseButton";
@@ -45,15 +44,14 @@ const BarView = ({ screenStyles, barState = defaultState }: Props) => {
45
44
  );
46
45
 
47
46
  return (
48
- <SafeAreaView
49
- edges={["top", "left", "right"]}
47
+ <View
50
48
  style={[style.view, isRTL ? style.rtlStyle : {}]}
51
- testID="BarView-safeAreaView"
49
+ testID="BarView-Container"
52
50
  >
53
51
  {backButton}
54
52
  <BarTitle title={barState.title} screenStyles={screenStyles} />
55
53
  {closeButton}
56
- </SafeAreaView>
54
+ </View>
57
55
  );
58
56
  };
59
57
 
@@ -46,7 +46,7 @@ describe("BarView", () => {
46
46
  <BarView screenStyles={screenStyles} barState={barState} />
47
47
  );
48
48
 
49
- expect(getByTestId("BarView-safeAreaView").props.style).toContainEqual({
49
+ expect(getByTestId("BarView-Container").props.style).toContainEqual({
50
50
  transform: [{ scaleX: -1 }],
51
51
  });
52
52
  });
@@ -58,7 +58,7 @@ describe("BarView", () => {
58
58
  <BarView screenStyles={screenStyles} barState={barState} />
59
59
  );
60
60
 
61
- expect(getByTestId("BarView-safeAreaView").props.style).not.toContainEqual({
61
+ expect(getByTestId("BarView-Container").props.style).not.toContainEqual({
62
62
  transform: [{ scaleX: -1 }],
63
63
  });
64
64
  });
@@ -24,16 +24,12 @@ export const getDatasourceUrl: (
24
24
  ) => {
25
25
  const { source, mapping } = R.propOr({}, ["data"], component);
26
26
 
27
- if (mapping) {
28
- const contexts = {
29
- entry: entryContext,
30
- screen: screenContext || screenData,
31
- search: getSearchContext(searchContext, mapping),
32
- };
27
+ const contexts = {
28
+ entry: entryContext,
29
+ screen: screenContext || screenData,
30
+ search: getSearchContext(searchContext, mapping),
31
+ };
33
32
 
34
- return getInflatedDataSourceUrl({ source, mapping, contexts });
35
- }
36
-
37
- return source;
33
+ return getInflatedDataSourceUrl({ source, mapping, contexts });
38
34
  }
39
35
  );
package/events/index.ts CHANGED
@@ -5,6 +5,4 @@ export enum QBUIComponentEvents {
5
5
  scrollVerticallyToInitialOffset = "scrollVerticallyToInitialOffset",
6
6
  focusOnSelectedTab = "focusOnSelectedTab",
7
7
  focusOnSelectedTopMenuItem = "focusOnSelectedTopMenuItem",
8
- focusOnHomeTopMenuItem = "focusOnHomeTopMenuItem",
9
- topMenuBarTV_onLayout = "topMenuBarTV_onLayout",
10
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "15.0.0-alpha.2239032089",
3
+ "version": "15.0.0-alpha.3339012525",
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": "15.0.0-alpha.2239032089",
32
- "@applicaster/zapp-react-native-bridge": "15.0.0-alpha.2239032089",
33
- "@applicaster/zapp-react-native-redux": "15.0.0-alpha.2239032089",
34
- "@applicaster/zapp-react-native-utils": "15.0.0-alpha.2239032089",
31
+ "@applicaster/applicaster-types": "15.0.0-alpha.3339012525",
32
+ "@applicaster/zapp-react-native-bridge": "15.0.0-alpha.3339012525",
33
+ "@applicaster/zapp-react-native-redux": "15.0.0-alpha.3339012525",
34
+ "@applicaster/zapp-react-native-utils": "15.0.0-alpha.3339012525",
35
35
  "promise": "^8.3.0",
36
36
  "url": "^0.11.0",
37
37
  "uuid": "^3.3.2"
@@ -1,60 +0,0 @@
1
- import * as React from "react";
2
- import { View } 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
- import { toNumberWithDefaultZero } from "@applicaster/zapp-react-native-utils/numberUtils";
7
-
8
- import { useSubscriberFor } from "@applicaster/zapp-react-native-utils/reactHooks/useSubscriberFor";
9
- import { QBUIComponentEvents } from "@applicaster/zapp-react-native-ui-components/events";
10
-
11
- import { QUICK_BRICK_TOP_CONTAINER } from "@applicaster/quick-brick-core/const";
12
-
13
- const useTopMenuLayout = () => {
14
- const [layout, setLayout] = React.useState(undefined);
15
-
16
- const handleLayout = React.useCallback((layout) => {
17
- setLayout(layout);
18
- }, []);
19
-
20
- useSubscriberFor(QBUIComponentEvents.topMenuBarTV_onLayout, handleLayout);
21
-
22
- return layout;
23
- };
24
-
25
- export const withFocusableGroupForContent = (Component) => {
26
- return function (props) {
27
- const { screenId, isInsideContainer } = props;
28
-
29
- const topMenuLayout = useTopMenuLayout();
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
- const topMenuHeight = toNumberWithDefaultZero(topMenuLayout?.height);
45
-
46
- return (
47
- <FocusableGroup
48
- key={focusableId}
49
- id={focusableId}
50
- // workaround to avoid intersection between FocusableGroup for content and FocusableGroup for top-menu
51
- style={{ flex: 1, marginTop: topMenuHeight }}
52
- groupId={QUICK_BRICK_TOP_CONTAINER}
53
- >
54
- <View style={{ flex: 1, marginTop: -1 * topMenuHeight }}>
55
- <Component {...props} groupId={focusableId} />
56
- </View>
57
- </FocusableGroup>
58
- );
59
- };
60
- };