@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.
- package/actionUtils/index.ts +3 -1
- package/actionsExecutor/ActionExecutor.ts +50 -3
- package/actionsExecutor/ActionExecutorContext.tsx +99 -17
- package/actionsExecutor/__tests__/ActionExecutor.test.ts +71 -0
- package/actionsExecutor/__tests__/StorageActions.test.ts +98 -0
- package/actionsExecutor/__tests__/feedDecorator.test.ts +91 -0
- package/actionsExecutor/__tests__/screenToggleFlag.test.ts +90 -0
- package/actionsExecutor/actions/__tests__/dismissBottomSheet.test.ts +25 -0
- package/actionsExecutor/actions/__tests__/goBack.test.ts +62 -0
- package/actionsExecutor/actions/__tests__/goHome.test.ts +19 -0
- package/actionsExecutor/actions/__tests__/loadItemsFromSource.test.ts +88 -0
- package/actionsExecutor/actions/__tests__/navigateToScreen.test.ts +267 -0
- package/actionsExecutor/actions/__tests__/openBottomSheet.customContent.test.ts +100 -0
- package/actionsExecutor/actions/__tests__/openBottomSheet.inlineItems.test.ts +372 -0
- package/actionsExecutor/actions/__tests__/presentScreen.test.ts +127 -0
- package/actionsExecutor/actions/__tests__/showAlert.test.ts +49 -0
- package/actionsExecutor/actions/__tests__/showToast.test.ts +88 -0
- package/actionsExecutor/actions/dismissBottomSheet.ts +23 -0
- package/actionsExecutor/actions/goBack.ts +60 -0
- package/actionsExecutor/actions/goHome.ts +31 -0
- package/actionsExecutor/actions/index.ts +12 -0
- package/actionsExecutor/actions/navigateToScreen.ts +43 -45
- package/actionsExecutor/actions/openBottomSheet.ts +340 -0
- package/actionsExecutor/actions/presentScreen.ts +78 -0
- package/actionsExecutor/actions/refreshComponent.ts +6 -0
- package/actionsExecutor/actions/screenToggleFlag.ts +1 -3
- package/actionsExecutor/actions/sendCloudEvent.ts +6 -1
- package/actionsExecutor/actions/showAlert.ts +51 -0
- package/actionsExecutor/actions/showToast.ts +64 -8
- package/actionsExecutor/consts.ts +27 -0
- package/actionsExecutor/feedDecorator.ts +12 -6
- package/analyticsUtils/PlayerAnalyticsManager.ts +1 -1
- package/appUtils/HooksManager/index.ts +9 -0
- package/appUtils/contextKeysManager/__tests__/getKey/failure.test.ts +1 -22
- package/appUtils/contextKeysManager/__tests__/getKey/success/fullSearch.test.ts +1 -25
- package/appUtils/contextKeysManager/__tests__/getKey/success/searchInSecure.test.ts +1 -7
- package/appUtils/contextKeysManager/__tests__/removeKey/failure.test.ts +0 -25
- package/appUtils/contextKeysManager/__tests__/removeKey/success.test.ts +0 -6
- package/appUtils/contextKeysManager/__tests__/setKey/failure/failedToSaveInStorage.test.ts +0 -40
- package/appUtils/contextKeysManager/__tests__/setKey/{success/saveItemAndReference.test.ts → success.test.ts} +2 -42
- package/appUtils/contextKeysManager/index.ts +28 -129
- package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +142 -59
- package/appUtils/playerManager/OverlayObserver/__tests__/getUpcomingQueue.test.ts +67 -0
- package/appUtils/playerManager/OverlayObserver/__tests__/liveContent.test.ts +205 -0
- package/appUtils/playerManager/OverlayObserver/__tests__/utils.test.ts +56 -0
- package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.android.tv.ts +4 -0
- package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ios.tv.ts +4 -0
- package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ts +24 -0
- package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.web.ts +4 -0
- package/appUtils/playerManager/OverlayObserver/utils.ts +51 -20
- package/appUtils/playerManager/__tests__/playerContent.test.ts +403 -0
- package/appUtils/playerManager/__tests__/playerDiagnostics.test.ts +62 -0
- package/appUtils/playerManager/__tests__/playerFactory.test.ts +1 -1
- package/appUtils/playerManager/__tests__/playerNative.test.ts +114 -0
- package/appUtils/playerManager/__tests__/playerNativeCommand.test.ts +62 -0
- package/appUtils/playerManager/__tests__/playerToolbox.test.ts +281 -0
- package/appUtils/playerManager/__tests__/usePlayerContent.test.tsx +64 -0
- package/appUtils/playerManager/__tests__/usePlayerControllerSetup.test.tsx +62 -0
- package/appUtils/playerManager/{conts.ts → const.ts} +33 -0
- package/appUtils/playerManager/index.ts +8 -1
- package/appUtils/playerManager/player.ts +140 -3
- package/appUtils/playerManager/playerFactory.ts +1 -1
- package/appUtils/playerManager/playerNative.ts +28 -4
- package/appUtils/playerManager/playerNativeCommand.ts +3 -6
- package/appUtils/playerManager/playerToolbox.ts +196 -0
- package/appUtils/playerManager/usePlayerContent.tsx +43 -0
- package/appUtils/playerManager/usePlayerControllerSetup.tsx +7 -1
- package/appUtils/playerManager/userLanguagePreference.ts +1 -1
- package/arrayUtils/__tests__/reorderByIds.test.ts +63 -0
- package/arrayUtils/index.ts +62 -0
- package/cellUtils/__tests__/getButtonsEnabled.test.ts +28 -0
- package/cellUtils/__tests__/getCellNavigationEnabled.test.ts +36 -0
- package/cellUtils/__tests__/getIsCellNavigationEnabled.test.ts +35 -0
- package/cellUtils/__tests__/isCellNavigationEnabled.test.ts +21 -0
- package/cellUtils/index.ts +70 -3
- package/configurationUtils/__tests__/manifestKeyParser.test.ts +21 -0
- package/configurationUtils/__tests__/modalBlocksParser.test.ts +403 -0
- package/configurationUtils/manifestKeyParser.ts +50 -10
- package/configurationUtils/modalBlocksParser.ts +252 -0
- package/entryActions/__tests__/buildEntryActions.test.ts +235 -0
- package/entryActions/aliasPresentation.ts +108 -0
- package/entryActions/buildEntryActions.ts +167 -0
- package/entryActions/index.ts +15 -0
- package/entryActions/types.ts +39 -0
- package/focusManager/FocusManager.ts +26 -0
- package/focusManager/__tests__/FocusManager.test.ts +9 -0
- package/localizationUtils/index.ts +12 -6
- package/logger/__tests__/xrayToolbox.test.ts +69 -0
- package/logger/xrayToolbox.ts +67 -0
- package/manifestUtils/__tests__/player.audioControls.test.js +158 -0
- package/manifestUtils/_internals/index.js +8 -3
- package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
- package/manifestUtils/defaultManifestConfigurations/player.js +338 -1
- package/manifestUtils/index.js +3 -0
- package/manifestUtils/keys.js +7 -2
- package/manifestUtils/mobileAction/container/__tests__/mobileActionButtonsContainer.test.js +21 -0
- package/manifestUtils/mobileAction/groups/__tests__/buildMobileActionButtonGroups.test.js +1 -1
- package/manifestUtils/mobileAction/groups/defaults.js +2 -1
- package/manifestUtils/modalBlocks.js +304 -0
- package/modalState/ContentViewModel.ts +113 -0
- package/modalState/EditableCollection.ts +17 -0
- package/modalState/EditableCollectionRegistry.ts +51 -0
- package/modalState/ModalOrchestrator.ts +213 -0
- package/modalState/RemoteEditableCollection.ts +235 -0
- package/modalState/__tests__/ContentViewModel.editable.test.ts +69 -0
- package/modalState/__tests__/ContentViewModel.test.ts +165 -0
- package/modalState/__tests__/EditableCollectionRegistry.test.ts +112 -0
- package/modalState/__tests__/ModalOrchestrator.phase3.test.ts +86 -0
- package/modalState/__tests__/RemoteEditableCollection.test.ts +415 -0
- package/modalState/__tests__/index.test.ts +30 -1
- package/modalState/__tests__/useBottomSheetContent.test.ts +349 -0
- package/modalState/__tests__/useModalStoreState.test.ts +142 -0
- package/modalState/index.ts +37 -83
- package/modalState/store.ts +109 -0
- package/modalState/types.ts +173 -0
- package/modalState/useBottomSheetContent.ts +109 -0
- package/navigationUtils/xrayNavigator.ts +12 -0
- package/package.json +3 -2
- package/playerUtils/__tests__/contentDataKeys.test.ts +297 -0
- package/playerUtils/__tests__/resolvePlayerActions.test.ts +138 -0
- package/playerUtils/__tests__/resolvePlayerTitleSubtitle.test.ts +180 -0
- package/playerUtils/contentDataKeys.ts +134 -0
- package/playerUtils/index.ts +37 -16
- package/playerUtils/isAudioItem.ts +26 -0
- package/playerUtils/resolvePlayerActions.ts +71 -0
- package/playerUtils/resolvePlayerTitleSubtitle.ts +76 -0
- package/pluginUtils/__tests__/pluginUtils.test.js +32 -0
- package/pluginUtils/index.ts +29 -0
- package/quickBrickAssets/__tests__/index.test.ts +18 -0
- package/quickBrickAssets/index.ts +35 -0
- package/reactHooks/__tests__/getPluginConfiguration.test.ts +82 -0
- package/reactHooks/actions/index.ts +74 -3
- package/reactHooks/cell-click/__tests__/index.test.js +64 -0
- package/reactHooks/cell-click/index.ts +21 -14
- package/reactHooks/connection/index.tsx +8 -5
- package/reactHooks/feed/__tests__/feedInvalidation.test.tsx +338 -0
- package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +8 -2
- package/reactHooks/feed/__tests__/useMarkPipesDataStale.test.tsx +243 -0
- package/reactHooks/feed/useFeedLoader.tsx +28 -1
- package/reactHooks/feed/useLoadPipesDataDispatch.ts +12 -11
- package/reactHooks/feed/useMarkPipesDataStale.ts +68 -23
- package/reactHooks/index.ts +2 -0
- package/reactHooks/layout/index.ts +1 -1
- package/reactHooks/navigation/__tests__/index.test.tsx +176 -1
- package/reactHooks/navigation/__tests__/usePresentScreen.test.ts +154 -0
- package/reactHooks/navigation/index.ts +2 -0
- package/reactHooks/navigation/usePresentScreen.ts +157 -0
- package/reactHooks/navigation/useRoute.ts +22 -5
- package/reactHooks/usePluginConfiguration.ts +88 -47
- package/reactHooks/utils/__tests__/index.test.js +22 -2
- package/reactHooks/utils/index.ts +11 -1
- package/riverComponetsMeasurementProvider/index.tsx +3 -1
- package/uiActionsRegistrator/__tests__/resolveActionIdentifiers.test.ts +93 -0
- package/uiActionsRegistrator/__tests__/subscribe.test.ts +133 -0
- package/uiActionsRegistrator/__tests__/usableActionItems.test.ts +52 -0
- package/uiActionsRegistrator/index.ts +25 -203
- package/uiActionsRegistrator/registry.ts +351 -0
- package/uiActionsRegistrator/resolveActionIdentifiers.ts +100 -0
- package/uiActionsRegistrator/usableActionItems.ts +66 -0
- package/zappFrameworkUtils/__tests__/localStorageHelper.test.ts +146 -0
- package/zappFrameworkUtils/localStorageHelper.ts +19 -15
- package/appUtils/contextKeysManager/__tests__/getKey/success/byReference.test.ts +0 -56
- package/appUtils/contextKeysManager/__tests__/getKeyByReference/failure.test.ts +0 -265
- package/appUtils/contextKeysManager/__tests__/getKeyByReference/success.test.ts +0 -303
- package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/failure.test.ts +0 -82
- package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/success.test.ts +0 -41
- package/appUtils/contextKeysManager/__tests__/setKey/success/saveItemButNotReference.test.ts +0 -208
- package/appUtils/contextKeysManager/__tests__/setReferenceForKey/failure.test.ts +0 -93
- package/appUtils/contextKeysManager/__tests__/setReferenceForKey/success.test.ts +0 -45
- package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +0 -56
- package/playerUtils/__tests__/getPlayerActionButtons.test.ts +0 -54
- package/playerUtils/getPlayerActionButtons.ts +0 -17
- /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
|
|
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
|
-
*
|
|
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
|
|
11
|
-
message
|
|
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:
|
|
23
|
-
message:
|
|
24
|
-
extraMessage:
|
|
25
|
-
style:
|
|
26
|
-
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
|
|
163
|
-
|
|
164
|
-
|
|
168
|
+
const selectMode =
|
|
169
|
+
feed.extensions?.preference_editor_options?.select_mode ||
|
|
170
|
+
feed.extensions?.behavior?.select_mode;
|
|
165
171
|
|
|
166
|
-
if (
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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
|
});
|