@applicaster/zapp-react-native-utils 14.0.0-rc.9 → 15.0.0-alpha.2239032089

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 (138) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +60 -84
  2. package/actionsExecutor/ScreenActions.ts +164 -0
  3. package/actionsExecutor/StorageActions.ts +110 -0
  4. package/actionsExecutor/feedDecorator.ts +171 -0
  5. package/actionsExecutor/screenResolver.ts +11 -0
  6. package/analyticsUtils/AnalyticsEvents/helper.ts +81 -0
  7. package/analyticsUtils/AnalyticsEvents/sendHeaderClickEvent.ts +1 -1
  8. package/analyticsUtils/AnalyticsEvents/sendMenuClickEvent.ts +2 -1
  9. package/analyticsUtils/AnalyticsEvents/sendOnClickEvent.ts +14 -4
  10. package/analyticsUtils/__tests__/analyticsUtils.test.js +3 -0
  11. package/analyticsUtils/events.ts +8 -0
  12. package/analyticsUtils/index.tsx +3 -4
  13. package/analyticsUtils/manager.ts +1 -1
  14. package/analyticsUtils/playerAnalyticsTracker.ts +2 -1
  15. package/appUtils/HooksManager/Hook.ts +4 -4
  16. package/appUtils/HooksManager/index.ts +11 -1
  17. package/appUtils/RiverFocusManager/{index.js → index.ts} +25 -18
  18. package/appUtils/accessibilityManager/const.ts +13 -0
  19. package/appUtils/accessibilityManager/hooks.ts +35 -1
  20. package/appUtils/accessibilityManager/index.ts +154 -30
  21. package/appUtils/accessibilityManager/utils.ts +24 -0
  22. package/appUtils/contextKeysManager/contextResolver.ts +42 -1
  23. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +10 -0
  24. package/appUtils/focusManager/__tests__/focusManager.test.js +1 -1
  25. package/appUtils/focusManager/events.ts +2 -0
  26. package/appUtils/focusManager/index.ios.ts +46 -1
  27. package/appUtils/focusManager/index.ts +86 -11
  28. package/appUtils/focusManager/treeDataStructure/Tree/index.js +1 -1
  29. package/appUtils/focusManagerAux/utils/index.ios.ts +104 -0
  30. package/appUtils/focusManagerAux/utils/index.ts +94 -3
  31. package/appUtils/focusManagerAux/utils/utils.ios.ts +63 -0
  32. package/appUtils/platform/platformUtils.ts +31 -1
  33. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +0 -15
  34. package/appUtils/playerManager/useChapterMarker.tsx +0 -1
  35. package/appUtils/playerManager/usePlayerControllerSetup.tsx +16 -0
  36. package/arrayUtils/__tests__/isEmptyArray.test.ts +63 -0
  37. package/arrayUtils/__tests__/isFilledArray.test.ts +1 -1
  38. package/arrayUtils/index.ts +8 -3
  39. package/audioPlayerUtils/__tests__/getArtworkImage.test.ts +144 -0
  40. package/audioPlayerUtils/__tests__/getBackgroundImage.test.ts +72 -0
  41. package/audioPlayerUtils/__tests__/getImageFromEntry.test.ts +110 -0
  42. package/audioPlayerUtils/assets/index.ts +2 -0
  43. package/audioPlayerUtils/index.ts +242 -0
  44. package/componentsUtils/__tests__/isTabsScreen.test.ts +38 -0
  45. package/componentsUtils/index.ts +4 -1
  46. package/conf/player/__tests__/selectors.test.ts +34 -0
  47. package/conf/player/selectors.ts +10 -0
  48. package/configurationUtils/__tests__/configurationUtils.test.js +0 -31
  49. package/configurationUtils/__tests__/getMediaItems.test.ts +65 -0
  50. package/configurationUtils/__tests__/imageSrcFromMediaItem.test.ts +34 -0
  51. package/configurationUtils/__tests__/manifestKeyParser.test.ts +546 -0
  52. package/configurationUtils/index.ts +64 -35
  53. package/configurationUtils/manifestKeyParser.ts +57 -32
  54. package/focusManager/FocusManager.ts +104 -20
  55. package/focusManager/Tree.ts +25 -21
  56. package/focusManager/__tests__/FocusManager.test.ts +50 -8
  57. package/focusManager/aux/index.ts +98 -0
  58. package/focusManager/utils.ts +12 -6
  59. package/index.d.ts +1 -10
  60. package/manifestUtils/_internals/getDefaultConfiguration.js +28 -0
  61. package/manifestUtils/{_internals.js → _internals/index.js} +2 -25
  62. package/manifestUtils/createConfig.js +4 -1
  63. package/manifestUtils/defaultManifestConfigurations/player.js +2764 -1539
  64. package/manifestUtils/index.js +4 -0
  65. package/manifestUtils/keys.js +12 -0
  66. package/manifestUtils/progressBar/__tests__/mobileProgressBar.test.js +0 -30
  67. package/manifestUtils/sharedConfiguration/screenPicker/stylesFields.js +6 -0
  68. package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
  69. package/navigationUtils/index.ts +7 -5
  70. package/package.json +2 -3
  71. package/playerUtils/PlayerTTS/PlayerTTS.ts +359 -0
  72. package/playerUtils/PlayerTTS/index.ts +1 -0
  73. package/playerUtils/__tests__/configurationUtils.test.ts +1 -65
  74. package/playerUtils/__tests__/getPlayerActionButtons.test.ts +54 -0
  75. package/playerUtils/_internals/__tests__/utils.test.ts +71 -0
  76. package/playerUtils/_internals/index.ts +1 -0
  77. package/playerUtils/_internals/utils.ts +31 -0
  78. package/playerUtils/configurationUtils.ts +0 -44
  79. package/playerUtils/getPlayerActionButtons.ts +17 -0
  80. package/playerUtils/index.ts +53 -0
  81. package/playerUtils/usePlayerTTS.ts +21 -0
  82. package/playerUtils/useValidatePlayerConfig.tsx +22 -19
  83. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +15 -14
  84. package/reactHooks/cell-click/__tests__/index.test.js +3 -0
  85. package/reactHooks/cell-click/index.ts +8 -1
  86. package/reactHooks/debugging/__tests__/index.test.js +0 -1
  87. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +47 -90
  88. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +71 -31
  89. package/reactHooks/feed/index.ts +2 -0
  90. package/reactHooks/feed/useBatchLoading.ts +17 -10
  91. package/reactHooks/feed/useFeedLoader.tsx +36 -34
  92. package/reactHooks/feed/useLoadPipesDataDispatch.ts +63 -0
  93. package/reactHooks/feed/usePipesCacheReset.ts +3 -3
  94. package/reactHooks/flatList/useSequentialRenderItem.tsx +3 -3
  95. package/reactHooks/layout/__tests__/index.test.tsx +3 -1
  96. package/reactHooks/layout/isTablet/index.ts +12 -5
  97. package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
  98. package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
  99. package/reactHooks/layout/useLayoutVersion.ts +5 -5
  100. package/reactHooks/navigation/index.ts +7 -5
  101. package/reactHooks/navigation/useIsScreenActive.ts +9 -5
  102. package/reactHooks/navigation/useRoute.ts +7 -2
  103. package/reactHooks/navigation/useScreenStateStore.ts +8 -0
  104. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
  105. package/reactHooks/screen/useScreenContext.ts +1 -1
  106. package/reactHooks/state/__tests__/ZStoreProvider.test.tsx +2 -1
  107. package/reactHooks/state/index.ts +1 -1
  108. package/reactHooks/state/useHomeRiver.ts +4 -2
  109. package/reactHooks/state/useRivers.ts +7 -8
  110. package/riverComponetsMeasurementProvider/index.tsx +1 -1
  111. package/screenPickerUtils/index.ts +13 -0
  112. package/services/js2native.ts +1 -0
  113. package/storage/ScreenSingleValueProvider.ts +204 -0
  114. package/storage/ScreenStateMultiSelectProvider.ts +293 -0
  115. package/storage/StorageMultiSelectProvider.ts +192 -0
  116. package/storage/StorageSingleSelectProvider.ts +108 -0
  117. package/testUtils/index.tsx +7 -8
  118. package/time/BackgroundTimer.ts +6 -4
  119. package/utils/__tests__/endsWith.test.ts +30 -0
  120. package/utils/__tests__/find.test.ts +36 -0
  121. package/utils/__tests__/omit.test.ts +19 -0
  122. package/utils/__tests__/path.test.ts +33 -0
  123. package/utils/__tests__/pathOr.test.ts +37 -0
  124. package/utils/__tests__/startsWith.test.ts +30 -0
  125. package/utils/__tests__/take.test.ts +40 -0
  126. package/utils/endsWith.ts +9 -0
  127. package/utils/find.ts +3 -0
  128. package/utils/index.ts +34 -1
  129. package/utils/omit.ts +5 -0
  130. package/utils/path.ts +5 -0
  131. package/utils/pathOr.ts +5 -0
  132. package/utils/startsWith.ts +9 -0
  133. package/utils/take.ts +5 -0
  134. package/zappFrameworkUtils/HookCallback/callbackNavigationAction.ts +164 -0
  135. package/zappFrameworkUtils/HookCallback/hookCallbackManifestExtensions.config.js +60 -0
  136. package/zappFrameworkUtils/HookCallback/useCallbackActions.ts +22 -0
  137. package/zappFrameworkUtils/loginPluginUtils.ts +1 -1
  138. package/playerUtils/configurationGenerator.ts +0 -2572
