@applicaster/zapp-react-native-utils 13.0.0-alpha.4750811552 → 13.0.0-alpha.5281161050

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 (53) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +15 -1
  2. package/appUtils/HooksManager/{Hook.js → Hook.ts} +35 -23
  3. package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +4 -2
  4. package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +693 -0
  5. package/appUtils/HooksManager/__tests__/hook.test.js +196 -184
  6. package/appUtils/HooksManager/__tests__/hooksManager.test.js +96 -99
  7. package/appUtils/HooksManager/{constants.js → constants.ts} +1 -1
  8. package/appUtils/HooksManager/{index.js → index.ts} +121 -112
  9. package/appUtils/HooksManager/types.ts +116 -0
  10. package/appUtils/RiverFocusManager/index.js +17 -12
  11. package/appUtils/focusManager/treeDataStructure/Tree/index.js +2 -3
  12. package/appUtils/focusManager/treeDataStructure/Utils/index.js +1 -3
  13. package/appUtils/{index.js → index.ts} +1 -1
  14. package/appUtils/keyCodes/__tests__/keyCodes.test.js +3 -3
  15. package/appUtils/keyCodes/{index.js → index.ts} +2 -0
  16. package/appUtils/keyCodes/keys/index.ts +3 -0
  17. package/appUtils/keyCodes/{keys.android.js → keys/keyEventMapper.ts} +0 -19
  18. package/appUtils/keyCodes/keys/keys.android.ts +18 -0
  19. package/appUtils/keyCodes/keys/keys.ios.ts +25 -0
  20. package/appUtils/keyCodes/keys/keys.ts +15 -0
  21. package/appUtils/keyCodes/{keysByPlatform.js → keys/keysByPlatform.ts} +0 -4
  22. package/appUtils/keyCodes/keysByPlatform.ts +8 -0
  23. package/appUtils/platform/platformUtils.ts +0 -14
  24. package/appUtils/playerManager/player.ts +5 -17
  25. package/appUtils/playerManager/playerNative.ts +1 -2
  26. package/appUtils/playerManager/usePlayerControllerSetup.tsx +3 -3
  27. package/domUtils/{cookieManager.js → cookieManager.ts} +1 -2
  28. package/functionUtils/index.ts +15 -11
  29. package/modalState/index.ts +1 -5
  30. package/navigationUtils/index.ts +14 -5
  31. package/numberUtils/index.ts +7 -5
  32. package/package.json +2 -2
  33. package/reactHooks/navigation/index.ts +7 -4
  34. package/reactHooks/player/__tests__/useAutoSeek.test.tsx +116 -0
  35. package/reactHooks/player/__tests__/useTapSeek.test.ts +94 -0
  36. package/reactHooks/player/const.ts +4 -0
  37. package/reactHooks/player/index.ts +6 -0
  38. package/reactHooks/player/useAutoSeek.tsx +87 -0
  39. package/reactHooks/player/useSeek.tsx +66 -0
  40. package/reactHooks/player/useTapSeek.tsx +58 -0
  41. package/reactUtils/index.ts +0 -14
  42. package/appUtils/keyCodes/keys.ios.js +0 -46
  43. package/appUtils/keyInputHandler/KeyInputHandler.ts +0 -68
  44. package/reactHooks/player/TVSeekControlller/ISeekController.ts +0 -32
  45. package/reactHooks/player/TVSeekControlller/LongPressSeekController.ts +0 -74
  46. package/reactHooks/player/TVSeekControlller/TVSeekController.ts +0 -262
  47. package/reactHooks/player/TVSeekControlller/TapSeekController.ts +0 -53
  48. /package/appUtils/HooksManager/{logger.js → logger.ts} +0 -0
  49. /package/appUtils/{directionHelper.js → directionHelper.ts} +0 -0
  50. /package/appUtils/keyCodes/{androidTVKeys.js → androidTVKeys.ts} +0 -0
  51. /package/appUtils/keyCodes/{keys.web.js → keys/keys.web.ts} +0 -0
  52. /package/appUtils/{localizationsHelper.js → localizationsHelper.ts} +0 -0
  53. /package/domUtils/{logger.js → logger.ts} +0 -0
