@applicaster/zapp-react-native-utils 13.0.0-alpha.6714678893 → 13.0.0-alpha.7019824418

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 (116) hide show
  1. package/README.md +0 -10
  2. package/actionsExecutor/ActionExecutor.ts +16 -9
  3. package/actionsExecutor/ActionExecutorContext.tsx +59 -8
  4. package/alertUtils/alert.ts +148 -0
  5. package/alertUtils/index.ts +1 -148
  6. package/analyticsUtils/AnalyticPlayerListener.ts +18 -1
  7. package/analyticsUtils/__tests__/__snapshots__/analyticsManagerNoModule.test.js.snap +9 -9
  8. package/analyticsUtils/helpers/hooks.ts +1 -1
  9. package/appUtils/HooksManager/Hook.ts +2 -2
  10. package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +7 -7
  11. package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +186 -186
  12. package/appUtils/HooksManager/types.ts +5 -2
  13. package/appUtils/accessibilityManager/index.ts +42 -1
  14. package/appUtils/contextKeysManager/contextResolver.ts +77 -0
  15. package/appUtils/contextKeysManager/index.ts +2 -2
  16. package/appUtils/contextKeysManager/utils/index.ts +2 -1
  17. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +8 -6
  18. package/appUtils/focusManager/__tests__/focusManager.test.js +82 -0
  19. package/appUtils/focusManager/__tests__/index.test.ts +1 -0
  20. package/appUtils/focusManager/index.ts +116 -68
  21. package/appUtils/focusManager/treeDataStructure/Tree/index.js +23 -0
  22. package/appUtils/focusManager/utils/enums.ts +4 -0
  23. package/appUtils/focusManager/utils/index.ts +14 -0
  24. package/appUtils/focusManagerAux/index.ts +2 -2
  25. package/appUtils/focusManagerAux/utils/index.ts +4 -3
  26. package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +2 -2
  27. package/appUtils/keyCodes/__tests__/keyCodes.test.js +1 -1
  28. package/appUtils/keyCodes/keys/keysByPlatform.ts +4 -0
  29. package/appUtils/keyInputHandler/KeyInputHandler.ts +68 -0
  30. package/appUtils/orientationHelper.ts +1 -1
  31. package/appUtils/platform/const.ts +14 -0
  32. package/appUtils/platform/platformUtils.ts +47 -4
  33. package/appUtils/playerManager/player.ts +19 -7
  34. package/appUtils/playerManager/playerNative.ts +3 -2
  35. package/appUtils/playerManager/usePlayerControllerSetup.tsx +3 -3
  36. package/arrayUtils/__tests__/__snapshots__/arrayUtils.test.ts.snap +4 -4
  37. package/equalUtils/__tests__/isEqual/combination.test.ts +263 -0
  38. package/equalUtils/index.ts +49 -30
  39. package/focusManager/FocusManager.ts +11 -1
  40. package/focusManager/index.ts +41 -4
  41. package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +4 -4
  42. package/idleUtils/__tests__/withTimeout$.test.ts +37 -0
  43. package/idleUtils/index.ts +1 -1
  44. package/idleUtils/withTimeout.ts +15 -2
  45. package/logger/const.ts +9 -67
  46. package/manifestUtils/__tests__/createConfig.test.js +16 -16
  47. package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +6 -6
  48. package/navigationUtils/__tests__/itemTypes.test.js +2 -2
  49. package/navigationUtils/__tests__/navigationUtils.test.js +2 -2
  50. package/navigationUtils/index.ts +3 -3
  51. package/package.json +5 -6
  52. package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
  53. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -1
  54. package/reactHooks/cell-click/__tests__/index.test.js +10 -2
  55. package/reactHooks/cell-click/index.ts +7 -1
  56. package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +4 -4
  57. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +10 -11
  58. package/reactHooks/feed/useFeedLoader.tsx +1 -1
  59. package/reactHooks/feed/usePipesCacheReset.ts +5 -5
  60. package/reactHooks/flatList/__tests__/index.test.tsx +30 -21
  61. package/reactHooks/layout/__tests__/index.test.tsx +10 -10
  62. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +14 -28
  63. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +1 -1
  64. package/reactHooks/layout/useDimensions/useDimensions.ts +8 -0
  65. package/reactHooks/navigation/__mocks__/useNavigation.ts +3 -0
  66. package/reactHooks/navigation/__tests__/index.test.tsx +0 -4
  67. package/reactHooks/navigation/index.ts +28 -232
  68. package/reactHooks/navigation/useGetBottomTabBarHeight.ts +12 -0
  69. package/reactHooks/navigation/useGetNavBarTopBorderWidth.ts +14 -0
  70. package/reactHooks/navigation/useGetTabBarHeight.ts +10 -0
  71. package/reactHooks/navigation/useIsScreenActive.ts +17 -0
  72. package/reactHooks/navigation/useNavigationPluginData.ts +15 -0
  73. package/reactHooks/navigation/useNavigationType.ts +15 -0
  74. package/reactHooks/navigation/usePathname.ts +4 -0
  75. package/reactHooks/navigation/useProfilerLogging.ts +15 -0
  76. package/reactHooks/navigation/useRoute.ts +100 -0
  77. package/reactHooks/navigation/useUniqueRouteSuffix.ts +41 -0
  78. package/reactHooks/player/TVSeekControlller/ISeekController.ts +32 -0
  79. package/reactHooks/player/TVSeekControlller/LongPressSeekController.ts +71 -0
  80. package/reactHooks/player/TVSeekControlller/TVSeekController.ts +258 -0
  81. package/reactHooks/player/TVSeekControlller/TapSeekController.ts +53 -0
  82. package/reactHooks/player/__tests__/{useAutoSeek.test.tsx → useAutoSeek._test.tsx} +2 -3
  83. package/reactHooks/player/const.ts +0 -4
  84. package/reactHooks/player/index.ts +0 -6
  85. package/reactHooks/state/useRefWithInitialValue.ts +14 -0
  86. package/reactHooks/state/useStateFromSubscribe.ts +23 -0
  87. package/reactHooks/usePluginConfiguration.ts +1 -1
  88. package/reactHooks/useSubscriberFor.ts +4 -3
  89. package/reactUtils/__tests__/__snapshots__/reactUtilsHelpers.test.js.snap +16 -4
  90. package/reactUtils/__tests__/reactUtils.test.js +1 -37
  91. package/reactUtils/__tests__/reactUtilsHelpers.test.js +72 -71
  92. package/reactUtils/createContext/__tests__/__snapshots__/helpers.test.js.snap +13 -79
  93. package/reactUtils/createContext/__tests__/__snapshots__/{index.test.js.snap → index.test.ts.snap} +2 -2
  94. package/reactUtils/createContext/__tests__/__snapshots__/provider.test.js.snap +3 -28
  95. package/reactUtils/createContext/__tests__/__snapshots__/withConsumer.test.js.snap +3 -4
  96. package/reactUtils/createContext/__tests__/__snapshots__/withProvider.test.js.snap +7 -3
  97. package/reactUtils/createContext/__tests__/helpers.test.js +107 -121
  98. package/reactUtils/createContext/__tests__/{index.test.js → index.test.ts} +2 -2
  99. package/reactUtils/createContext/__tests__/provider.test.js +4 -6
  100. package/reactUtils/createContext/__tests__/withConsumer.test.js +12 -12
  101. package/reactUtils/createContext/__tests__/withProvider.test.js +4 -4
  102. package/reactUtils/createContext/helpers.ts +6 -1
  103. package/reactUtils/createContext/index.ts +11 -25
  104. package/reactUtils/index.ts +0 -11
  105. package/screenState/index.ts +24 -10
  106. package/testUtils/index.tsx +0 -10
  107. package/theme/__mocks__/index.ts +4 -0
  108. package/theme/index.ts +1 -1
  109. package/time/Timer.ts +5 -2
  110. package/types.ts +1 -0
  111. package/zappFrameworkUtils/presentPluginOneTime.ts +2 -3
  112. package/reactHooks/player/useAutoSeek.tsx +0 -87
  113. package/reactHooks/player/useSeek.tsx +0 -66
  114. package/reactHooks/player/useTapSeek.tsx +0 -58
  115. package/reactUtils/createContext/__tests__/index-no-react.test.js +0 -27
  116. /package/reactHooks/player/__tests__/{useTapSeek.test.ts → useTapSeek._test.ts} +0 -0