@@ -4,9 +4,12 @@ import {
4
4
  ANALYTICS_COMPONENT_EVENTS,
5
5
  ANALYTICS_CORE_EVENTS,
6
6
  ANALYTICS_ENTRY_EVENTS,
7
+ ANALYTICS_PREFERENCES_EVENTS,
7
8
  DOWNLOADS_EVENTS,
8
9
  } from "../events";
9
10
  import { isEmptyOrNil } from "../../cellUtils";
11
+ import { get } from "lodash";
12
+ import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/StorageMultiSelectProvider";
10
13
 
11
14
  export enum OfflineItemState {
12
15
  notExist = "NOT_EXISTS",
@@ -102,6 +105,84 @@ export function eventForComponent(
102
105
  return analyticsProps;
103
106
  }
104
107
 
108
+ /**
109
+ * Checks if an item is currently selected in localStorage based on its actions
110
+ * @param item - The item to check
111
+ * @returns boolean indicating if the item is currently selected
112
+ */
113
+ function isItemPreviouslySelected(item: any): boolean {
114
+ const actions = item?.extensions?.tap_actions?.actions;
115
+
116
+ if (!actions) {
117
+ return false;
118
+ }
119
+
120
+ const localStorageAction = actions.find(
121
+ (action) => action?.type === "localStorageToggleFlag"
122
+ );
123
+
124
+ if (!localStorageAction?.options?.key) {
125
+ return false;
126
+ }
127
+
128
+ const keyNamespace = localStorageAction.options.key;
129
+
130
+ const tag = localStorageAction.options?.selector
131
+ ? get(item, localStorageAction.options.selector)
132
+ : (item.extensions?.tag ?? item.id);
133
+
134
+ if (!tag) {
135
+ return false;
136
+ }
137
+
138
+ try {
139
+ const multiSelectProvider =
140
+ StorageMultiSelectProvider.getProvider(keyNamespace);
141
+
142
+ const selectedItems = multiSelectProvider.getSelectedItems();
143
+
144
+ return selectedItems.includes(tag);
145
+ } catch (error) {
146
+ return false;
147
+ }
148
+ }
149
+
150
+ export function getLocalStorageSetPayload(extraProps) {
151
+ const { item } = extraProps;
152
+
153
+ const hasLocalStorageSetAction = item?.extensions?.tap_actions?.actions?.some(
154
+ (action) => action?.type === "localStorageSet"
155
+ );
156
+
157
+ if (!hasLocalStorageSetAction) {
158
+ return null;
159
+ }
160
+
161
+ return {
162
+ [ANALYTICS_PREFERENCES_EVENTS.ITEM_SELECTED_STATUS]: true,
163
+ };
164
+ }
165
+
166
+ export function getLocalStorageToggleFlagPayload(extraProps) {
167
+ const { item } = extraProps;
168
+
169
+ const hasLocalStorageToggleAction =
170
+ item?.extensions?.tap_actions?.actions?.some(
171
+ (action) => action?.type === "localStorageToggleFlag"
172
+ );
173
+
174
+ if (!hasLocalStorageToggleAction) {
175
+ return null;
176
+ }
177
+
178
+ const previouslySelected = isItemPreviouslySelected(item);
179
+
180
+ return {
181
+ [ANALYTICS_PREFERENCES_EVENTS.ITEM_SELECTED_STATUS]: !previouslySelected,
182
+ [ANALYTICS_PREFERENCES_EVENTS.PREVIOUS_SELECTED_STATE]: previouslySelected,
183
+ };
184
+ }
185
+
105
186
  export function playEventForType(item) {
106
187
  const itemType = item?.type && item.type?.value;
107
188
 
@@ -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,13 +1,13 @@
1
1
  import { log_error, log_debug } from "../logger";
2
-
3
- import { ANALYTICS_CORE_EVENTS } from "../events";
4
-
2
+ import { ANALYTICS_CORE_EVENTS, ACTION_TYPE } from "../events";
5
3
  import { postAnalyticEvent } from "../manager";
6
4
  import {
7
5
  replaceAnalyticsPropsNils,
8
6
  eventForEntry,
9
7
  eventForComponent,
10
8
  extensionsEvents,
9
+ getLocalStorageSetPayload,
10
+ getLocalStorageToggleFlagPayload,
11
11
  } from "./helper";
12
12
 
13
13
  declare type AnalyticsDefaultHelperProperties = {
@@ -26,7 +26,16 @@ export const sendOnClickEvent = ({
26
26
  const castedExtraProps: ExtraProps = extraProps;
27
27
  const componentData = component || extraProps.component;
28
28
  const data = zappPipesData || extraProps.zappPipesData;
29
- const eventName = ANALYTICS_CORE_EVENTS.TAP_CELL;
29
+
30
+ const actionCellPayload =
31
+ extraProps?.item?.type?.value === ACTION_TYPE
32
+ ? getLocalStorageSetPayload(extraProps) ||
33
+ getLocalStorageToggleFlagPayload(extraProps)
34
+ : null;
35
+
36
+ const eventName = actionCellPayload
37
+ ? ANALYTICS_CORE_EVENTS.TAP_SELECTABLE_CELL
38
+ : ANALYTICS_CORE_EVENTS.TAP_CELL;
30
39
 
31
40
  if (!analyticsScreenData) {
32
41
  log_error(
@@ -44,6 +53,7 @@ export const sendOnClickEvent = ({
44
53
  ...replaceAnalyticsPropsNils({
45
54
  ...analyticsScreenData,
46
55
  }),
56
+ ...actionCellPayload,
47
57
  };
48
58
 
49
59
  if (analyticsCustomProperties) {
@@ -3,6 +3,9 @@ import { ANALYTICS_CORE_EVENTS } from "../events";
3
3
 
4
4
  jest.mock("@applicaster/zapp-react-native-utils/reactUtils", () => ({
5
5
  isWeb: jest.fn(),
6
+ platformSelect: jest.fn(
7
+ (options) => options.android || options.ios || options.web
8
+ ),
6
9
  }));
7
10
 
8
11
  const mock_postAnalyticEvent = jest.fn();
@@ -17,8 +17,11 @@ export const SCREEN_VIEW_EVENTS = {
17
17
  TIME_ON_SCREEN: "time_on_screen",
18
18
  };
19
19
 
20
+ export const ACTION_TYPE = "action";
21
+
20
22
  export const TAPPING_EVENTS = {
21
23
  TAP_CELL: "tap_cell",
24
+ TAP_SELECTABLE_CELL: "tap_selectable_cell",
22
25
  TAP_MENU: "tap_menu",
23
26
  TAP_NAVBAR_BACK_BUTTON: "tap_navbar_back_button",
24
27
  };
@@ -99,6 +102,11 @@ export const ANALYTICS_COMPONENT_EVENTS = {
99
102
  COMPONENT_SOURCE: "component_source",
100
103
  };
101
104
 
105
+ export const ANALYTICS_PREFERENCES_EVENTS = {
106
+ ITEM_SELECTED_STATUS: "item_selected_status",
107
+ PREVIOUS_SELECTED_STATE: "previous_selected_state",
108
+ };
109
+
102
110
  // ---------------- EVENTS ---------------------
103
111
  export const AD_EVENT = {
104
112
  ad_break_start: "player_ad_break_start",
@@ -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
 
@@ -105,7 +105,8 @@ export class PlayerAnalyticsTracker implements PlayerAnalyticsTrackerI {
105
105
  return this.getDateTimestamp();
106
106
  }
107
107
 
108
- this.mediaTime = this.playerState?.currentTime || eventData?.currentTime;
108
+ this.mediaTime =
109
+ this.playerState?.contentPosition || eventData?.currentTime;
109
110
 
110
111
  return this.mediaTime;
111
112
  }
@@ -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,
@@ -1,11 +1,31 @@
1
- import * as R from "ramda";
2
-
3
- import { focusManager } from "../focusManager";
1
+ import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focusManager/index.ios";
2
+ import { QUICK_BRICK_CONTENT } from "@applicaster/quick-brick-core/const";
3
+ import { isNil, isEmpty } from "@applicaster/zapp-react-native-utils/utils";
4
+ import { isNotNil } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
4
5
 
5
6
  let riverFocusData = {};
6
7
  let initialyPresentedScreenFocused = false;
7
8
 
8
9
  export const riverFocusManager = (function () {
10
+ /**
11
+ * Create unique key that will be used for save focused group data inside specific screen
12
+ * @param {{ screenId: string, isInsideContainer: boolean }}
13
+ * screenId Unique Id of the screen from layout.json
14
+ * isInsideContainer If this screen a screen picker child
15
+ *
16
+ */
17
+ function screenFocusableGroupId({
18
+ screenId,
19
+ isInsideContainer,
20
+ }: {
21
+ screenId: string;
22
+ isInsideContainer: Option<boolean>;
23
+ }) {
24
+ return `${QUICK_BRICK_CONTENT}-${screenId}${
25
+ isNil(isInsideContainer) ? "" : "-isInsideContainer"
26
+ }`;
27
+ }
28
+
9
29
  function setScreenFocusableData({
10
30
  screenFocusableGroupId,
11
31
  groupId,
@@ -78,8 +98,8 @@ export const riverFocusManager = (function () {
78
98
  }) {
79
99
  // Check if screen should be focused
80
100
  const shouldFocus =
81
- (initialyPresentedScreenFocused === false && R.isEmpty(riverFocusData)) ||
82
- R.compose(R.not, R.isNil)(riverFocusData[screenFocusableGroupId]) ||
101
+ (initialyPresentedScreenFocused === false && isEmpty(riverFocusData)) ||
102
+ isNotNil(riverFocusData[screenFocusableGroupId]) ||
83
103
  isDeepLink;
84
104
 
85
105
  // TODO: Uncommit it to start fixing bug where selection wrong item
@@ -118,19 +138,6 @@ export const riverFocusManager = (function () {
118
138
  }
119
139
  }
120
140
 
121
- /**
122
- * Create unique key that will be used for save focused group data inside specific screen
123
- * @param {{ screenId: string, isInsideContainer: boolean }}
124
- * screenId Unique Id of the screen from layout.json
125
- * isInsideContainer If this screen a screen picker child
126
- *
127
- */
128
- function screenFocusableGroupId({ screenId, isInsideContainer }) {
129
- return `RiverFocusableGroup-${screenId}${
130
- R.isNil(isInsideContainer) ? "" : "-isInsideContainer"
131
- }`;
132
- }
133
-
134
141
  return {
135
142
  setScreenFocusableData,
136
143
  clearAllScreensData,
@@ -65,4 +65,17 @@ export const BUTTON_ACCESSIBILITY_KEYS = {
65
65
  label: "accessibility_menu_item_label",
66
66
  hint: "accessibility_menu_item_hint",
67
67
  },
68
+ skip_intro: {
69
+ label: "accessibility_skip_intro_label",
70
+ hint: "accessibility_skip_intro_hint",
71
+ },
72
+ // Top Menu Bar-specific buttons
73
+ top_menu_bar_item_selected: {
74
+ label: "accessibility_top_menu_bar_item_selected_label",
75
+ hint: "accessibility_top_menu_bar_item_selected_hint",
76
+ },
77
+ top_menu_title: {
78
+ label: "accessibility_top_menu_title_label",
79
+ hint: "accessibility_top_menu_hint",
80
+ },
68
81
  } as const;
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo } from "react";
1
+ import { useEffect, useMemo, useState } from "react";
2
2
  import { AccessibilityManager } from "./index";
3
3
 
4
4
  /**
@@ -38,3 +38,37 @@ export const useAccessibilityManager = (
38
38
 
39
39
  return accessibilityManager;
40
40
  };
41
+
42
+ export const useInitialAnnouncementReady = (
43
+ accessibilityManager: AccessibilityManager
44
+ ) => {
45
+ const [isReady, setIsReady] = useState(
46
+ accessibilityManager.isInitialPlayerAnnouncementReady
47
+ );
48
+
49
+ useEffect(() => {
50
+ const subscription = accessibilityManager
51
+ .getInitialAnnouncementReadyObservable()
52
+ .subscribe(setIsReady);
53
+
54
+ return () => subscription.unsubscribe();
55
+ }, [accessibilityManager]);
56
+
57
+ return isReady;
58
+ };
59
+
60
+ export const useAnnouncementActive = (
61
+ accessibilityManager: AccessibilityManager
62
+ ) => {
63
+ const [isActive, setIsActive] = useState(false);
64
+
65
+ useEffect(() => {
66
+ const subscription = accessibilityManager
67
+ .getTTSStateObservable()
68
+ .subscribe(setIsActive);
69
+
70
+ return () => subscription.unsubscribe();
71
+ }, [accessibilityManager]);
72
+
73
+ return isActive;
74
+ };