@applicaster/zapp-react-native-utils 15.0.0-alpha.1456157166 → 15.0.0-alpha.1627563808

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 (35) hide show
  1. package/analyticsUtils/AnalyticPlayerListener.ts +5 -2
  2. package/appUtils/accessibilityManager/const.ts +4 -0
  3. package/appUtils/accessibilityManager/hooks.ts +20 -13
  4. package/appUtils/accessibilityManager/index.ts +28 -1
  5. package/appUtils/accessibilityManager/utils.ts +36 -5
  6. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +1 -0
  7. package/appUtils/focusManager/index.ios.ts +18 -1
  8. package/appUtils/focusManagerAux/utils/index.ts +18 -0
  9. package/appUtils/focusManagerAux/utils/utils.ios.ts +35 -0
  10. package/appUtils/platform/platformUtils.ts +116 -17
  11. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +94 -4
  12. package/appUtils/playerManager/OverlayObserver/utils.ts +32 -20
  13. package/appUtils/playerManager/conts.ts +21 -0
  14. package/appUtils/playerManager/player.ts +4 -0
  15. package/appUtils/playerManager/usePlayerState.tsx +14 -2
  16. package/arrayUtils/__tests__/allTruthy.test.ts +24 -0
  17. package/arrayUtils/__tests__/anyThruthy.test.ts +24 -0
  18. package/arrayUtils/index.ts +5 -0
  19. package/cellUtils/index.ts +32 -0
  20. package/manifestUtils/defaultManifestConfigurations/player.js +59 -1
  21. package/manifestUtils/keys.js +21 -0
  22. package/manifestUtils/sharedConfiguration/screenPicker/utils.js +1 -0
  23. package/navigationUtils/index.ts +19 -16
  24. package/package.json +2 -2
  25. package/playerUtils/usePlayerTTS.ts +8 -3
  26. package/reactHooks/feed/useBatchLoading.ts +7 -1
  27. package/reactHooks/feed/usePipesCacheReset.ts +3 -1
  28. package/reactHooks/layout/index.ts +1 -1
  29. package/reactHooks/player/TVSeekControlller/TVSeekController.ts +27 -10
  30. package/utils/__tests__/mapAccum.test.ts +73 -0
  31. package/utils/index.ts +7 -0
  32. package/utils/mapAccum.ts +23 -0
  33. package/zappFrameworkUtils/HookCallback/callbackNavigationAction.ts +98 -31
  34. package/zappFrameworkUtils/HookCallback/hookCallbackManifestExtensions.config.js +25 -9
  35. package/zappFrameworkUtils/HookCallback/useCallbackActions.ts +6 -9
@@ -0,0 +1,23 @@
1
+ import { curry } from "lodash";
2
+
3
+ /**
4
+ * A native reimplementation of Ramda's mapAccum.
5
+ *
6
+ * @template A, B, C
7
+ * @param {(acc: A, value: B) => [A, C]} fn - Function returning [newAcc, mappedValue]
8
+ * @param {A} acc - Initial accumulator
9
+ * @param {B[]} list - List to process
10
+ * @returns {[A, C[]]} - Tuple of [final accumulator, mapped array]
11
+ */
12
+ export const mapAccum = curry((fn, acc, list) => {
13
+ const result = [];
14
+ let currentAcc = acc;
15
+
16
+ for (let i = 0; i < list.length; i++) {
17
+ const [nextAcc, mapped] = fn(currentAcc, list[i]);
18
+ currentAcc = nextAcc;
19
+ result.push(mapped);
20
+ }
21
+
22
+ return [currentAcc, result];
23
+ });
@@ -9,10 +9,23 @@ export enum NavigationCallbackOptions {
9
9
  GO_TO_SCREEN = "go_to_screen",
10
10
  }
11
11
 