@@ -0,0 +1,116 @@
1
+ import { SubscriberObj } from "../../functionUtils";
2
+ import { HOOKS_EVENTS } from "./constants";
3
+
4
+ export interface HookConfiguration {}
5
+
6
+ /* existing Hook Plugn props: sample */
7
+ interface _HookModulePlugin {
8
+ Component:
9
+ | React.FC<HookPluginProps>
10
+ | React.Component<HookPluginProps, any>
11
+ | React.ReactNode;
12
+ ModalContainer?: React.FC<ModalProps> | React.Component<ModalProps, any>;
13
+ skipHook?: (payload: ZappRiver | ZappEntry) => boolean;
14
+ presentFullScreen: boolean;
15
+ showNavBar?: boolean;
16
+ isFlowBlocker: (() => boolean) | boolean; // narrow this
17
+ hasPlayerHook?: boolean;
18
+ name: string;
19
+ runInBackground?: (
20
+ item: HookPluginProps["payload"],
21
+ callback: hookCallback,
22
+ hookPlugin: HookScreenData,
23
+ presentUI: (payload?: HookPluginProps["payload"]) => void
24
+ ) => any;
25
+ }
26
+
27
+ //* Derived from usage */
28
+ export interface HookModule {
29
+ ModalContainer?: React.ComponentType<any>;
30
+ Component: React.ComponentType<any>;
31
+ presentFullScreen: boolean;
32
+ run?: (
33
+ arg0: unknown,
34
+ callback: () => void,
35
+ configuration: HookConfiguration
36
+ ) => void; // not sure about optional parameter
37
+ hasPlayerHook?: boolean;
38
+ configuration?: HookConfiguration;
39
+ isFlowBlocker: () => boolean;
40
+ skipHook?: (payload?: ZappRiver | ZappEntry) => boolean;
41
+ runInBackground?: (
42
+ arg0: unknown,
43
+ callback: () => void,
44
+ hookPlugin: Hook,
45
+ presentUI: (payload?: HookPluginProps["payload"]) => void
46
+ ) => void;
47
+ name: string;
48
+ showNavBar?: boolean; // unsure
49
+ }
50
+
51
+ export type HookManagerArgs = {
52
+ rivers: Record<string, ZappRiver>;
53
+ plugins: ZappPlugin[];
54
+ targetScreen: ZappRiver;
55
+ startUpHooksData?: {
56
+ startUpHooks?: unknown[] | "in_process";
57
+ setStartUpHooks?: (arg0: string) => void;
58
+ };
59
+ };
60
+
61
+ export interface HookManager {
62
+ subscriber: SubscriberObj;
63
+ presentScreenHook: (
64
+ hook: Hook,
65
+ payload: unknown,
66
+ callback: (...any) => void
67
+ ) => void;
68
+ executeHook: (
69
+ hook: Hook,
70
+ payload: unknown,
71
+ callback: (...any) => void
72
+ ) => void;
73
+ handleHooks: (payload: unknown) => void;
74
+ runInBackground: (
75
+ hook: Hook,
76
+ payload: unknown,
77
+ callback: (...any) => void,
78
+ presentUI: (payload?: HookPluginProps["payload"]) => void
79
+ ) => void;
80
+ }
81
+
82
+ export type HookIniObj = {
83
+ hook: HookModule & {
84
+ module: HookModule;
85
+ general: unknown;
86
+ screen_id?: string;
87
+ identifier?: string;
88
+ weight?: number | string;
89
+ };
90
+ hooks: Hook<any>[];
91
+ manager: HookManager;
92
+ };
93
+
94
+ export interface Hook<T extends HookModule = HookModule> {
95
+ manager: HookManager;
96
+ lastHook: boolean;
97
+ state: number;
98
+ module: T;
99
+ screen_id: string;
100
+ identifier: string;
101
+ configuration: T["configuration"];
102
+ setStateAndNotify(
103
+ event: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS],
104
+ opts: {
105
+ error?: typeof Error;
106
+ route?: string;
107
+ hookPlugin: Hook<T>;
108
+ payload: unknown;
109
+ }
110
+ );
111
+ general?: {
112
+ transition_type: typeof HOOKS_EVENTS[keyof typeof HOOKS_EVENTS];
113
+ allow_screen_plugin_presentation: boolean;
114
+ is_flow_blocker: boolean;
115
+ };
116
+ }
@@ -26,7 +26,7 @@ export const riverFocusManager = (function () {
26
26
  /**
27
27
  * Retrieve screen focus data by id
28
28
  *
29
- * @param {String} screenFocusableGroupId Id that was used to save screen data.
29
+ * @param {{screenFocusableGroupId: string}} screenFocusableGroupId Unique Id of the screen from layout.json
30
30
  *
31
31
  */
32
32
  function screenFocusableData({ screenFocusableGroupId }) {
@@ -36,8 +36,9 @@ export const riverFocusManager = (function () {
36
36
  /**
37
37
  * Clear screen data for specific screen
38
38
  *
39
- * @param {String} screenId Unique Id of the screen from layout.json
40
- * @param {boolean} isInsideContainer If this screen a screen picker child
39
+ * @param {{ screenId: string, isInsideContainer: boolean }}
40
+ * screenId Unique Id of the screen from layout.json
41
+ * isInsideContainer If this screen a screen picker child
41
42
  *
42
43
  */
43
44
  function clearScreenData({ screenId, isInsideContainer }) {
@@ -60,9 +61,13 @@ export const riverFocusManager = (function () {
60
61
  /**
61
62
  * Focus on selected items
62
63
  *
63
- * @param {String} screenFocusableGroupId Top group id that was saved as screenn
64
- * @param {String} screenFocusedOnItem focusable item to focus
65
- * @param {object} history navigator history object
64
+ * @param {{
65
+ * screenFocusableGroupId: string,
66
+ * screenFocusedOnItem: () => void,
67
+ * previousAction: QuickBrickNavigationActionType,
68
+ * isDeepLink: boolean }} object contains data for focus
69
+ * - `screenFocusedOnItem` focusable item to focus
70
+ * - `previousActionhistory` navigator history object
66
71
  *
67
72
  */
68
73
  function focusOnSelectedItem({
@@ -115,15 +120,15 @@ export const riverFocusManager = (function () {
115
120
 
116
121
  /**
117
122
  * Create unique key that will be used for save focused group data inside specific screen
118
- *
119
- * @param {String} screenId Unique Id of the screen from layout.json
120
- * @param {boolean} isInsideContainer If this screen a screen picker child
123
+ * @param {{ screenId: string, isInsideContainer: boolean }}
124
+ * screenId Unique Id of the screen from layout.json
125
+ * isInsideContainer If this screen a screen picker child
121
126
  *
122
127
  */
123
128
  function screenFocusableGroupId({ screenId, isInsideContainer }) {
124
- return R.isNil(isInsideContainer)
125
- ? `RiverFocusableGroup-${screenId}`
126
- : `RiverFocusableGroup-${screenId}-isInsideContainer`;
129
+ return `RiverFocusableGroup-${screenId}${
130
+ R.isNil(isInsideContainer) ? "" : "-isInsideContainer"
131
+ }`;
127
132
  }
128
133
 
129
134
  return {
@@ -59,7 +59,7 @@ export class Tree {
59
59
  /**
60
60
  * Update node with provided data from newNode
61
61
  * @private
62
- * @param {Object} node to update
62
+ * @param {Object} currentNode to update
63
63
  * @param {Object} newNode node to take data from
64
64
  */
65
65
  updateNode(currentNode, newNode) {
@@ -175,7 +175,6 @@ export class Tree {
175
175
  * @private
176
176
  * @param {Object} node to check
177
177
  * @returns True if node has defined groupID
178
- * @returns False if node has NOT defined groupID
179
178
  */
180
179
  hasGroupID(node) {
181
180
  return node.component && node.component.props.groupId;
@@ -191,7 +190,7 @@ export class Tree {
191
190
  const findChildNode = this.findInTree(node.component.props.groupId);
192
191
 
193
192
  if (findChildNode) {
194
- this.root.children.pop(findChildNode);
193
+ this.root.children.pop();
195
194
  node.children.push(findChildNode);
196
195
  }
197
196
  }
@@ -191,7 +191,6 @@ const toDistance = ({ target, direction, comparisonRect }) => {
191
191
  * Get target in shortest distance in specified direction
192
192
  * @private
193
193
  * @param {Object} direction of the navigation, which led to this focus change
194
- * @param {Object} excludedNode node which should be excluded from target group
195
194
  * @param {Array} targetNodes array of input target nodes
196
195
  * @param {Object} comparisonRect rectangle to compare sides in direction.
197
196
  * @returns {Object} target in direction.
@@ -300,8 +299,7 @@ export function findFocusableNode(direction, currentFocusNode) {
300
299
  * @public
301
300
  * @param {Object} direction of the navigation, which led to this focus change
302
301
  * @param {Object} component - object to check props.prioritiseFocusOn
303
- * @returns {Boolean} TRUE if object has priority in direction.
304
- * @returns {Boolean} FALSE if object has NO priority in direction.
302
+ * @returns {Boolean} TRUE if object has priority in direction. FALSE if object has NO priority in direction.
305
303
  */
306
304
  export function hasPriorityInDirection(direction, component) {
307
305
  const { prioritiseFocusOn = 0 } = component.props;
@@ -9,7 +9,7 @@ export { KEYS, ARROW_KEYS } from "./keyCodes/keys";
9
9
 
10
10
  export { playerManager } from "./playerManager";
11
11
 
12
- export { accessibilityManager } from "./accessibilityManager";
12
+ export { AccessibilityManager } from "./accessibilityManager";
13
13
 
14
14
  export function deprecationMessage(fn, replacement) {
15
15
  if (__DEV__ && process.env.NODE_ENV !== "test") {
@@ -13,7 +13,7 @@ const globalTizen = {
13
13
  describe("keyCodes", () => {
14
14
  describe("keyCode", () => {
15
15
  const { keyCode } = require("..");
16
- const { KEYS } = require("../keys.web");
16
+ const { KEYS } = require("../keys/keys.web");
17
17
 
18
18
  it("returns an object for a given key event", () => {
19
19
  expect(keyCode(KEYS.Enter)).toMatchSnapshot();
@@ -63,7 +63,7 @@ describe("keyCodes", () => {
63
63
  it("uses the proper keyCode for the environment", () => {
64
64
  Platform.OS = "samsung_tv";
65
65
  const { keyCode } = require("../");
66
- const { KEYS } = require("../keys.web");
66
+ const { KEYS } = require("../keys/keys.web");
67
67
 
68
68
  expect(globalTizen.tvinputdevice.registerKeyBatch).toHaveBeenCalledWith([
69
69
  "MediaPlay",
@@ -97,7 +97,7 @@ describe("keyCodes", () => {
97
97
  it("uses the proper keyCode for the environment", () => {
98
98
  Platform.OS = "lg_tv";
99
99
  const { keyCode } = require("..");
100
- const { KEYS } = require("../keys.web");
100
+ const { KEYS } = require("../keys/keys.web");
101
101
  // Back is reserved on LG
102
102
  expect(keyCode({ keyCode: 417 }).matches(KEYS.Forward)).toBeTruthy();
103
103
  });
@@ -6,6 +6,8 @@ import * as R from "ramda";
6
6
  import { directionHelper } from "../directionHelper";
7
7
  import { KEYS, ARROW_KEYS } from "./keys";
8
8
 
9
+ export { KEYS, ARROW_KEYS, keyEventMapper } from "./keys";
10
+
9
11
  /**
10
12
  * @typedef KeyCode
11
13
  * @property {Object} value of the Key
@@ -0,0 +1,3 @@
1
+ export * from "./keys";
2
+
3
+ export { keyEventMapper } from "./keyEventMapper";
@@ -1,22 +1,3 @@
1
- export const KEYS = {
2
- Enter: { code: "Enter", keyCode: 13 },
3
- EnterKeyboard: { code: "EnterKeyboard", keyCode: 66 },
4
- Back: { code: "Back", keyCode: 8 },
5
- Space: { code: "Space", keyCode: 32 },
6
- m: { code: "m", keyCode: 77 },
7
- ArrowLeft: { code: "ArrowLeft", keyCode: 37 },
8
- ArrowUp: { code: "ArrowUp", keyCode: 38 },
9
- ArrowRight: { code: "ArrowRight", keyCode: 39 },
10
- ArrowDown: { code: "ArrowDown", keyCode: 40 },
11
- };
12
-
13
- export const ARROW_KEYS = [
14
- KEYS.ArrowUp,
15
- KEYS.ArrowLeft,
16
- KEYS.ArrowDown,
17
- KEYS.ArrowRight,
18
- ];
19
-
20
1
  export function keyEventMapper(keyCode) {
21
2
  switch (keyCode) {
22
3
  case 19: // ArrowUp
@@ -0,0 +1,18 @@
1
+ export const KEYS = {
2
+ Enter: { code: "Enter", keyCode: 13 },
3
+ EnterKeyboard: { code: "EnterKeyboard", keyCode: 66 },
4
+ Back: { code: "Back", keyCode: 8 },
5
+ Space: { code: "Space", keyCode: 32 },
6
+ m: { code: "m", keyCode: 77 },
7
+ ArrowLeft: { code: "ArrowLeft", keyCode: 37 },
8
+ ArrowUp: { code: "ArrowUp", keyCode: 38 },
9
+ ArrowRight: { code: "ArrowRight", keyCode: 39 },
10
+ ArrowDown: { code: "ArrowDown", keyCode: 40 },
11
+ };
12
+
13
+ export const ARROW_KEYS = [
14
+ KEYS.ArrowUp,
15
+ KEYS.ArrowLeft,
16
+ KEYS.ArrowDown,
17
+ KEYS.ArrowRight,
18
+ ];
@@ -0,0 +1,25 @@
1
+ export const KEYS = {
2
+ Enter: { code: "Enter", keyCode: 13 },
3
+ Space: { code: "Space", keyCode: 32 },
4
+ m: { code: "m", keyCode: 77 },
5
+ ArrowLeft: { code: "ArrowLeft", keyCode: 37 },
6
+ ArrowUp: { code: "ArrowUp", keyCode: 38 },
7
+ ArrowRight: { code: "ArrowRight", keyCode: 39 },
8
+ ArrowDown: { code: "ArrowDown", keyCode: 40 },
9
+ Back: { code: "Backspace", keyCode: 8 },
10
+ Play: { code: "PlayPause", keyCode: 179 },
11
+ Pause: { code: "Pause", keyCode: 179 },
12
+ Forward: { code: "Forward", keyCode: 176 },
13
+ Rewind: { code: "Rewind", keyCode: 177 },
14
+ VolumeUp: { code: "VolumeUp", keyCode: 175 },
15
+ VolumeDown: { code: "VolumeDown", keyCode: 174 },
16
+ ToggleMute: { code: "VolumeMute", keyCode: 173 },
17
+ Stop: { code: "Q", keyCode: 81 },
18
+ };
19
+
20
+ export const ARROW_KEYS = [
21
+ KEYS.ArrowUp,
22
+ KEYS.ArrowLeft,
23
+ KEYS.ArrowDown,
24
+ KEYS.ArrowRight,
25
+ ];
@@ -0,0 +1,15 @@
1
+ // dummy file to make sure the folder structure is created
2
+ export const KEYS: Record<string, { code: string; keyCode: number }> = {
3
+ ArrowLeft: { code: "ArrowLeft", keyCode: -1 },
4
+ ArrowUp: { code: "ArrowUp", keyCode: -1 },
5
+ ArrowRight: { code: "ArrowRight", keyCode: -1 },
6
+ ArrowDown: { code: "ArrowDown", keyCode: -1 },
7
+ Back: { code: "Back", keyCode: -1 },
8
+ };
9
+
10
+ export const ARROW_KEYS = [
11
+ KEYS.ArrowUp,
12
+ KEYS.ArrowLeft,
13
+ KEYS.ArrowDown,
14
+ KEYS.ArrowRight,
15
+ ];
@@ -77,10 +77,6 @@ const web = {
77
77
  Exit: { code: "Exit", keyCode: null },
78
78
  Escape: { code: "Escape", keyCode: 27 },
79
79
  EscapeDevice: { code: "Escape", keyCode: 27 },
80
- // For Debugging
81
- Z: { code: "KeyZ", keyCode: 90 }, // Hardware Backward Button
82
- X: { code: "KeyX", keyCode: 88 }, // Hardware Enter Button
83
- C: { code: "KeyC", keyCode: 67 }, // Hardware Forward Button
84
80
  };
85
81
 
86
82
  const android_tv = {
@@ -0,0 +1,8 @@
1
+ export {
2
+ lg_tv,
3
+ samsung_tv,
4
+ web,
5
+ tvos,
6
+ android_tv,
7
+ vizio,
8
+ } from "./keys/keysByPlatform";
@@ -9,20 +9,6 @@ import {
9
9
  import { PLATFORM_KEYS, PLATFORMS } from "./const";
10
10
  import { createLogger, utilsLogger } from "../../logger";
11
11
 
12
- declare global {
13
- interface Window {
14
- VIZIO?: {
15
- exitApplication: () => void;
16
- Chromevox: {
17
- play: (text: string) => void;
18
- };
19
- setClosedCaptionHandler: (
20
- callback: (isCCEnabled: boolean) => void
21
- ) => void;
22
- };
23
- }
24
- }
25
-
26
12
  const { log_debug } = createLogger({
27
13
  category: "General",
28
14
  subsystem: "PlatformUtils",
@@ -5,7 +5,6 @@ import { createLogger, utilsLogger } from "../../logger";
5
5
  import { getBoolFromConfigValue } from "../../configurationUtils";
6
6
  import { PlayerRole, SharedPlayerCallBacksKeys } from "./conts";
7
7
  import { OverlaysObserver } from "./OverlayObserver/OverlaysObserver";
8
- import { TVSeekController } from "../../reactHooks/player/TVSeekControlller/TVSeekController";
9
8
 
10
9
  const logger = createLogger({
11
10
  category: "PlayerController",
@@ -50,8 +49,6 @@ export class Player {
50
49
  [key: string]: QuickBrickPlayer.SharedPlayerCallBacks;
51
50
  } = {};
52
51
 
53
- public seekController?: TVSeekController | null;
54
-
55
52
  get entry(): ZappEntry | null {
56
53
  return this._entry;
57
54
  }
@@ -62,8 +59,6 @@ export class Player {
62
59
  }
63
60
 
64
61
  constructor(props) {
65
- this.seekController = null;
66
-
67
62
  this.playerState = {
68
63
  // We want isLive null by default to be able not to show controls if we do not know type
69
64
  isLive: null,
@@ -96,8 +91,6 @@ export class Player {
96
91
  this.onVideoProgress = this.onVideoProgress.bind(this);
97
92
  this.onVideoLoad = this.onVideoLoad.bind(this);
98
93
  this.isFullScreenSupported = this.isFullScreenSupported.bind(this);
99
- this.onPlayerSeekComplete = this.onPlayerSeekComplete.bind(this);
100
-
101
94
  this.entryObservable = null;
102
95
  }
103
96
 
@@ -328,7 +321,7 @@ export class Player {
328
321
  * You should use dispatchPlayerEvent at PlayerContainer or call playerManager.invokeHandler directly
329
322
  * This allows you to use one method for everything.
330
323
  */
331
- onPlayerSeekStart = (event: QuickBrickPlayer.OnSeekStartEvent) => {
324
+ onSeekStart = (event: QuickBrickPlayer.OnSeekStartEvent) => {
332
325
  const { isLive, seekableDuration, currentTime, duration, seekTime } = event;
333
326
 
334
327
  this.setPlaybackState({ currentTime, duration, seekableDuration, isLive });
@@ -343,11 +336,10 @@ export class Player {
343
336
  });
344
337
  };
345
338
 
346
- onPlayerSeekComplete = (event: QuickBrickPlayer.OnSeekCompleteEvent) => {
339
+ onSeekComplete = (event: QuickBrickPlayer.OnSeekCompleteEvent) => {
347
340
  const { isLive, seekableDuration, currentTime, duration } = event;
348
341
 
349
342
  this.setPlaybackState({ currentTime, duration, seekableDuration, isLive });
350
-
351
343
  this.playerState.seekPosition = null;
352
344
 
353
345
  if (!isLive) {
@@ -628,18 +620,14 @@ export class Player {
628
620
  selectTrack = (_track) => {};
629
621
 
630
622
  protected notifyPlayHeadPositionUpdate = () => {
631
- const currentTime = this.getPosition();
632
-
633
623
  const event = {
634
- currentTime,
624
+ currentTime: this.getPosition(),
635
625
  duration: this.getDuration(),
636
626
  item: this.getEntry(),
637
627
  seekableDuration: this.playerState.seekableDuration,
638
628
  isLive: this.isLive(),
639
629
  };
640
630
 
641
- this.seekController?.onVideoProgress(currentTime);
642
-
643
631
  this.invokeListenersUpdate({
644
632
  callbackName: SharedPlayerCallBacksKeys.OnVideoProgress,
645
633
  event,
@@ -665,8 +653,8 @@ export class Player {
665
653
  };
666
654
 
667
655
  public getListener = (): QuickBrickPlayer.SharedPlayerCallBacks => ({
668
- onPlayerSeekStart: this.onPlayerSeekStart,
669
- onPlayerSeekComplete: this.onPlayerSeekComplete,
656
+ onPlayerSeekStart: this.onSeekStart,
657
+ onPlayerSeekComplete: this.onSeekComplete,
670
658
  onVideoEnd: this.onVideoEnd,
671
659
  onError: this.onError,
672
660
  onVideoError: this.onVideoError,
@@ -222,10 +222,9 @@ export class PlayerNative extends Player {
222
222
 
223
223
  onVideoLoad = (event) => {
224
224
  if (this.startPosition) {
225
+ super.onVideoLoad({ ...event, ignoreContinueWatching: true });
225
226
  this.seekTo(this.startPosition);
226
227
  this.startPosition = null;
227
-
228
- super.onVideoLoad({ ...event, ignoreContinueWatching: true });
229
228
  } else {
230
229
  super.onVideoLoad(event);
231
230
  }
@@ -39,7 +39,7 @@ export const usePlayerControllerSetup = ({
39
39
  ? { supports_native_controls: true, ...config }
40
40
  : config;
41
41
 
42
- const combinedProps = {
42
+ const newPlayerController = new ControllerType({
43
43
  player: ref,
44
44
  listener: props as any,
45
45
  config: newConfig,
@@ -47,9 +47,9 @@ export const usePlayerControllerSetup = ({
47
47
  entry,
48
48
  playerPluginId: pluginId,
49
49
  playerRole: PlayerRole.Primary,
50
- };
50
+ });
51
51
 
52
- setPlayerController(new ControllerType(combinedProps));
52
+ setPlayerController(newPlayerController);
53
53
  }, [playerId, entry?.id]);
54
54
 
55
55
  React.useEffect(() => {
@@ -2,7 +2,6 @@ import { domUtilsLogger } from "./logger";
2
2
 
3
3
  /**
4
4
  * Gets an object of cookies and sets them on the DOM.
5
- * @param {Object} cookies selected data key for label.
6
5
  */
7
6
  export function setCookies(cookies): void {
8
7
  const cookieKeys = Object.keys(cookies);
@@ -25,7 +24,7 @@ export function setCookies(cookies): void {
25
24
  /**
26
25
  * Gets cookies set on DOM
27
26
  */
28
- export function getCookies(): Object {
27
+ export function getCookies(): typeof document.cookie {
29
28
  try {
30
29
  if (document) {
31
30
  return document.cookie;
@@ -111,12 +111,12 @@ type SubscriberFn<T> = (
111
111
 
112
112
  export type EventHandlerFn<T> = (event: string, ...args: unknown[]) => T;
113
113
 
114
- type SubscriberObj = Partial<{
115
- on?: SubscriberFn<SubscriberObj>;
116
- invokeHandler: EventHandlerFn<SubscriberObj>;
117
- removeHandler: EventHandlerFn<SubscriberObj>;
118
- handlers: Record<string, SubscriberFn<SubscriberObj>[] | []>;
119
- }>;
114
+ export type SubscriberObj<T extends {} = {}> = {
115
+ on: SubscriberFn<SubscriberObj<T>>;
116
+ invokeHandler: EventHandlerFn<SubscriberObj<T>>;
117
+ removeHandler: EventHandlerFn<SubscriberObj<T>>;
118
+ handlers: Record<string, SubscriberFn<SubscriberObj<T>>[] | []>;
119
+ } & T;
120
120
 
121
121
  export const clearObject = (object: { [key: string]: unknown }) =>
122
122
  Object.keys(object).forEach((key) => delete object[key]);
@@ -126,7 +126,11 @@ export const clearObject = (object: { [key: string]: unknown }) =>
126
126
  * @param {Object} obj to add the subscription feature on
127
127
  * @returns {Object} subscriber object
128
128
  */
129
- export function subscriber(obj: SubscriberObj = {}): SubscriberObj {
129
+ export function subscriber<T extends Partial<SubscriberObj> = {}>(
130
+ _obj: T = {} as T
131
+ ): SubscriberObj {
132
+ const obj: T = _obj;
133
+
130
134
  if (!obj.handlers) {
131
135
  obj.handlers = {};
132
136
  }
@@ -172,7 +176,7 @@ export function subscriber(obj: SubscriberObj = {}): SubscriberObj {
172
176
  | SubscriberFn<SubscriberObj>[]
173
177
  | [];
174
178
 
175
- return obj;
179
+ return obj as SubscriberObj;
176
180
  };
177
181
 
178
182
  /**
@@ -188,16 +192,16 @@ export function subscriber(obj: SubscriberObj = {}): SubscriberObj {
188
192
 
189
193
  R.compose(R.forEach(callHandlerWithDispose), R.propOr([], event))(handlers);
190
194
 
191
- return obj;
195
+ return obj as SubscriberObj;
192
196
  };
193
197
 
194
198
  obj.removeHandler = function (event, handler) {
195
199
  handlers[event] = R.reject(R.equals(handler), handlers[event]);
196
200
 
197
- return obj;
201
+ return obj as SubscriberObj;
198
202
  };
199
203
 
200
- return obj;
204
+ return obj as SubscriberObj;
201
205
  }
202
206
 
203
207
  /**
@@ -31,11 +31,7 @@ export const useModalStore = create<ModalStore>((set) => ({
31
31
  set((state) => ({
32
32
  modalState: { ...state.modalState, ...newState },
33
33
  })),
34
- openModal: ({
35
- item,
36
- options = {},
37
- props = { screenData: {} },
38
- }: OpenModalArg) =>
34
+ openModal: ({ item, options = {}, props }: OpenModalArg) =>
39
35
  set({
40
36
  modalState: {
41
37
  visible: true,
@@ -324,7 +324,13 @@ export function getPathAttributes({
324
324
  * @param {object} rivers
325
325
  * @returns {object}
326
326
  */
327
- export function getRiverFromRoute({ route, rivers }) {
327
+ export function getRiverFromRoute({
328
+ route,
329
+ rivers,
330
+ }: {
331
+ route: string;
332
+ rivers: Record<string, ZappRiver>;
333
+ }) {
328
334
  if (!route) {
329
335
  return null;
330
336
  }
@@ -437,7 +443,7 @@ export const runZappHooksForEntry = async (
437
443
 
438
444
  let success;
439
445
  let payload;
440
- const rivers = appStore.get("rivers");
446
+ const rivers: Record<string, ZappRiver> = appStore.get("rivers");
441
447
  const plugins = appStore.get("plugins");
442
448
  const appData = appStore.get("appData");
443
449
 
@@ -492,13 +498,16 @@ export const runZappHooksForEntry = async (
492
498
  payload = _payload;
493
499
  };
494
500
 
495
- HooksManager(hooksOptions)
501
+ const hooksManager = HooksManager(hooksOptions);
502
+
503
+ hooksManager.subscriber
496
504
  .on(HOOKS_EVENTS.PRESENT_SCREEN_HOOK, handleHookPresent)
497
505
  .on(HOOKS_EVENTS.START_BACKGROUND_HOOK, handleBackgroundHook)
498
506
  .on(HOOKS_EVENTS.ERROR, onFinished(false))
499
507
  .on(HOOKS_EVENTS.CANCEL, onFinished(false))
500
- .on(HOOKS_EVENTS.COMPLETE, onFinished(true))
501
- .handleHooks(entry);
508
+ .on(HOOKS_EVENTS.COMPLETE, onFinished(true));
509
+
510
+ hooksManager.handleHooks(entry);
502
511
 
503
512
  // eslint-disable-next-line no-unmodified-loop-condition
504
513
  while (success === undefined) {