@applicaster/zapp-react-native-utils 16.0.0-alpha.4416921324 → 16.0.0-alpha.4548770949

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 (173) hide show
  1. package/actionUtils/index.ts +3 -1
  2. package/actionsExecutor/ActionExecutor.ts +50 -3
  3. package/actionsExecutor/ActionExecutorContext.tsx +99 -17
  4. package/actionsExecutor/__tests__/ActionExecutor.test.ts +71 -0
  5. package/actionsExecutor/__tests__/StorageActions.test.ts +98 -0
  6. package/actionsExecutor/__tests__/feedDecorator.test.ts +91 -0
  7. package/actionsExecutor/__tests__/screenToggleFlag.test.ts +90 -0
  8. package/actionsExecutor/actions/__tests__/dismissBottomSheet.test.ts +25 -0
  9. package/actionsExecutor/actions/__tests__/goBack.test.ts +62 -0
  10. package/actionsExecutor/actions/__tests__/goHome.test.ts +19 -0
  11. package/actionsExecutor/actions/__tests__/loadItemsFromSource.test.ts +88 -0
  12. package/actionsExecutor/actions/__tests__/navigateToScreen.test.ts +267 -0
  13. package/actionsExecutor/actions/__tests__/openBottomSheet.customContent.test.ts +100 -0
  14. package/actionsExecutor/actions/__tests__/openBottomSheet.inlineItems.test.ts +372 -0
  15. package/actionsExecutor/actions/__tests__/presentScreen.test.ts +127 -0
  16. package/actionsExecutor/actions/__tests__/showAlert.test.ts +49 -0
  17. package/actionsExecutor/actions/__tests__/showToast.test.ts +88 -0
  18. package/actionsExecutor/actions/dismissBottomSheet.ts +23 -0
  19. package/actionsExecutor/actions/goBack.ts +60 -0
  20. package/actionsExecutor/actions/goHome.ts +31 -0
  21. package/actionsExecutor/actions/index.ts +12 -0
  22. package/actionsExecutor/actions/navigateToScreen.ts +43 -45
  23. package/actionsExecutor/actions/openBottomSheet.ts +340 -0
  24. package/actionsExecutor/actions/presentScreen.ts +78 -0
  25. package/actionsExecutor/actions/refreshComponent.ts +6 -0
  26. package/actionsExecutor/actions/screenToggleFlag.ts +1 -3
  27. package/actionsExecutor/actions/sendCloudEvent.ts +6 -1
  28. package/actionsExecutor/actions/showAlert.ts +51 -0
  29. package/actionsExecutor/actions/showToast.ts +64 -8
  30. package/actionsExecutor/consts.ts +27 -0
  31. package/actionsExecutor/feedDecorator.ts +12 -6
  32. package/analyticsUtils/PlayerAnalyticsManager.ts +1 -1
  33. package/appUtils/HooksManager/index.ts +9 -0
  34. package/appUtils/contextKeysManager/__tests__/getKey/failure.test.ts +1 -22
  35. package/appUtils/contextKeysManager/__tests__/getKey/success/fullSearch.test.ts +1 -25
  36. package/appUtils/contextKeysManager/__tests__/getKey/success/searchInSecure.test.ts +1 -7
  37. package/appUtils/contextKeysManager/__tests__/removeKey/failure.test.ts +0 -25
  38. package/appUtils/contextKeysManager/__tests__/removeKey/success.test.ts +0 -6
  39. package/appUtils/contextKeysManager/__tests__/setKey/failure/failedToSaveInStorage.test.ts +0 -40
  40. package/appUtils/contextKeysManager/__tests__/setKey/{success/saveItemAndReference.test.ts → success.test.ts} +2 -42
  41. package/appUtils/contextKeysManager/index.ts +28 -129
  42. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +142 -59
  43. package/appUtils/playerManager/OverlayObserver/__tests__/getUpcomingQueue.test.ts +67 -0
  44. package/appUtils/playerManager/OverlayObserver/__tests__/liveContent.test.ts +205 -0
  45. package/appUtils/playerManager/OverlayObserver/__tests__/utils.test.ts +56 -0
  46. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.android.tv.ts +4 -0
  47. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ios.tv.ts +4 -0
  48. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ts +24 -0
  49. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.web.ts +4 -0
  50. package/appUtils/playerManager/OverlayObserver/utils.ts +51 -20
  51. package/appUtils/playerManager/__tests__/playerContent.test.ts +403 -0
  52. package/appUtils/playerManager/__tests__/playerDiagnostics.test.ts +62 -0
  53. package/appUtils/playerManager/__tests__/playerFactory.test.ts +1 -1
  54. package/appUtils/playerManager/__tests__/playerNative.test.ts +114 -0
  55. package/appUtils/playerManager/__tests__/playerNativeCommand.test.ts +62 -0
  56. package/appUtils/playerManager/__tests__/playerToolbox.test.ts +281 -0
  57. package/appUtils/playerManager/__tests__/usePlayerContent.test.tsx +64 -0
  58. package/appUtils/playerManager/__tests__/usePlayerControllerSetup.test.tsx +62 -0
  59. package/appUtils/playerManager/{conts.ts → const.ts} +33 -0
  60. package/appUtils/playerManager/index.ts +8 -1
  61. package/appUtils/playerManager/player.ts +140 -3
  62. package/appUtils/playerManager/playerFactory.ts +1 -1
  63. package/appUtils/playerManager/playerNative.ts +28 -4
  64. package/appUtils/playerManager/playerNativeCommand.ts +3 -6
  65. package/appUtils/playerManager/playerToolbox.ts +196 -0
  66. package/appUtils/playerManager/usePlayerContent.tsx +43 -0
  67. package/appUtils/playerManager/usePlayerControllerSetup.tsx +7 -1
  68. package/appUtils/playerManager/userLanguagePreference.ts +1 -1
  69. package/arrayUtils/__tests__/reorderByIds.test.ts +63 -0
  70. package/arrayUtils/index.ts +62 -0
  71. package/cellUtils/__tests__/getButtonsEnabled.test.ts +28 -0
  72. package/cellUtils/__tests__/getCellNavigationEnabled.test.ts +36 -0
  73. package/cellUtils/__tests__/getIsCellNavigationEnabled.test.ts +35 -0
  74. package/cellUtils/__tests__/isCellNavigationEnabled.test.ts +21 -0
  75. package/cellUtils/index.ts +70 -3
  76. package/configurationUtils/__tests__/manifestKeyParser.test.ts +21 -0
  77. package/configurationUtils/__tests__/modalBlocksParser.test.ts +403 -0
  78. package/configurationUtils/manifestKeyParser.ts +50 -10
  79. package/configurationUtils/modalBlocksParser.ts +252 -0
  80. package/entryActions/__tests__/buildEntryActions.test.ts +235 -0
  81. package/entryActions/aliasPresentation.ts +108 -0
  82. package/entryActions/buildEntryActions.ts +167 -0
  83. package/entryActions/index.ts +15 -0
  84. package/entryActions/types.ts +39 -0
  85. package/focusManager/FocusManager.ts +26 -0
  86. package/focusManager/__tests__/FocusManager.test.ts +9 -0
  87. package/localizationUtils/index.ts +12 -6
  88. package/logger/__tests__/xrayToolbox.test.ts +69 -0
  89. package/logger/xrayToolbox.ts +67 -0
  90. package/manifestUtils/__tests__/player.audioControls.test.js +158 -0
  91. package/manifestUtils/_internals/index.js +8 -3
  92. package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
  93. package/manifestUtils/defaultManifestConfigurations/player.js +338 -1
  94. package/manifestUtils/index.js +3 -0
  95. package/manifestUtils/keys.js +7 -2
  96. package/manifestUtils/mobileAction/container/__tests__/mobileActionButtonsContainer.test.js +21 -0
  97. package/manifestUtils/mobileAction/groups/__tests__/buildMobileActionButtonGroups.test.js +1 -1
  98. package/manifestUtils/mobileAction/groups/defaults.js +2 -1
  99. package/manifestUtils/modalBlocks.js +304 -0
  100. package/modalState/ContentViewModel.ts +113 -0
  101. package/modalState/EditableCollection.ts +17 -0
  102. package/modalState/EditableCollectionRegistry.ts +51 -0
  103. package/modalState/ModalOrchestrator.ts +213 -0
  104. package/modalState/RemoteEditableCollection.ts +235 -0
  105. package/modalState/__tests__/ContentViewModel.editable.test.ts +69 -0
  106. package/modalState/__tests__/ContentViewModel.test.ts +165 -0
  107. package/modalState/__tests__/EditableCollectionRegistry.test.ts +112 -0
  108. package/modalState/__tests__/ModalOrchestrator.phase3.test.ts +86 -0
  109. package/modalState/__tests__/RemoteEditableCollection.test.ts +415 -0
  110. package/modalState/__tests__/index.test.ts +30 -1
  111. package/modalState/__tests__/useBottomSheetContent.test.ts +349 -0
  112. package/modalState/__tests__/useModalStoreState.test.ts +142 -0
  113. package/modalState/index.ts +37 -83
  114. package/modalState/store.ts +109 -0
  115. package/modalState/types.ts +173 -0
  116. package/modalState/useBottomSheetContent.ts +109 -0
  117. package/navigationUtils/xrayNavigator.ts +12 -0
  118. package/package.json +3 -2
  119. package/playerUtils/__tests__/contentDataKeys.test.ts +297 -0
  120. package/playerUtils/__tests__/resolvePlayerActions.test.ts +138 -0
  121. package/playerUtils/__tests__/resolvePlayerTitleSubtitle.test.ts +180 -0
  122. package/playerUtils/contentDataKeys.ts +134 -0
  123. package/playerUtils/index.ts +37 -16
  124. package/playerUtils/isAudioItem.ts +26 -0
  125. package/playerUtils/resolvePlayerActions.ts +71 -0
  126. package/playerUtils/resolvePlayerTitleSubtitle.ts +76 -0
  127. package/pluginUtils/__tests__/pluginUtils.test.js +32 -0
  128. package/pluginUtils/index.ts +29 -0
  129. package/quickBrickAssets/__tests__/index.test.ts +18 -0
  130. package/quickBrickAssets/index.ts +35 -0
  131. package/reactHooks/__tests__/getPluginConfiguration.test.ts +82 -0
  132. package/reactHooks/actions/index.ts +74 -3
  133. package/reactHooks/cell-click/__tests__/index.test.js +64 -0
  134. package/reactHooks/cell-click/index.ts +21 -14
  135. package/reactHooks/connection/index.tsx +8 -5
  136. package/reactHooks/feed/__tests__/feedInvalidation.test.tsx +338 -0
  137. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +8 -2
  138. package/reactHooks/feed/__tests__/useMarkPipesDataStale.test.tsx +243 -0
  139. package/reactHooks/feed/useFeedLoader.tsx +28 -1
  140. package/reactHooks/feed/useLoadPipesDataDispatch.ts +12 -11
  141. package/reactHooks/feed/useMarkPipesDataStale.ts +68 -23
  142. package/reactHooks/index.ts +2 -0
  143. package/reactHooks/layout/index.ts +1 -1
  144. package/reactHooks/navigation/__tests__/index.test.tsx +176 -1
  145. package/reactHooks/navigation/__tests__/usePresentScreen.test.ts +154 -0
  146. package/reactHooks/navigation/index.ts +2 -0
  147. package/reactHooks/navigation/usePresentScreen.ts +157 -0
  148. package/reactHooks/navigation/useRoute.ts +22 -5
  149. package/reactHooks/usePluginConfiguration.ts +88 -47
  150. package/reactHooks/utils/__tests__/index.test.js +22 -2
  151. package/reactHooks/utils/index.ts +11 -1
  152. package/riverComponetsMeasurementProvider/index.tsx +3 -1
  153. package/uiActionsRegistrator/__tests__/resolveActionIdentifiers.test.ts +93 -0
  154. package/uiActionsRegistrator/__tests__/subscribe.test.ts +133 -0
  155. package/uiActionsRegistrator/__tests__/usableActionItems.test.ts +52 -0
  156. package/uiActionsRegistrator/index.ts +25 -203
  157. package/uiActionsRegistrator/registry.ts +351 -0
  158. package/uiActionsRegistrator/resolveActionIdentifiers.ts +100 -0
  159. package/uiActionsRegistrator/usableActionItems.ts +66 -0
  160. package/zappFrameworkUtils/__tests__/localStorageHelper.test.ts +146 -0
  161. package/zappFrameworkUtils/localStorageHelper.ts +19 -15
  162. package/appUtils/contextKeysManager/__tests__/getKey/success/byReference.test.ts +0 -56
  163. package/appUtils/contextKeysManager/__tests__/getKeyByReference/failure.test.ts +0 -265
  164. package/appUtils/contextKeysManager/__tests__/getKeyByReference/success.test.ts +0 -303
  165. package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/failure.test.ts +0 -82
  166. package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/success.test.ts +0 -41
  167. package/appUtils/contextKeysManager/__tests__/setKey/success/saveItemButNotReference.test.ts +0 -208
  168. package/appUtils/contextKeysManager/__tests__/setReferenceForKey/failure.test.ts +0 -93
  169. package/appUtils/contextKeysManager/__tests__/setReferenceForKey/success.test.ts +0 -45
  170. package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +0 -56
  171. package/playerUtils/__tests__/getPlayerActionButtons.test.ts +0 -54
  172. package/playerUtils/getPlayerActionButtons.ts +0 -17
  173. /package/reactHooks/actions/__tests__/{index.test.js → index.test.tsx} +0 -0