12
- export const CALLBACK_NAVIGATION_KEY = "hook_callback_navigation";
12
+ export enum ResultType {
13
+ login = "login",
14
+ logout = "logout",
15
+ }
16
+
17
+ export type CallbackResult = hookCallbackArgs & {
18
+ options?: {
19
+ resultType?: ResultType;
20
+ };
21
+ };
22
+
23
+ export type ScreenResultCallback = (args: CallbackResult) => void | undefined;
24
+
25
+ export const CALLBACK_NAVIGATION_KEY = "completion_action";
13
26
 
14
27
  export const CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY =
15
- "hook_callback_navigation_go_to_screen";
28
+ "completion_action_navigation_go_to_screen";
16
29
 
17
30
  type NavKeys = {
18
31
  action: NavigationCallbackOptions;
@@ -23,7 +36,7 @@ type General = Record<string, unknown>;
23
36
 
24
37
  const LogPrefix = "useCallbackNavigationAction:";
25
38
 
26
- const { log_info, log_verbose } = createLogger({
39
+ const { log_info, log_verbose, log_debug } = createLogger({
27
40
  subsystem: "hook-navigation-callback",
28
41
  });
29
42
 
@@ -35,50 +48,77 @@ const legacyMappingKeys = {
35
48
  "quick-brick-user-account-ui-component": {
36
49
  actionType: "callbackAction",
37
50
  },
51
+ "quick-brick-login-multi-login-providers.login": {
52
+ actionType: "login_completion_action",
53
+ targetScreen: "navigate_to_login_screen",
54
+ },
55
+ "quick-brick-login-multi-login-providers.logout": {
56
+ actionType: "logout_completion_action",
57
+ targetScreen: "navigate_to_logout_screen",
58
+ },
59
+ "quick-brick-storefront": {
60
+ actionType: "purchase_completion_action",
61
+ targetScreen: "navigate_to_screen_after_purchase",
62
+ },
63
+ "zapp_login_plugin_oauth_tv_2_0.login": {
64
+ actionType: "login_completion_action",
65
+ targetScreen: "navigate_to_login_screen",
66
+ },
67
+ "zapp_login_plugin_oauth_tv_2_0.logout": {
68
+ actionType: "logout_completion_action",
69
+ targetScreen: "navigate_to_logout_screen",
70
+ },
38
71
  };
39
72
 
40
- const isNonEmptyString = (v: unknown): v is string =>
41
- typeof v === "string" && v.trim().length > 0;
42
-
43
- const NAV_ACTIONS = Object.values(NavigationCallbackOptions) as string[];
73
+ const NAV_ACTIONS = (
74
+ Object.values(NavigationCallbackOptions) as string[]
75
+ ).filter((value) => value !== NavigationCallbackOptions.DEFAULT);
44
76
 
45
77
  const isNavAction = (v: unknown): v is NavigationCallbackOptions =>
46
- typeof v === "string" && NAV_ACTIONS.includes(v.trim());
78
+ typeof v === "string" && NAV_ACTIONS.includes(v);
47
79
 
48
80
  export const getNavigationKeys = (
49
- item?: ZappUIComponent | ZappRiver
81
+ item?: ZappUIComponent | ZappRiver,
82
+ resultType: ResultType | null = null
50
83
  ): NavKeys => {
51
84
  const general = (item?.general ?? {}) as General;
52
- const pluginIdentifier = item?.type ?? "";
53
- const legacy = legacyMappingKeys[pluginIdentifier] ?? {};
85
+
86
+ const pluginIdentifier = (item as any).identifier ?? item?.type ?? "";
87
+
88
+ const legacy =
89
+ legacyMappingKeys[`${pluginIdentifier}.${resultType}`] ??
90
+ legacyMappingKeys[pluginIdentifier] ??
91
+ {};
92
+
93
+ const actionKey = resultType
94
+ ? `${resultType}_${CALLBACK_NAVIGATION_KEY}`
95
+ : CALLBACK_NAVIGATION_KEY;
54
96
 
55
97
  const rawAction =
56
- (general as General).hook_callback_navigation ??
98
+ (general as General)[actionKey] ??
57
99
  (legacy.actionType ? (general as General)[legacy.actionType] : undefined);
58
100
 
59
- let action: NavigationCallbackOptions | null = null;
60
-
61
- if (isNonEmptyString(rawAction)) {
62
- const trimmed = rawAction.trim();
63
- action = isNavAction(trimmed) ? trimmed : null;
64
- }
101
+ const action: NavigationCallbackOptions | null = isNavAction(rawAction)
102
+ ? rawAction
103
+ : null;
65
104
 
66
105
  if (!action) return null;
67
106
 
68
107
  let targetScreenId: string | null = null;
69
108
 
70
109
  if (action === NavigationCallbackOptions.GO_TO_SCREEN) {
110
+ const screenKey = resultType
111
+ ? `${resultType}_${CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY}`
112
+ : CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY;
113
+
71
114
  const screenId: string | null =
72
- ((general as General)[CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY] as string) ??
115
+ ((general as General)[screenKey] as string) ??
73
116
  (legacy.targetScreen
74
117
  ? ((general as General)[legacy.targetScreen] as string)
75
118
  : undefined);
76
119
 
77
120
  if (screenId) {
78
- const trimmedTargetScreenId = screenId.trim();
79
-
80
- targetScreenId =
81
- trimmedTargetScreenId.length > 0 ? trimmedTargetScreenId : null;
121
+ targetScreenId = screenId.length > 0 ? screenId : null;
82
122
  }
83
123
  }
84
124
 
@@ -87,10 +127,12 @@ export const getNavigationKeys = (
87
127
 
88
128
  export const useCallbackNavigationAction = (
89
129
  item?: ZappUIComponent | ZappRiver
90
- ): hookCallback | undefined => {
130
+ ): ((
131
+ args: CallbackResult,
132
+ hookCallback?: hookCallback
133
+ ) => void | undefined) => {
91
134
  const navigation = useNavigation();
92
135
  const rivers = useRivers();
93
- const enabled = Boolean(item?.general?.[CALLBACK_NAVIGATION_KEY]);
94
136
  const screenContext = useScreenContext();
95
137
 
96
138
  const overrideCallbackFromComponent = useMemo(() => {
@@ -105,11 +147,36 @@ export const useCallbackNavigationAction = (
105
147
  }
106
148
 
107
149
  const callbackAction = useCallback<hookCallback>(
108
- (_args: hookCallbackArgs) => {
109
- const data = getNavigationKeys(item) ?? {
110
- action: NavigationCallbackOptions.DEFAULT,
111
- targetScreenId: null,
112
- };
150
+ (args: CallbackResult, hookCallback: hookCallback = null) => {
151
+ if (!args.success) {
152
+ log_debug(
153
+ `${LogPrefix} callback called with no success, use original callback`
154
+ );
155
+
156
+ hookCallback?.(args);
157
+
158
+ return;
159
+ }
160
+
161
+ if (args.cancelled) {
162
+ log_debug(
163
+ `${LogPrefix} callback called but cancelled, use original callback`
164
+ );
165
+
166
+ hookCallback?.(args);
167
+
168
+ return;
169
+ }
170
+
171
+ const data = getNavigationKeys(item, args.options?.resultType ?? null);
172
+
173
+ if (!data) {
174
+ hookCallback?.(args);
175
+
176
+ return;
177
+ }
178
+
179
+ hookCallback?.({ ...args, success: false, cancelled: true });
113
180
 
114
181
  switch (data.action) {
115
182
  case NavigationCallbackOptions.GO_BACK: {
@@ -160,5 +227,5 @@ export const useCallbackNavigationAction = (
160
227
  [item, navigation, rivers]
161
228
  );
162
229
 
163
- return enabled ? overrideCallbackFromComponent || callbackAction : undefined;
230
+ return overrideCallbackFromComponent || callbackAction;
164
231
  };
@@ -5,20 +5,32 @@ const NavigationCallbackOptions = {
5
5
  GO_TO_SCREEN: "go_to_screen",
6
6
  };
7
7
 
8
- const CALLBACK_NAVIGATION_KEY = "hook_callback_navigation";
8
+ const ResultType = {
9
+ login: "login",
10
+ logout: "logout",
11
+ };
12
+
13
+ const CALLBACK_NAVIGATION_KEY = "completion_action";
9
14
 
10
15
  const CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY =
11
- "hook_callback_navigation_go_to_screen";
16
+ "completion_action_navigation_go_to_screen";
17
+
18
+ const callbackKeyPrefix = (key, prefix, keySeparator = "_") =>
19
+ prefix ? `${prefix}${keySeparator}${key}` : key;
12
20
 
13
- const extendManifestWithHookCallback = () => ({
21
+ const extendManifestWithHookCallback = (prefix = null) => ({
14
22
  group: true,
15
23
  label: "CallBack Navigation",
16
24
  folded: true,
17
25
  fields: [
18
26
  {
19
27
  type: "select",
20
- key: CALLBACK_NAVIGATION_KEY,
21
- label: "Callback Navigation",
28
+ key: callbackKeyPrefix(CALLBACK_NAVIGATION_KEY, prefix),
29
+ label: callbackKeyPrefix(
30
+ "Callback Navigation",
31
+ prefix?.toUpperCase(),
32
+ " "
33
+ ),
22
34
  label_tooltip:
23
35
  "Defines what navigation action should be performed after the callback is called.",
24
36
  options: [
@@ -43,13 +55,17 @@ const extendManifestWithHookCallback = () => ({
43
55
  },
44
56
  {
45
57
  type: "screen_selector",
46
- key: CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY,
47
- label: "Navigate to screen",
58
+ key: callbackKeyPrefix(CALLBACK_NAVIGATION_GO_TO_SCREEN_KEY, prefix),
59
+ label: callbackKeyPrefix(
60
+ "Navigate to screen",
61
+ prefix?.toUpperCase(),
62
+ " "
63
+ ),
48
64
  label_tooltip: "Screen you wish to navigate to after success purchase",
49
65
  rules: "conditional",
50
66
  conditional_fields: [
51
67
  {
52
- key: `general/${CALLBACK_NAVIGATION_KEY}`,
68
+ key: `general/${callbackKeyPrefix(CALLBACK_NAVIGATION_KEY, prefix)}`,
53
69
  condition_value: NavigationCallbackOptions.GO_TO_SCREEN,
54
70
  },
55
71
  ],
@@ -57,4 +73,4 @@ const extendManifestWithHookCallback = () => ({
57
73
  ],
58
74
  });
59
75
 
60
- module.exports = { extendManifestWithHookCallback };
76
+ module.exports = { extendManifestWithHookCallback, ResultType };
@@ -1,5 +1,8 @@
1
1
  import { useCallback } from "react";
2
- import { useCallbackNavigationAction } from "./callbackNavigationAction";
2
+ import {
3
+ CallbackResult,
4
+ useCallbackNavigationAction,
5
+ } from "./callbackNavigationAction";
3
6
 
4
7
  export const useCallbackActions = (
5
8
  item?: ZappUIComponent | ZappRiver,
@@ -8,14 +11,8 @@ export const useCallbackActions = (
8
11
  const navigationAction = useCallbackNavigationAction(item);
9
12
 
10
13
  return useCallback(
11
- async (data: hookCallbackArgs) => {
12
- if (navigationAction && data.success) {
13
- hookCallback?.({ ...data, success: false, cancelled: true });
14
-
15
- navigationAction(data);
16
- } else {
17
- hookCallback?.(data);
18
- }
14
+ async (data: CallbackResult) => {
15
+ navigationAction(data, hookCallback);
19
16
  },
20
17
  [navigationAction, hookCallback]
21
18
  );