@applicaster/zapp-react-native-utils 14.0.0-alpha.9256258513 → 14.0.0-alpha.9551591420

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.
Files changed (33) hide show
  1. package/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
  2. package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
  3. package/analyticsUtils/index.tsx +3 -4
  4. package/analyticsUtils/manager.ts +1 -1
  5. package/appUtils/HooksManager/Hook.ts +4 -4
  6. package/appUtils/HooksManager/index.ts +11 -1
  7. package/appUtils/accessibilityManager/index.ts +3 -12
  8. package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
  9. package/arrayUtils/index.ts +1 -1
  10. package/componentsUtils/__tests__/isTabsScreen.test.ts +38 -0
  11. package/componentsUtils/index.ts +4 -1
  12. package/configurationUtils/__tests__/manifestKeyParser.test.ts +547 -0
  13. package/configurationUtils/manifestKeyParser.ts +57 -32
  14. package/index.d.ts +0 -12
  15. package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
  16. package/navigationUtils/index.ts +6 -4
  17. package/package.json +2 -3
  18. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +15 -14
  19. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +39 -88
  20. package/reactHooks/feed/useBatchLoading.ts +8 -6
  21. package/reactHooks/feed/useFeedLoader.tsx +12 -8
  22. package/reactHooks/feed/usePipesCacheReset.ts +2 -2
  23. package/reactHooks/flatList/useSequentialRenderItem.tsx +3 -3
  24. package/reactHooks/layout/__tests__/index.test.tsx +3 -1
  25. package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
  26. package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
  27. package/reactHooks/layout/useLayoutVersion.ts +5 -5
  28. package/reactHooks/navigation/index.ts +5 -7
  29. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
  30. package/reactHooks/state/useRivers.ts +7 -8
  31. package/testUtils/index.tsx +7 -8
  32. package/time/BackgroundTimer.ts +1 -1
  33. package/utils/index.ts +1 -0
@@ -4,7 +4,7 @@ import { postAnalyticEvent } from "../manager";
4
4
  import { ANALYTICS_CORE_EVENTS } from "../events";
5
5
 