package/README.md CHANGED
@@ -376,16 +376,6 @@ useEffect(() => {
376
376
  }, []);
377
377
  ```
378
378
 
379
- ### testUtils
380
-
381
- `@applicaster/zapp-react-native-utils/testUtils`
382
-
383
- - `testIDEquals: (testId: any) => boolean | { width: number, height: number }` - Function to be used in tandem with enzyme findWhere
384
-
385
- ```javascript
386
- wrapper.findWhere(testIDEquals("text"));
387
- ```
388
-
389
379
  ### appUtils - contextKeysManager
390
380
 
391
381
  `@applicaster/zapp-react-native-utils/appUtils/contextKeyManager`
@@ -17,9 +17,10 @@ class ActionExecutor {
17
17
 
18
18
  handleAction = async (
19
19
  action: ActionType,
20
- entry: ZappEntry = null
20
+ context?: Record<string, any>
21
21
  ): Promise<ActionResult> => {
22
22
  const handler = this.registeredActions[action.type];
23
+ const entry = context?.entry as ZappEntry;
23
24
 
24
25
  if (!handler) {
25
26
  log_error(
@@ -38,11 +39,11 @@ class ActionExecutor {
38
39
  );
39
40
 
40
41
  try {
41
- return handler(action, entry);
42
+ return handler(action, context);
42
43
  } catch (error) {
43
44
  log_error(
44
45
  `handleAction: error handling action type: ${action.type}, message: ${error.message}`,
45
- { action, entry, error }
46
+ { action, context, error }
46
47
  );
47
48
 
48
49
  throw error;
@@ -51,11 +52,11 @@ class ActionExecutor {
51
52
 
52
53
  handleActions = async (
53
54
  actionTypes: ActionType[],
54
- entry: ZappEntry = null
55
+ context?: Record<string, any>
55
56
  ): Promise<ActionResult> => {
56
57
  for (const action of actionTypes) {
57
58
  // TODO: Handle action result error
58
- const result = await this.handleAction(action, entry);
59
+ const result = await this.handleAction(action, context);
59
60
 
60
61
  if (result === ActionResult.Cancel) {
61
62
  log_info(`handleActions: action: ${action.type} canceled`);
@@ -67,7 +68,10 @@ class ActionExecutor {
67
68
  return ActionResult.Success;
68
69
  };
69
70
 
70
- handleEntryActions = async (entry: ZappEntry): Promise<ActionResult> => {
71
+ handleEntryActions = async (
72
+ entry: ZappEntry,
73
+ context?: Record<string, any>
74
+ ): Promise<ActionResult> => {
71
75
  const tapActions = entry.extensions?.tap_actions?.actions;
72
76
 
73
77
  if (!tapActions) {
@@ -77,7 +81,7 @@ class ActionExecutor {
77
81
  if (!Array.isArray(tapActions)) {
78
82
  log_error(
79
83
  `handleEntryActions: tapActions is not an array for id: ${entry.id} title: ${entry.title}`,
80
- { entry }
84
+ { context, entry }
81
85
  );
82
86
 
83
87
  return;
@@ -87,7 +91,7 @@ class ActionExecutor {
87
91
  return;
88
92
  }
89
93
 
90
- await this.handleActions(tapActions, entry);
94
+ await this.handleActions(tapActions, { ...context, entry });
91
95
  };
92
96
 
93
97
  unregisterAction = (actionType: string) => {
@@ -96,7 +100,10 @@ class ActionExecutor {
96
100
 
97
101
  registerAction = (
98
102
  type: string,
99
- handler: (action: ActionType, entry?: ZappEntry) => Promise<ActionResult>
103
+ handler: (
104
+ action: ActionType,
105
+ context?: Record<string, any>
106
+ ) => Promise<ActionResult>
100
107
  ) => {
101
108
  if (this.registeredActions[type]) {
102
109
  log_error(`registerAction: action type: ${type} already registered`);
@@ -13,6 +13,12 @@ import { createCloudEvent, sendCloudEvent } from "../cloudEventsUtils";
13
13
  import { createLogger } from "../logger";
14
14
  import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageMultiSelectProvider";
15
15
  import { ACTIVE_LAYOUT_ID_STORAGE_KEY } from "@applicaster/quick-brick-core/App/remoteContextReloader/consts";
16
+ import { appStore } from "@applicaster/zapp-react-native-redux/AppStore";
17
+ import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
18
+ import {
19
+ EntryResolver,
20
+ resolveObjectValues,
21
+ } from "../appUtils/contextKeysManager/contextResolver";
16
22
 
17
23
  const { log_error, log_info } = createLogger({
18
24
  subsystem: "ActionExecutorContext",
@@ -22,15 +28,24 @@ const { log_error, log_info } = createLogger({
22
28
  type ActionExecutorContextType = {
23
29
  registerAction: (
24
30
  type: string,
25
- handler: (action: ActionType, entry: ZappEntry) => Promise<ActionResult>
31
+ handler: (
32
+ action: ActionType,
33
+ context?: Record<string, any>
34
+ ) => Promise<ActionResult>
26
35
  ) => void;
27
36
  unregisterAction: (type: string) => void;
28
- handleAction: (action: ActionType, entry: ZappEntry) => Promise<ActionResult>;
37
+ handleAction: (
38
+ action: ActionType,
39
+ context?: Record<string, any>
40
+ ) => Promise<ActionResult>;
29
41
  handleActions: (
30
42
  actions: ActionType[],
31
- entry: ZappEntry
43
+ context: Record<string, any>
44
+ ) => Promise<ActionResult>;
45
+ handleEntryActions: (
46
+ entry: ZappEntry,
47
+ context?: Record<string, any>
32
48
  ) => Promise<ActionResult>;
33
- handleEntryActions: (entry: ZappEntry) => Promise<ActionResult>;
34
49
  };
35
50
  type Props = {
36
51
  children: React.ReactNode;
@@ -45,6 +60,31 @@ const prepareDefaultActions = (actionExecutor) => {
45
60
  return ActionResult.Success;
46
61
  });
47
62
 
63
+ actionExecutor.registerAction(
64
+ "refreshComponent",
65
+ async (_action, context) => {
66
+ const dispatch = appStore.getDispatch();
67
+
68
+ log_info("handleAction: refreshComponent event");
69
+
70
+ const dataSource = context?.component?.data?.source;
71
+
72
+ // TODO: Later we can pass component ids to do refresh instead of current one
73
+ // TODO: In theory we should wait callback to complete, before completing the action, but now it's not needed
74
+ // TODO: handle focused item removal
75
+ dispatch(
76
+ loadPipesData(dataSource, {
77
+ silentRefresh: false,
78
+ clearCache: true,
79
+ callback: (_data) => {},
80
+ riverId: context?.screenData?.id,
81
+ })
82
+ );
83
+
84
+ return ActionResult.Success;
85
+ }
86
+ );
87
+
48
88
  actionExecutor.registerAction("switchLayout", async (action) => {
49
89
  log_info("handleAction: switchLayout event");
50
90
 
@@ -80,13 +120,21 @@ const prepareDefaultActions = (actionExecutor) => {
80
120
  return confirmationPromise;
81
121
  });
82
122
 
83
- actionExecutor.registerAction("sendCloudEvent", async (action, entry) => {
123
+ actionExecutor.registerAction("sendCloudEvent", async (action, context) => {
84
124
  try {
85
125
  const options = action.options;
86
126
 
127
+ const entry = context?.entry || {};
128
+ const entryResolver = new EntryResolver(entry);
129
+
130
+ const data =
131
+ options?.data && options.inflateData
132
+ ? await resolveObjectValues(options.data, { entry: entryResolver })
133
+ : options?.data || entry;
134
+
87
135
  const cloudEvent = await createCloudEvent({
88
136
  type: options.type || "com.applicaster.selector.action.v1",
89
- data: options.data || entry,
137
+ data,
90
138
  subject: options.subject || entry?.id,
91
139
  });
92
140
 
@@ -117,9 +165,12 @@ const prepareDefaultActions = (actionExecutor) => {
117
165
 
118
166
  actionExecutor.registerAction(
119
167
  "localStorageToggleFlag",
120
- async (action: ActionType, entry?: ZappEntry): Promise<ActionResult> => {
168
+ async (
169
+ action: ActionType,
170
+ context?: Record<string, any>
171
+ ): Promise<ActionResult> => {
121
172
  const keyNamespace = action.options?.key;
122
- const tag = entry?.extensions?.tag;
173
+ const tag = context?.entry?.extensions?.tag;
123
174
 
124
175
  if (keyNamespace && tag) {
125
176
  const multiSelectProvider =
@@ -0,0 +1,148 @@
1
+ import { Alert } from "react-native";
2
+ import { isWeb } from "@applicaster/zapp-react-native-utils/reactUtils";
3
+ import { confirmationDialogStore } from "@applicaster/zapp-react-native-ui-components/Contexts/ConfirmDialogState";
4
+
5
+ // #region "Alert Dialog"
6
+
7
+ const globalAny: any = global;
8
+
9
+ const showWebAlertDialog = ({ message, completion }: AlertWebDialog) => {
10
+ globalAny?.alert?.(message);
11
+ completion?.();
12
+ };
13
+
14
+ const showNativeAlertDialog = ({
15
+ title,
16
+ message,
17
+ okButtonText,
18
+ completion,
19
+ }: AlertDialogType) => {
20
+ Alert.alert(title, message, [
21
+ {
22
+ text: okButtonText,
23
+ onPress: completion,
24
+ },
25
+ ]);
26
+ };
27
+
28
+ export const showAlertDialog = ({
29
+ title,
30
+ message,
31
+ okButtonText,
32
+ completion,
33
+ }: AlertDialogType) => {
34
+ if (isWeb()) {
35
+ showWebAlertDialog({ message, completion });
36
+ } else {
37
+ showNativeAlertDialog({
38
+ title,
39
+ message,
40
+ okButtonText,
41
+ completion,
42
+ });
43
+ }
44
+ };
45
+
46
+ // #endregion "Alert Dialog"
47
+
48
+ // #region "Confirmation Dialog"
49
+
50
+ const showWebDialog = ({
51
+ message,
52
+ confirmCompletion,
53
+ cancelCompletion,
54
+ }: WebConfirmationDialog) => {
55
+ const isConfirmed = globalAny?.confirm?.(message);
56
+
57
+ if (isConfirmed) {
58
+ confirmCompletion?.();
59
+ } else {
60
+ cancelCompletion?.();
61
+ }
62
+ };
63
+
64
+ const showNativeDialog = ({
65
+ title,
66
+ message,
67
+ okButtonText,
68
+ cancelButtonText,
69
+ confirmCompletion,
70
+ cancelCompletion,
71
+ }: ConfirmationDialog) => {
72
+ Alert.alert(title, message, [
73
+ {
74
+ text: cancelButtonText,
75
+ onPress: cancelCompletion,
76
+ },
77
+ {
78
+ text: okButtonText,
79
+ style: "destructive",
80
+ onPress: confirmCompletion,
81
+ },
82
+ ]);
83
+ };
84
+
85
+ const handleCustomDialog = (data) => {
86
+ const {
87
+ showDialog,
88
+ hideDialog,
89
+ setConfirmAction,
90
+ setCancelAction,
91
+ setMessages,
92
+ } = confirmationDialogStore.getState();
93
+
94
+ setMessages(data.messages);
95
+
96
+ if (data?.cancelCompletion) {
97
+ setCancelAction(() => {
98
+ data.cancelCompletion();
99
+ hideDialog();
100
+ });
101
+ }
102
+
103
+ if (data?.confirmCompletion) {
104
+ setConfirmAction(() => {
105
+ data.confirmCompletion();
106
+ hideDialog();
107
+ });
108
+ }
109
+
110
+ showDialog();
111
+ };
112
+
113
+ export const showConfirmationDialog = ({
114
+ title,
115
+ message,
116
+ okButtonText,
117
+ cancelButtonText,
118
+ confirmCompletion,
119
+ cancelCompletion,
120
+ }: CustomConfirmationDialog): void => {
121
+ if (isWeb()) {
122
+ if (cancelCompletion) {
123
+ handleCustomDialog({
124
+ messages: {
125
+ title,
126
+ message,
127
+ okButtonText,
128
+ cancelButtonText,
129
+ },
130
+ confirmCompletion,
131
+ cancelCompletion,
132
+ });
133
+ } else {
134
+ showWebDialog({ message, confirmCompletion, cancelCompletion });
135
+ }
136
+ } else {
137
+ showNativeDialog({
138
+ title,
139
+ message,
140
+ okButtonText,
141
+ cancelButtonText,
142
+ confirmCompletion,
143
+ cancelCompletion,
144
+ });
145
+ }
146
+ };
147
+
148
+ // #endregion "Confirmation Dialog"
@@ -1,148 +1 @@
1
- import { Alert } from "react-native";
2
- import { isWeb } from "@applicaster/zapp-react-native-utils/reactUtils";
3
- import { confirmationDialogStore } from "@applicaster/zapp-react-native-ui-components/Contexts/ConfirmDialogState";
4
-
5
- // #region "Alert Dialog"
6
-
7
- const globalAny: any = global;
8
-
9
- const showWebAlertDialog = ({ message, completion }: AlertWebDialog) => {
10
- globalAny?.alert?.(message);
11
- completion?.();
12
- };
13
-
14
- const showNativeAlertDialog = ({
15
- title,
16
- message,
17
- okButtonText,
18
- completion,
19
- }: AlertDialogType) => {
20
- Alert.alert(title, message, [
21
- {
22
- text: okButtonText,
23
- onPress: completion,
24
- },
25
- ]);
26
- };
27
-
28
- export const showAlertDialog = ({
29
- title,
30
- message,
31
- okButtonText,
32
- completion,
33
- }: AlertDialogType) => {
34
- if (isWeb()) {
35
- showWebAlertDialog({ message, completion });
36
- } else {
37
- showNativeAlertDialog({
38
- title,
39
- message,
40
- okButtonText,
41
- completion,
42
- });
43
- }
44
- };
45
-
46
- // #endregion "Alert Dialog"
47
-
48
- // #region "Confirmation Dialog"
49
-
50
- const showWebDialog = ({
51
- message,
52
- confirmCompletion,
53
- cancelCompletion,
54
- }: WebConfirmationDialog) => {
55
- const isConfirmed = globalAny?.confirm?.(message);
56
-
57
- if (isConfirmed) {
58
- confirmCompletion?.();
59
- } else {
60
- cancelCompletion?.();
61
- }
62
- };
63
-
64
- const showNativeDialog = ({
65
- title,
66
- message,
67
- okButtonText,
68
- cancelButtonText,
69
- confirmCompletion,
70
- cancelCompletion,
71
- }: ConfirmationDialog) => {
72
- Alert.alert(title, message, [
73
- {
74
- text: cancelButtonText,
75
- onPress: cancelCompletion,
76
- },
77
- {
78
- text: okButtonText,
79
- style: "destructive",
80
- onPress: confirmCompletion,
81
- },
82
- ]);
83
- };
84
-
85
- const handleCustomDialog = (data) => {
86
- const {
87
- showDialog,
88
- hideDialog,
89
- setConfirmAction,
90
- setCancelAction,
91
- setMessages,
92
- } = confirmationDialogStore.getState();
93
-
94
- setMessages(data.messages);
95
-
96
- if (data?.cancelCompletion) {
97
- setCancelAction(() => {
98
- data.cancelCompletion();
99
- hideDialog();
100
- });
101
- }
102
-
103
- if (data?.confirmCompletion) {
104
- setConfirmAction(() => {
105
- data.confirmCompletion();
106
- hideDialog();
107
- });
108
- }
109
-
110
- showDialog();
111
- };
112
-
113
- export const showConfirmationDialog = ({
114
- title,
115
- message,
116
- okButtonText,
117
- cancelButtonText,
118
- confirmCompletion,
119
- cancelCompletion,
120
- }: CustomConfirmationDialog): void => {
121
- if (isWeb()) {
122
- if (cancelCompletion) {
123
- handleCustomDialog({
124
- messages: {
125
- title,
126
- message,
127
- okButtonText,
128
- cancelButtonText,
129
- },
130
- confirmCompletion,
131
- cancelCompletion,
132
- });
133
- } else {
134
- showWebDialog({ message, confirmCompletion, cancelCompletion });
135
- }
136
- } else {
137
- showNativeDialog({
138
- title,
139
- message,
140
- okButtonText,
141
- cancelButtonText,
142
- confirmCompletion,
143
- cancelCompletion,
144
- });
145
- }
146
- };
147
-
148
- // #endregion "Confirmation Dialog"
1
+ export { showAlertDialog, showConfirmationDialog } from "./alert";
@@ -14,7 +14,7 @@ export class AnalyticPlayerListener
14
14
  static analyticsListenerID = "analytics-listener";
15
15
  private analyticsTracker: PlayerAnalyticsTracker;
16
16
  private player: Player;
17
-
17
+ private isSeeking: boolean = false;
18
18
  private onVideoLoadCalled; // android only
19
19
 
20
20
  constructor(props: Props) {
@@ -40,10 +40,27 @@ export class AnalyticPlayerListener
40
40
  };
41
41
 
42
42
  onPlayerPause = (event) => {
43
+ if (this.player?.seekController?.isSeeking()) {
44
+ this.isSeeking = true;
45
+
46
+ return;
47
+ }
48
+
43
49
  this.handleAnalyticEvent(PLAYBACK_EVENT.pause, event);
44
50
  };
45
51
 
46
52
  onPlayerResume = (event) => {
53
+ if (this.player?.seekController?.isSeeking()) {
54
+ return;
55
+ }
56
+
57
+ if (this.isSeeking) {
58
+ // Fallback due to player resume event been async and arriving with delays
59
+ this.isSeeking = false;
60
+
61
+ return;
62
+ }
63
+
47
64
  this.handleAnalyticEvent(PLAYBACK_EVENT.play, event);
48
65
  };
49
66
 
@@ -1,24 +1,24 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`AnalyticsManager - with undefined Native Module doesn't crash when calling the methods 1`] = `
4
- Array [
5
- Array [
6
- Object {
4
+ [
5
+ [
6
+ {
7
7
  "message": "Analytics Bridge is missing - no event will be sent",
8
8
  },
9
9
  ],
10
- Array [
11
- Object {
10
+ [
11
+ {
12
12
  "message": "Analytics Bridge is missing - no event will be sent",
13
13
  },
14
14
  ],
15
- Array [
16
- Object {
15
+ [
16
+ {
17
17
  "message": "Analytics Bridge is missing - no event will be sent",
18
18
  },
19
19
  ],
20
- Array [
21
- Object {
20
+ [
21
+ {
22
22
  "message": "Analytics Bridge is missing - no event will be sent",
23
23
  },
24
24
  ],
@@ -2,7 +2,7 @@ import * as R from "ramda";
2
2
  import * as React from "react";
3
3
 
4
4
  import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
5
- import { useScreenContext } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
5
+ import { useScreenContext } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
6
6
 
7
7
  import { getAnalyticsScreenPropertiesFromScreenData } from "@applicaster/zapp-react-native-utils/analyticsUtils/currentScreenProperities";
8
8
  import { useAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils";
@@ -16,7 +16,7 @@ const BASE_HOOK_PROPERTIES = ["screen_id", "identifier", "weight"];
16
16
  * @returns {number} index
17
17
  */
18
18
  const hookState: (
19
- arg0: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS]
19
+ arg0: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS]
20
20
  ) => number = R.indexOf(R.__, R.values(HOOKS_EVENTS));
21
21
 
22
22
  /**
@@ -62,7 +62,7 @@ export class Hook implements HookInterface {
62
62
  * @param {Array<Any>} args variadic arguments to invoke the handler with
63
63
  */
64
64
  setStateAndNotify(
65
- event: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS],
65
+ event: (typeof HOOKS_EVENTS)[keyof typeof HOOKS_EVENTS],
66
66
  ...args
67
67
  ) {
68
68
  this.state = hookState(event);
@@ -2,27 +2,27 @@
2
2
 
3
3
  exports[`Hook Hook Properties has all the hook properties 1`] = `
4
4
  Hook {
5
- "advertising": Object {},
6
- "general": Object {
5
+ "advertising": {},
6
+ "general": {
7
7
  "allow_screen_plugin_presentation": true,
8
8
  "is_flow_blocker": true,
9
9
  },
10
- "hooks": Array [],
10
+ "hooks": [],
11
11
  "id": "A1234",
12
12
  "identifier": "hook_screen",
13
13
  "lastHook": true,
14
- "manager": Object {
14
+ "manager": {
15
15
  "executeHook": [MockFunction],
16
16
  "presentScreenHook": [MockFunction],
17
- "subscriber": Object {
17
+ "subscriber": {
18
18
  "invokeHandler": [MockFunction],
19
19
  },
20
20
  },
21
21
  "name": "Hook Screen",
22
- "navigations": Array [],
22
+ "navigations": [],
23
23
  "screen_id": "A1234",
24
24
  "state": 0,
25
- "styles": Object {},
25
+ "styles": {},
26
26
  "type": "hook_screen",
27
27
  "weight": 1,
28
28
  }