@@ -62,10 +62,15 @@ export const sendCloudEventAction: ActionHandler<
62
62
  subject: options.subject || String((entry as ZappEntry)?.id || ""),
63
63
  });
64
64
 
65
- log_info("handleAction: sendCloudEvent event", { cloudEvent });
65
+ log_info("handleAction: sending sendCloudEvent to URL", {
66
+ url: options.url,
67
+ cloudEvent,
68
+ });
66
69
 
67
70
  const { error, code } = await sendCloudEvent(cloudEvent, options.url);
68
71
 
72
+ log_info("handleAction: sendCloudEvent result", { code, error });
73
+
69
74
  if (error) {
70
75
  log_error("sendCloudEvent: error sending cloud event", { error });
71
76
 
@@ -0,0 +1,51 @@
1
+ /// <reference types="@applicaster/applicaster-types" />
2
+ import { showAlertDialog } from "../../alertUtils";
3
+ import { ActionResult } from "../ActionExecutor";
4
+ import { ActionHandler } from "../types";
5
+ import { createLogger } from "../../logger";
6
+
7
+ const { log_info } = createLogger({
8
+ subsystem: "ActionExecutorContext",
9
+ category: "General",
10
+ });
11
+
12
+ /**
13
+ * Options for the showAlert action.
14
+ */
15
+ export interface ShowAlertOptions {
16
+ /** Dialog title (required) */
17
+ title: string;
18
+
19
+ /** Dialog message */
20
+ message?: string;
21
+
22
+ /** Dismiss button text. Defaults to "OK" */
23
+ okButtonText?: string;
24
+ }
25
+
26
+ /**
27
+ * Tells the user something and waits for them to acknowledge it.
28
+ *
29
+ * One button, because there is nothing to decide. Use `confirmDialog` when the
30
+ * user is choosing between going on and backing out; a `confirmDialog` without
31
+ * a cancel label still renders two buttons, the second one blank.
32
+ *
33
+ * Always resolves to Success: dismissing a notice is not a cancellation, so the
34
+ * rest of the chain runs.
35
+ */
36
+ export const showAlertAction: ActionHandler<ShowAlertOptions> = async (
37
+ action
38
+ ): Promise<ActionResult> => {
39
+ log_info("handleAction: showAlert event");
40
+
41
+ const options = action.options as ShowAlertOptions;
42
+
43
+ return new Promise<ActionResult>((resolve) => {
44
+ showAlertDialog({
45
+ title: options?.title,
46
+ message: options?.message,
47
+ okButtonText: options?.okButtonText || "OK",
48
+ completion: () => resolve(ActionResult.Success),
49
+ });
50
+ });
51
+ };
@@ -3,12 +3,65 @@ import { ActionResult } from "../ActionExecutor";
3
3
  import { ActionHandler } from "../types";
4
4
  import { postEvent } from "../../reactHooks/useSubscriberFor";
5
5
 
6
+ export const CONFIRMATION_TOAST_SOURCE = "confirmation";
7
+
8
+ export const CONFIRMATION_TOAST_DEFAULT_TIMEOUT = 5000;
9
+
6
10
  /**
7
- * Options for showToast action.
11
+ * Shows a mobile confirmation toast with Theme defaults from
12
+ * `Confirmation Toast / Message` in the base theme plugin.
13
+ *
14
+ * This action is confirmation-only by design: it always stamps
15
+ * `source: "confirmation"` (so Theme confirmation styles apply) and defaults
16
+ * `timeout` to 5000 ms. Non-confirmation toasts (e.g. Offline Experience)
17
+ * must post on the shared `"showToast"` event bus directly and omit `source`.
18
+ * Callers may override individual style fields; Theme supplies the rest.
19
+ *
20
+ * @example From React via ActionExecutorContext
21
+ * ```tsx
22
+ * import React, { useContext } from "react";
23
+ * import { ActionExecutorContext } from "@applicaster/zapp-react-native-utils/actionsExecutor/ActionExecutorContext";
24
+ *
25
+ * function QueueButton() {
26
+ * const { handleAction } = useContext(ActionExecutorContext);
27
+ *
28
+ * const onPress = () => {
29
+ * void handleAction({
30
+ * type: "showToast",
31
+ * options: { message: "Added to queue" },
32
+ * });
33
+ * };
34
+ *
35
+ * return <Button onPress={onPress} title="Add to queue" />;
36
+ * }
37
+ * ```
38
+ *
39
+ * @example From code via the actionExecutor singleton
40
+ * ```ts
41
+ * import { actionExecutor } from "@applicaster/zapp-react-native-utils/actionsExecutor/ActionExecutor";
42
+ *
43
+ * await actionExecutor.handleAction({
44
+ * type: "showToast",
45
+ * options: {
46
+ * message: "Playlist created",
47
+ * style: { backgroundColor: "#00AA55" }, // optional partial override
48
+ * },
49
+ * });
50
+ * ```
51
+ *
52
+ * @example From entry / pipes actions JSON
53
+ * ```json
54
+ * {
55
+ * "type": "showToast",
56
+ * "options": {
57
+ * "message": "Item removed from playlist"
58
+ * }
59
+ * }
60
+ * ```
8
61
  */
9
62
  export interface ShowToastActionOptions {
10
- id: string;
11
- message: string;
63
+ id?: string;
64
+ message?: string;
12
65
  extraMessage?: string;
13
66
  style?: any;
14
67
  timeout?: number;
@@ -17,13 +70,16 @@ export interface ShowToastActionOptions {
17
70
  export const showToastAction: ActionHandler<ShowToastActionOptions> = async (
18
71
  action
19
72
  ): Promise<ActionResult> => {
73
+ const options = action?.options;
74
+
20
75
  postEvent("showToast", [
21
76
  {
22
- id: action.options.id,
23
- message: action.options.message,
24
- extraMessage: action.options.extraMessage,
25
- style: action.options.style,
26
- timeout: action.options.timeout,
77
+ id: options?.id,
78
+ message: options?.message,
79
+ extraMessage: options?.extraMessage,
80
+ style: options?.style,
81
+ timeout: options?.timeout ?? CONFIRMATION_TOAST_DEFAULT_TIMEOUT,
82
+ source: CONFIRMATION_TOAST_SOURCE,
27
83
  },
28
84
  ]);
29
85
 
@@ -2,3 +2,30 @@ export const TOGGLE_FLAG_MAX_ITEMS_REACHED_EVENT =
2
2
  "action.localStorageToggleFlag.maxItemsReached";
3
3
 
4
4
  export const ACTION_EXECUTOR_EVENT_SOURCE = "ActionExecutor";
5
+
6
+ export const ACTION_TYPES = {
7
+ OPEN_BOTTOM_SHEET: "openBottomSheet",
8
+ DISMISS_BOTTOM_SHEET: "dismissBottomSheet",
9
+ PRESENT_SUB_MENU: "presentSubMenu",
10
+ SEND_CLOUD_EVENT: "sendCloudEvent",
11
+ NAVIGATE_TO_SCREEN: "navigateToScreen",
12
+ PRESENT_SCREEN: "presentScreen",
13
+ GO_BACK: "goBack",
14
+ GO_HOME: "goHome",
15
+ SHOW_TOAST: "showToast",
16
+ LOCAL_STORAGE_SET: "localStorageSet",
17
+ LOCAL_STORAGE_REMOVE: "localStorageRemove",
18
+ LOCAL_STORAGE_TOGGLE_FLAG: "localStorageToggleFlag",
19
+ SESSION_STORAGE_SET: "sessionStorageSet",
20
+ SESSION_STORAGE_REMOVE: "sessionStorageRemove",
21
+ SESSION_STORAGE_TOGGLE_FLAG: "sessionStorageToggleFlag",
22
+ REFRESH_COMPONENT: "refreshComponent",
23
+ SWITCH_LAYOUT: "switchLayout",
24
+ APP_RESTART: "appRestart",
25
+ CONFIRM_DIALOG: "confirmDialog",
26
+ SHOW_ALERT: "showAlert",
27
+ SCREEN_SET_VARIABLE: "screenSetVariable",
28
+ SCREEN_TOGGLE_FLAG: "screenToggleFlag",
29
+ } as const;
30
+
31
+ export type KnownActionType = (typeof ACTION_TYPES)[keyof typeof ACTION_TYPES];
@@ -47,6 +47,11 @@ function makeMultiSelect(feed: ZappFeed, key, decoratedFeed) {
47
47
  ? "sessionStorageToggleFlag"
48
48
  : "localStorageToggleFlag";
49
49
 
50
+ // the toggle actions read their limit from their own options
51
+ const maxItems = Number(
52
+ decoratedFeed.extensions?.preference_editor_options?.max_items
53
+ );
54
+
50
55
  decoratedFeed.entry?.forEach((entry: ZappEntry) => {
51
56
  entry.type.value = "action";
52
57
  entry.id = entry.extensions?.tag || entry.id;
@@ -59,6 +64,7 @@ function makeMultiSelect(feed: ZappFeed, key, decoratedFeed) {
59
64
  type: actionType,
60
65
  options: {
61
66
  key,
67
+ ...(maxItems > 0 && { max_items: maxItems }),
62
68
  },
63
69
  },
64
70
  ],
@@ -159,13 +165,13 @@ export const decorateFeed = (feed: ZappFeed) => {
159
165
 
160
166
  const decoratedFeed = R.clone(feed);
161
167
 
162
- const isSingleSelect =
163
- (feed.extensions?.preference_editor_options?.select_mode ||
164
- feed.extensions?.behavior?.select_mode) === "single";
168
+ const selectMode =
169
+ feed.extensions?.preference_editor_options?.select_mode ||
170
+ feed.extensions?.behavior?.select_mode;
165
171
 
166
- if (isSingleSelect) {
172
+ if (selectMode === "single") {
167
173
  return makeSingleSelect(feed, key, decoratedFeed);
168
- } else {
169
- return makeMultiSelect(feed, key, decoratedFeed);
170
174
  }
175
+
176
+ return makeMultiSelect(feed, key, decoratedFeed);
171
177
  };
@@ -8,7 +8,7 @@ import {
8
8
  } from "../appUtils/playerManager";
9
9
  import { Player } from "../appUtils/playerManager/player";
10
10
  import { AnalyticPlayerListener } from "./AnalyticPlayerListener";
11
- import { PlayerRole } from "../appUtils/playerManager/conts";
11
+ import { PlayerRole } from "../appUtils/playerManager/const";
12
12
 
13
13
  enum PlayerAnalyticsTrackerType {
14
14
  PlayerAnalyticsTracker = "PlayerAnalyticsTracker",
@@ -498,6 +498,15 @@ export function HooksManager({
498
498
  presentUI
499
499
  );
500
500
  } catch (e) {
501
+ // Without this the failure is invisible: the hook stops right after the
502
+ // "Executing hook" line, with nothing in the log explaining why and no
503
+ // remaining hook ever running.
504
+ logHookEvent(
505
+ hooksManagerLogger.error,
506
+ `runInBackground: hook ${hookPlugin.identifier} threw: ${e?.message}`,
507
+ { hook: hookPlugin, payload, error: e, stack: e?.stack }
508
+ );
509
+
501
510
  hookPlugin.setStateAndNotify(HOOKS_EVENTS.ERROR, {
502
511
  error: e,
503
512
  hookPlugin,
@@ -1,4 +1,4 @@
1
- import { ContextKeysManager, NOTHING } from "../..";
1
+ import { ContextKeysManager } from "../..";
2
2
 
3
3
  describe("Context Keys Manager - getKey", () => {
4
4
  it("returns null if key is invalid", async () => {
@@ -34,8 +34,6 @@ describe("Context Keys Manager - getKey", () => {
34
34
  secureStorage: mockedSecureStorage,
35
35
  });
36
36
 
37
- const getKeyByReference = jest.spyOn(contextManager, "getKeyByReference");
38
-
39
37
  // run
40
38
  const result = await contextManager.getKey(invalidKey);
41
39
 
@@ -50,7 +48,6 @@ describe("Context Keys Manager - getKey", () => {
50
48
  data: { key: invalidKey },
51
49
  });
52
50
 
53
- expect(getKeyByReference).not.toHaveBeenCalled();
54
51
  expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
55
52
  expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
56
53
  expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
@@ -90,10 +87,6 @@ describe("Context Keys Manager - getKey", () => {
90
87
  secureStorage: mockedSecureStorage,
91
88
  });
92
89
 
93
- const getKeyByReference = jest
94
- .spyOn(contextManager, "getKeyByReference")
95
- .mockResolvedValueOnce(NOTHING);
96
-
97
90
  // run
98
91
  const result = await contextManager.getKey(key);
99
92
 
@@ -107,8 +100,6 @@ describe("Context Keys Manager - getKey", () => {
107
100
  data: { key },
108
101
  });
109
102
 
110
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
111
-
112
103
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
113
104
  "key",
114
105
  "namespace"
@@ -152,10 +143,6 @@ describe("Context Keys Manager - getKey", () => {
152
143
  secureStorage: mockedSecureStorage,
153
144
  });
154
145
 
155
- const getKeyByReference = jest
156
- .spyOn(contextManager, "getKeyByReference")
157
- .mockResolvedValueOnce(NOTHING);
158
-
159
146
  // run
160
147
  const result = await contextManager.getKey(key);
161
148
 
@@ -169,8 +156,6 @@ describe("Context Keys Manager - getKey", () => {
169
156
  data: { key },
170
157
  });
171
158
 
172
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
173
-
174
159
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
175
160
  "key",
176
161
  "namespace"
@@ -214,10 +199,6 @@ describe("Context Keys Manager - getKey", () => {
214
199
  secureStorage: mockedSecureStorage,
215
200
  });
216
201
 
217
- const getKeyByReference = jest
218
- .spyOn(contextManager, "getKeyByReference")
219
- .mockResolvedValueOnce(NOTHING);
220
-
221
202
  // run
222
203
  const result = await contextManager.getKey(key);
223
204
 
@@ -231,8 +212,6 @@ describe("Context Keys Manager - getKey", () => {
231
212
  data: { key },
232
213
  });
233
214
 
234
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
235
-
236
215
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
237
216
  "key",
238
217
  "namespace"
@@ -1,4 +1,4 @@
1
- import { ContextKeysManager, NOTHING } from "../../..";
1
+ import { ContextKeysManager } from "../../..";
2
2
 
3
3
  describe("Context Keys Manager - getKey", () => {
4
4
  it("returns value if found in session-storage", async () => {
@@ -35,10 +35,6 @@ describe("Context Keys Manager - getKey", () => {
35
35
  secureStorage: mockedSecureStorage,
36
36
  });
37
37
 
38
- const getKeyByReference = jest
39
- .spyOn(contextManager, "getKeyByReference")
40
- .mockResolvedValueOnce(NOTHING);
41
-
42
38
  // run
43
39
  const result = await contextManager.getKey(key);
44
40
 
@@ -47,8 +43,6 @@ describe("Context Keys Manager - getKey", () => {
47
43
 
48
44
  expect(mockedLogger.warn).not.toHaveBeenCalled();
49
45
 
50
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
51
-
52
46
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
53
47
  "key",
54
48
  "namespace"
@@ -92,10 +86,6 @@ describe("Context Keys Manager - getKey", () => {
92
86
  secureStorage: mockedSecureStorage,
93
87
  });
94
88
 
95
- const getKeyByReference = jest
96
- .spyOn(contextManager, "getKeyByReference")
97
- .mockResolvedValueOnce(NOTHING);
98
-
99
89
  // run
100
90
  const result = await contextManager.getKey(key);
101
91
 
@@ -104,8 +94,6 @@ describe("Context Keys Manager - getKey", () => {
104
94
 
105
95
  expect(mockedLogger.warn).not.toHaveBeenCalled();
106
96
 
107
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
108
-
109
97
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
110
98
  "key",
111
99
  "namespace"
@@ -149,10 +137,6 @@ describe("Context Keys Manager - getKey", () => {
149
137
  secureStorage: mockedSecureStorage,
150
138
  });
151
139
 
152
- const getKeyByReference = jest
153
- .spyOn(contextManager, "getKeyByReference")
154
- .mockResolvedValueOnce(NOTHING);
155
-
156
140
  // run
157
141
  const result = await contextManager.getKey(key);
158
142
 
@@ -161,8 +145,6 @@ describe("Context Keys Manager - getKey", () => {
161
145
 
162
146
  expect(mockedLogger.warn).not.toHaveBeenCalled();
163
147
 
164
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
165
-
166
148
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
167
149
  "key",
168
150
  "namespace"
@@ -209,10 +191,6 @@ describe("Context Keys Manager - getKey", () => {
209
191
  secureStorage: mockedSecureStorage,
210
192
  });
211
193
 
212
- const getKeyByReference = jest
213
- .spyOn(contextManager, "getKeyByReference")
214
- .mockResolvedValueOnce(NOTHING);
215
-
216
194
  // run
217
195
  const result = await contextManager.getKey(key);
218
196
 
@@ -221,8 +199,6 @@ describe("Context Keys Manager - getKey", () => {
221
199
 
222
200
  expect(mockedLogger.warn).not.toHaveBeenCalled();
223
201
 
224
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
225
-
226
202
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
227
203
  "key",
228
204
  "namespace"
@@ -1,4 +1,4 @@
1
- import { ContextKeysManager, NOTHING } from "../../..";
1
+ import { ContextKeysManager } from "../../..";
2
2
  import { DEFAULT_NAMESPACE } from "../../../consts";
3
3
 
4
4
  describe("Context Keys Manager - getKey", () => {
@@ -36,10 +36,6 @@ describe("Context Keys Manager - getKey", () => {
36
36
  secureStorage: mockedSecureStorage,
37
37
  });
38
38
 
39
- const getKeyByReference = jest
40
- .spyOn(contextManager, "getKeyByReference")
41
- .mockResolvedValueOnce(NOTHING);
42
-
43
39
  // run
44
40
  const result = await contextManager.getKey(key);
45
41
 
@@ -48,8 +44,6 @@ describe("Context Keys Manager - getKey", () => {
48
44
 
49
45
  expect(mockedLogger.warn).not.toHaveBeenCalled();
50
46
 
51
- expect(getKeyByReference).toHaveBeenCalledWith("key", DEFAULT_NAMESPACE);
52
-
53
47
  expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(
54
48
  "key",
55
49
  DEFAULT_NAMESPACE
@@ -34,11 +34,6 @@ describe("Context Keys Manager - removeKey", () => {
34
34
  secureStorage: mockedSecureStorage,
35
35
  });
36
36
 
37
- const removeReferenceForKey = jest.spyOn(
38
- contextManager,
39
- "removeReferenceForKey"
40
- );
41
-
42
37
  // run
43
38
  const result = await contextManager.removeKey(key);
44
39
 
@@ -51,8 +46,6 @@ describe("Context Keys Manager - removeKey", () => {
51
46
  data: { key },
52
47
  });
53
48
 
54
- expect(removeReferenceForKey).not.toHaveBeenCalled();
55
-
56
49
  expect(mockedSessionStorage.removeItem).not.toHaveBeenCalled();
57
50
  expect(mockedLocalStorage.removeItem).not.toHaveBeenCalled();
58
51
  expect(mockedSecureStorage.removeItem).not.toHaveBeenCalled();
@@ -92,10 +85,6 @@ describe("Context Keys Manager - removeKey", () => {
92
85
  secureStorage: mockedSecureStorage,
93
86
  });
94
87
 
95
- const removeReferenceForKey = jest
96
- .spyOn(contextManager, "removeReferenceForKey")
97
- .mockResolvedValueOnce(true);
98
-
99
88
  // run
100
89
  const result = await contextManager.removeKey(key);
101
90
 
@@ -107,8 +96,6 @@ describe("Context Keys Manager - removeKey", () => {
107
96
  data: { key },
108
97
  });
109
98
 
110
- expect(removeReferenceForKey).toHaveBeenCalledWith("key", "namespace");
111
-
112
99
  expect(mockedSessionStorage.removeItem).toHaveBeenCalledWith(
113
100
  "key",
114
101
  "namespace"
@@ -159,10 +146,6 @@ describe("Context Keys Manager - removeKey", () => {
159
146
  secureStorage: mockedSecureStorage,
160
147
  });
161
148
 
162
- const removeReferenceForKey = jest
163
- .spyOn(contextManager, "removeReferenceForKey")
164
- .mockResolvedValueOnce(true);
165
-
166
149
  // run
167
150
  const result = await contextManager.removeKey(key);
168
151
 
@@ -174,8 +157,6 @@ describe("Context Keys Manager - removeKey", () => {
174
157
  data: { key },
175
158
  });
176
159
 
177
- expect(removeReferenceForKey).toHaveBeenCalledWith("key", "namespace");
178
-
179
160
  expect(mockedSessionStorage.removeItem).toHaveBeenCalledWith(
180
161
  "key",
181
162
  "namespace"
@@ -226,10 +207,6 @@ describe("Context Keys Manager - removeKey", () => {
226
207
  secureStorage: mockedSecureStorage,
227
208
  });
228
209
 
229
- const removeReferenceForKey = jest
230
- .spyOn(contextManager, "removeReferenceForKey")
231
- .mockResolvedValueOnce(true);
232
-
233
210
  // run
234
211
  const result = await contextManager.removeKey(key);
235
212
 
@@ -241,8 +218,6 @@ describe("Context Keys Manager - removeKey", () => {
241
218
  data: { key },
242
219
  });
243
220
 
244
- expect(removeReferenceForKey).toHaveBeenCalledWith("key", "namespace");
245
-
246
221
  expect(mockedSessionStorage.removeItem).toHaveBeenCalledWith(
247
222
  "key",
248
223
  "namespace"
@@ -34,10 +34,6 @@ describe("Context Keys Manager - removeKey", () => {
34
34
  secureStorage: mockedSecureStorage,
35
35
  });
36
36
 
37
- const removeReferenceForKey = jest
38
- .spyOn(contextManager, "removeReferenceForKey")
39
- .mockResolvedValueOnce(true);
40
-
41
37
  // run
42
38
  const result = await contextManager.removeKey(key);
43
39
 
@@ -46,8 +42,6 @@ describe("Context Keys Manager - removeKey", () => {
46
42
 
47
43
  expect(mockedLogger.warn).not.toHaveBeenCalled();
48
44
 
49
- expect(removeReferenceForKey).toHaveBeenCalledWith("key", "namespace");
50
-
51
45
  expect(mockedSessionStorage.removeItem).toHaveBeenCalledWith(
52
46
  "key",
53
47
  "namespace"
@@ -38,10 +38,6 @@ describe("Context Keys Manager - setKey", () => {
38
38
  secureStorage: mockedSecureStorage,
39
39
  });
40
40
 
41
- const setReferenceForKey = jest
42
- .spyOn(contextManager, "setReferenceForKey")
43
- .mockResolvedValueOnce(true);
44
-
45
41
  // run
46
42
  const result = await contextManager.setKey({ key, value, storageLevel });
47
43
 
@@ -68,12 +64,6 @@ describe("Context Keys Manager - setKey", () => {
68
64
 
69
65
  expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
70
66
  expect(mockedSecureStorage.setItem).not.toHaveBeenCalled();
71
-
72
- expect(setReferenceForKey).toHaveBeenCalledWith(
73
- "key",
74
- "namespace",
75
- storageLevel
76
- );
77
67
  });
78
68
 
79
69
  it("returns false if failed to saved with storage-level=persisted", async () => {
@@ -112,10 +102,6 @@ describe("Context Keys Manager - setKey", () => {
112
102
  secureStorage: mockedSecureStorage,
113
103
  });
114
104
 
115
- const setReferenceForKey = jest
116
- .spyOn(contextManager, "setReferenceForKey")
117
- .mockResolvedValueOnce(true);
118
-
119
105
  // run
120
106
  const result = await contextManager.setKey({ key, value, storageLevel });
121
107
 
@@ -142,12 +128,6 @@ describe("Context Keys Manager - setKey", () => {
142
128
 
143
129
  expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
144
130
  expect(mockedSecureStorage.setItem).not.toHaveBeenCalled();
145
-
146
- expect(setReferenceForKey).toHaveBeenCalledWith(
147
- "key",
148
- "namespace",
149
- storageLevel
150
- );
151
131
  });
152
132
 
153
133
  it("returns false if failed to saved with storage-level=secure", async () => {
@@ -186,10 +166,6 @@ describe("Context Keys Manager - setKey", () => {
186
166
  secureStorage: mockedSecureStorage,
187
167
  });
188
168
 
189
- const setReferenceForKey = jest
190
- .spyOn(contextManager, "setReferenceForKey")
191
- .mockResolvedValueOnce(true);
192
-
193
169
  // run
194
170
  const result = await contextManager.setKey({ key, value, storageLevel });
195
171
 
@@ -216,12 +192,6 @@ describe("Context Keys Manager - setKey", () => {
216
192
  value,
217
193
  "namespace"
218
194
  );
219
-
220
- expect(setReferenceForKey).toHaveBeenCalledWith(
221
- "key",
222
- "namespace",
223
- storageLevel
224
- );
225
195
  });
226
196
 
227
197
  it("returns false if failed to saved with storage-level=undefined", async () => {
@@ -259,10 +229,6 @@ describe("Context Keys Manager - setKey", () => {
259
229
  secureStorage: mockedSecureStorage,
260
230
  });
261
231
 
262
- const setReferenceForKey = jest
263
- .spyOn(contextManager, "setReferenceForKey")
264
- .mockResolvedValueOnce(true);
265
-
266
232
  // run
267
233
  const result = await contextManager.setKey({ key, value });
268
234
 
@@ -289,11 +255,5 @@ describe("Context Keys Manager - setKey", () => {
289
255
 
290
256
  expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
291
257
  expect(mockedSecureStorage.setItem).not.toHaveBeenCalled();
292
-
293
- expect(setReferenceForKey).toHaveBeenCalledWith(
294
- "key",
295
- "namespace",
296
- StorageLevel.default
297
- );
298
258
  });
299
259
  });