6
6
  type SendHeaderClickEventProps = {
7
- extraProps: ExtraProps;
7
+ extraProps: Record<string, any>;
8
8
  component?: ZappUIComponent;
9
9
  zappPipesData?: ZappPipesData;
10
10
  item?: ZappEntry;
@@ -1,10 +1,11 @@
1
+ /// <reference types="../../" />
1
2
  import { log_error, log_debug } from "../logger";
2
3
  import { replaceAnalyticsPropsNils } from "./helper";
3
4
  import { postAnalyticEvent } from "../manager";
4
5
 
5
6
  import { ANALYTICS_CORE_EVENTS } from "../events";
6
7
 
7
- declare type AnalyticsDefaultHelperProperties = {
8
+ type AnalyticsDefaultHelperProperties = {
8
9
  analyticsScreenData: AnalyticsScreenProperties;
9
10
  extraProps: any;
10
11
  props;
@@ -1,4 +1,3 @@
1
- /// <reference types="@applicaster/zapp-react-native-utils" />
2
1
  import * as R from "ramda";
3
2
  import * as React from "react";
4
3
  import { isWeb } from "@applicaster/zapp-react-native-utils/reactUtils";
@@ -31,7 +30,7 @@ import { ANALYTICS_CORE_EVENTS } from "./events";
31
30
  import { noop } from "../functionUtils";
32
31
 
33
32
  type ComponentWithChildrenProps = {
34
- children: React.ReactChildren;
33
+ children: React.ReactElement;
35
34
  };
36
35
 
37
36
  export function sendSelectCellEvent(item, component, headerTitle, itemIndex) {
@@ -120,11 +119,11 @@ export function getAnalyticsFunctions({
120
119
  export const AnalyticsContext =
121
120
  React.createContext<GetAnalyticsFunctions>(noop);
122
121
 
123
- export function AnalyticsProvider(props: ComponentWithChildrenProps) {
122
+ export function AnalyticsProvider({ children }: ComponentWithChildrenProps) {
124
123
  return (
125
124
  // @ts-ignore - this is a valid context provider
126
125
  <AnalyticsContext.Provider value={getAnalyticsFunctions}>
127
- {props?.children}
126
+ {children}
128
127
  </AnalyticsContext.Provider>
129
128
  );
130
129
  }
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-use-before-define */
2
2
  import * as R from "ramda";
3
3
  import { NativeModules } from "react-native";
4
- import { ANALYTICS_CORE_EVENTS } from "@applicaster/zapp-react-native-utils/analyticsUtils/events";
4
+ import { ANALYTICS_CORE_EVENTS } from "./events";
5
5
 
6
6
  import { analyticsUtilsLogger } from "./logger";
7
7
 
@@ -65,10 +65,6 @@ export class Hook implements HookInterface {
65
65
  event: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS],
66
66
  ...args
67
67
  ) {
68
- if (this.state === hookState(HOOKS_EVENTS.CANCEL)) {
69
- return;
70
- }
71
-
72
68
  this.state = hookState(event);
73
69
  this.manager.subscriber.invokeHandler(event, ...args);
74
70
  }
@@ -198,4 +194,8 @@ export class Hook implements HookInterface {
198
194
  R.eqProps("weight", nextHook, this)
199
195
  );
200
196
  }
197
+
198
+ isCancelled(): boolean {
199
+ return this.state === hookState(HOOKS_EVENTS.CANCEL);
200
+ }
201
201
  }
@@ -255,7 +255,7 @@ export function HooksManager({
255
255
  * @param {Array<Hook>} restOfHooks to run
256
256
  * @returns {function} callback function
257
257
  */
258
- function hookCallback(hookPlugin, restOfHooks, initialPayload) {
258
+ function hookCallback(hookPlugin: Hook, restOfHooks: Hook[], initialPayload) {
259
259
  /**
260
260
  * callback invoked after a hook is executed
261
261
  * @param {object} options
@@ -273,6 +273,16 @@ export function HooksManager({
273
273
  }) {
274
274
  let callback = callbackArg;
275
275
 
276
+ if (hookPlugin.isCancelled()) {
277
+ logHookEvent(
278
+ hooksManagerLogger.info,
279
+ `hookCallback: hook was cancelled: ${hookPlugin["identifier"]}`,
280
+ {}
281
+ );
282
+
283
+ return;
284
+ }
285
+
276
286
  if (error) {
277
287
  logHookEvent(
278
288
  hooksManagerLogger.error,
@@ -2,8 +2,8 @@ import { BehaviorSubject } from "rxjs";
2
2
  import { accessibilityManagerLogger as logger } from "./logger";
3
3
  import { TTSManager } from "../platform";
4
4
  import { BUTTON_ACCESSIBILITY_KEYS } from "./const";
5
- import { AccessibilityRole } from "react-native";
6
5
  import { toString } from "../../utils";
6
+ import { AccessibilityRole } from "react-native";
7
7
 
8
8
  export class AccessibilityManager {
9
9
  private static _instance: AccessibilityManager | null = null;
@@ -143,15 +143,12 @@ export class AccessibilityManager {
143
143
 
144
144
  if (!buttonConfig) {
145
145
  return {
146
- accessible: true,
147
146
  accessibilityLabel: buttonName,
148
147
  accessibilityHint: `Press button to perform action on ${buttonName}`,
149
148
  "aria-label": buttonName,
150
149
  "aria-description": `Press button to perform action on ${buttonName}`,
151
- accessibilityRole: "button" as AccessibilityRole,
150
+ accessibilityRole: "button",
152
151
  "aria-role": "button",
153
- role: "button",
154
- tabindex: 0,
155
152
  };
156
153
  }
157
154
 
@@ -165,29 +162,23 @@ export class AccessibilityManager {
165
162
  `Press button to perform action on ${buttonName}`;
166
163
 
167
164
  return {
168
- accessible: true,
169
165
  accessibilityLabel: label,
170
166
  accessibilityHint: hint,
171
167
  "aria-label": label,
172
168
  "aria-description": hint,
173
- accessibilityRole: "button" as AccessibilityRole,
169
+ accessibilityRole: "button",
174
170
  "aria-role": "button",
175
- role: "button",
176
- tabindex: 0,
177
171
  };
178
172
  }
179
173
 
180
174
  public getInputAccessibilityProps(inputName: string): AccessibilityProps {
181
175
  return {
182
- accessible: true,
183
176
  accessibilityLabel: inputName,
184
177
  accessibilityHint: `Enter text into ${inputName}`,
185
178
  "aria-label": inputName,
186
179
  "aria-description": `Enter text into ${inputName}`,
187
180
  accessibilityRole: "textbox" as AccessibilityRole,
188
181
  "aria-role": "textbox",
189
- role: "textbox",
190
- tabindex: 0,
191
182
  };
192
183
  }
193
184
 
@@ -142,7 +142,7 @@ export class Tree {
142
142
  this.hasGroupID(node)
143
143
  ? "Make sure that there are no id duplicates inside the " +
144
144
  existingNode.parent.id +
145
- " group."
145
+ " group. This can as well happen when the component is re-mounted"
146
146
  : ""
147
147
  }`,
148
148
  });
@@ -93,7 +93,7 @@ export const isIndexInRange = (index: number, length: number): boolean => {
93
93
  export const makeListOfIndexes = (size: number): number[] =>
94
94
  Array.from({ length: size }, (_, index) => index);
95
95
 
96
- export const makeListOf = (value: unknown, size: number): number[] => {
96
+ export const makeListOf = <T>(value: T, size: number): T[] => {
97
97
  return Array(size).fill(value);
98
98
  };
99
99
 
@@ -0,0 +1,38 @@
1
+ import { isTabsScreen } from "..";
2
+
3
+ describe("isTabsScreen", () => {
4
+ it("should return true if the component type is 'screen-picker-qb-tv' and tabs_screen=true", () => {
5
+ const item = { component_type: "screen-picker-qb-tv", tabs_screen: true };
6
+ expect(isTabsScreen(item)).toBe(true);
7
+ });
8
+
9
+ it("should return true if the component type is 'screen-picker-qb-tv' and tabs_screen=false", () => {
10
+ const item = { component_type: "screen-picker-qb-tv", tabs_screen: false };
11
+ expect(isTabsScreen(item)).toBe(false);
12
+ });
13
+
14
+ it("should return false if the component type is not 'screen-picker-qb-tv'", () => {
15
+ const item = { component_type: "other-component" };
16
+ expect(isTabsScreen(item)).toBe(false);
17
+ });
18
+
19
+ it("should return false if the component type is undefined", () => {
20
+ const item = { component_type: undefined };
21
+ expect(isTabsScreen(item)).toBe(false);
22
+ });
23
+
24
+ it("should return false if the item is null", () => {
25
+ const item = null;
26
+ expect(isTabsScreen(item)).toBe(false);
27
+ });
28
+
29
+ it("should return false if the item is undefined", () => {
30
+ const item = undefined;
31
+ expect(isTabsScreen(item)).toBe(false);
32
+ });
33
+
34
+ it("should return false if the item is an empty object", () => {
35
+ const item = {};
36
+ expect(isTabsScreen(item)).toBe(false);
37
+ });
38
+ });
@@ -5,7 +5,7 @@ const EMPTY_GROUP_COMPONENT = "empty_group_component";
5
5
 
6
6
  const GALLERY = "gallery-qb";
7
7
 
8
- const SCREEN_PICKER = "screen-picker-qb-tv";
8
+ export const SCREEN_PICKER = "screen-picker-qb-tv";
9
9
 
10
10
  const HORIZONTAL_LIST = "horizontal_list_qb";
11
11
 
@@ -37,3 +37,6 @@ export const isEmptyGroup = (item): boolean =>
37
37
  export const isGroupInfo = (item): boolean =>
38
38
  item?.component_type === GROUP_INFO ||
39
39
  item?.component_type === GROUP_INFO_OLD;
40
+
41
+ export const isTabsScreen = (item): boolean =>
42
+ isScreenPicker(item) && item?.tabs_screen;