@applicaster/zapp-react-native-utils 13.0.0-alpha.2635505531 → 13.0.0-alpha.3013227535

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 (114) hide show
  1. package/actionsExecutor/ActionExecutor.ts +16 -9
  2. package/actionsExecutor/ActionExecutorContext.tsx +74 -9
  3. package/alertUtils/alert.ts +148 -0
  4. package/alertUtils/index.ts +1 -148
  5. package/analyticsUtils/AnalyticPlayerListener.ts +18 -1
  6. package/analyticsUtils/__tests__/__snapshots__/analyticsManagerNoModule.test.js.snap +9 -9
  7. package/analyticsUtils/helpers/hooks.ts +1 -1
  8. package/appUtils/HooksManager/{Hook.js → Hook.ts} +35 -23
  9. package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +10 -8
  10. package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +693 -0
  11. package/appUtils/HooksManager/__tests__/hook.test.js +196 -184
  12. package/appUtils/HooksManager/__tests__/hooksManager.test.js +96 -99
  13. package/appUtils/HooksManager/{constants.js → constants.ts} +1 -1
  14. package/appUtils/HooksManager/{index.js → index.ts} +121 -112
  15. package/appUtils/HooksManager/types.ts +119 -0
  16. package/appUtils/RiverFocusManager/index.js +17 -12
  17. package/appUtils/accessibilityManager/index.ts +42 -1
  18. package/appUtils/contextKeysManager/contextResolver.ts +77 -0
  19. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +6 -6
  20. package/appUtils/focusManager/index.ts +91 -65
  21. package/appUtils/focusManager/treeDataStructure/Tree/index.js +25 -3
  22. package/appUtils/focusManager/treeDataStructure/Utils/index.js +1 -3
  23. package/appUtils/focusManager/utils/enums.ts +4 -0
  24. package/appUtils/focusManagerAux/utils/index.ts +4 -3
  25. package/appUtils/{index.js → index.ts} +1 -1
  26. package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +2 -2
  27. package/appUtils/keyCodes/__tests__/keyCodes.test.js +4 -4
  28. package/appUtils/keyCodes/{index.js → index.ts} +2 -0
  29. package/appUtils/keyCodes/keys/index.ts +3 -0
  30. package/appUtils/keyCodes/{keys.android.js → keys/keyEventMapper.ts} +0 -19
  31. package/appUtils/keyCodes/keys/keys.android.ts +18 -0
  32. package/appUtils/keyCodes/keys/keys.ios.ts +25 -0
  33. package/appUtils/keyCodes/keys/keys.ts +15 -0
  34. package/appUtils/keyCodes/{keysByPlatform.js → keys/keysByPlatform.ts} +4 -3
  35. package/appUtils/keyCodes/keysByPlatform.ts +8 -0
  36. package/appUtils/keyInputHandler/KeyInputHandler.ts +68 -0
  37. package/appUtils/orientationHelper.ts +1 -1
  38. package/appUtils/platform/const.ts +14 -0
  39. package/appUtils/platform/platformUtils.ts +17 -15
  40. package/appUtils/playerManager/index.ts +6 -2
  41. package/appUtils/playerManager/player.ts +14 -10
  42. package/appUtils/playerManager/playerNative.ts +1 -1
  43. package/appUtils/playerManager/usePlayerControllerSetup.tsx +1 -15
  44. package/arrayUtils/__tests__/__snapshots__/arrayUtils.test.ts.snap +4 -4
  45. package/domUtils/{cookieManager.js → cookieManager.ts} +1 -2
  46. package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +4 -4
  47. package/functionUtils/index.ts +15 -11
  48. package/idleUtils/__tests__/withTimeout$.test.ts +37 -0
  49. package/idleUtils/index.ts +1 -1
  50. package/idleUtils/withTimeout.ts +15 -2
  51. package/logger/const.ts +9 -67
  52. package/manifestUtils/__tests__/createConfig.test.js +18 -16
  53. package/modalState/index.ts +1 -5
  54. package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +6 -6
  55. package/navigationUtils/__tests__/itemTypes.test.js +2 -2
  56. package/navigationUtils/__tests__/navigationUtils.test.js +2 -2
  57. package/navigationUtils/index.ts +17 -8
  58. package/package.json +3 -2
  59. package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
  60. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -1
  61. package/reactHooks/cell-click/__tests__/index.test.js +10 -2
  62. package/reactHooks/cell-click/index.ts +7 -1
  63. package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +4 -4
  64. package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +10 -11
  65. package/reactHooks/feed/useFeedLoader.tsx +1 -1
  66. package/reactHooks/feed/usePipesCacheReset.ts +5 -5
  67. package/reactHooks/flatList/__tests__/index.test.tsx +30 -21
  68. package/reactHooks/layout/__tests__/index.test.tsx +10 -10
  69. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +14 -28
  70. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +1 -1
  71. package/reactHooks/navigation/__tests__/index.test.tsx +0 -4
  72. package/reactHooks/navigation/index.ts +29 -218
  73. package/reactHooks/navigation/useGetBottomTabBarHeight.ts +12 -0
  74. package/reactHooks/navigation/useGetNavBarTopBorderWidth.ts +14 -0
  75. package/reactHooks/navigation/useGetTabBarHeight.ts +12 -0
  76. package/reactHooks/navigation/useIsScreenActive.ts +17 -0
  77. package/reactHooks/navigation/useNavigationPluginData.ts +15 -0
  78. package/reactHooks/navigation/useNavigationType.ts +15 -0
  79. package/reactHooks/navigation/usePathname.ts +4 -0
  80. package/reactHooks/navigation/useRoute.ts +100 -0
  81. package/reactHooks/navigation/useUniqueRouteSuffix.ts +41 -0
  82. package/reactHooks/player/TVSeekControlller/ISeekController.ts +28 -3
  83. package/reactHooks/player/TVSeekControlller/LongPressSeekController.ts +43 -96
  84. package/reactHooks/player/TVSeekControlller/TVSeekController.ts +203 -97
  85. package/reactHooks/player/TVSeekControlller/TapSeekController.ts +35 -55
  86. package/reactHooks/player/__tests__/{useAutoSeek.test.tsx → useAutoSeek._test.tsx} +2 -10
  87. package/reactHooks/player/const.ts +1 -5
  88. package/reactHooks/player/index.ts +0 -6
  89. package/reactHooks/usePluginConfiguration.ts +1 -1
  90. package/reactHooks/useSubscriberFor.ts +4 -3
  91. package/reactUtils/__tests__/reactUtils.test.js +10 -28
  92. package/reactUtils/createContext/__tests__/__snapshots__/helpers.test.js.snap +19 -19
  93. package/reactUtils/createContext/__tests__/__snapshots__/index.test.js.snap +2 -2
  94. package/reactUtils/createContext/__tests__/__snapshots__/provider.test.js.snap +3 -3
  95. package/reactUtils/createContext/__tests__/helpers.test.js +8 -8
  96. package/reactUtils/index.ts +0 -14
  97. package/screenState/index.ts +24 -10
  98. package/theme/__mocks__/index.ts +4 -0
  99. package/theme/index.ts +1 -1
  100. package/time/Timer.ts +5 -2
  101. package/types.ts +1 -0
  102. package/zappFrameworkUtils/presentPluginOneTime.ts +2 -3
  103. package/appUtils/keyCodes/keys.ios.js +0 -46
  104. package/appUtils/playerManager/DelayedSeekPlayerWrapper.tsx +0 -180
  105. package/reactHooks/player/useAutoSeek.tsx +0 -106
  106. package/reactHooks/player/useSeek.tsx +0 -17
  107. package/reactHooks/player/useTapSeek.tsx +0 -85
  108. /package/appUtils/HooksManager/{logger.js → logger.ts} +0 -0
  109. /package/appUtils/{directionHelper.js → directionHelper.ts} +0 -0
  110. /package/appUtils/keyCodes/{androidTVKeys.js → androidTVKeys.ts} +0 -0
  111. /package/appUtils/keyCodes/{keys.web.js → keys/keys.web.ts} +0 -0
  112. /package/appUtils/{localizationsHelper.js → localizationsHelper.ts} +0 -0
  113. /package/domUtils/{logger.js → logger.ts} +0 -0
  114. /package/reactHooks/player/__tests__/{useTapSeek.test.ts → useTapSeek._test.ts} +0 -0
@@ -1,180 +0,0 @@
1
- import { Player } from "./player";
2
- import { BehaviorSubject } from "rxjs";
3
-
4
- export class DelayedSeekPlayerWrapper extends Player {
5
- private wrappedPlayer: Player;
6
- private delayedSeekPosition: number;
7
- private wasPlaying: boolean;
8
-
9
- constructor(props, player: Player) {
10
- super(props);
11
- this.wrappedPlayer = player;
12
- this.delayedSeekPosition = null;
13
-
14
- this.wrappedPlayer.addListener({
15
- id: "Master-Wrapper-Listener",
16
- listener: this,
17
- });
18
-
19
- this.onPlayerSeekComplete = this.onPlayerSeekComplete.bind(this);
20
- }
21
-
22
- getOverlayObservable = () => {
23
- return this.wrappedPlayer.getOverlayObservable();
24
- };
25
-
26
- getEntryObservable = (): BehaviorSubject<ZappEntry | null> => {
27
- return this.wrappedPlayer.getEntryObservable();
28
- };
29
-
30
- getEntry = (): ZappEntry | null => this.wrappedPlayer.getEntry();
31
-
32
- getListener = (): QuickBrickPlayer.SharedPlayerCallBacks => {
33
- return this.wrappedPlayer.getListener();
34
- };
35
-
36
- togglePlayPause = () => {
37
- this.wrappedPlayer.togglePlayPause();
38
- };
39
-
40
- selectTrack = (_track) => this.wrappedPlayer.selectTrack(_track);
41
-
42
- // Implement all default methods by delegating them to wrapped player
43
- public seekTo = (position: number) => {
44
- this.wrappedPlayer.seekTo(position);
45
- };
46
-
47
- public isPlaying = () => {
48
- return this.wrappedPlayer.isPlaying();
49
- };
50
-
51
- public isPaused = () => {
52
- return this.wrappedPlayer.isPaused();
53
- };
54
-
55
- public play = () => {
56
- this.wrappedPlayer.play();
57
- };
58
-
59
- public pause = () => {
60
- this.wrappedPlayer.pause();
61
- };
62
-
63
- getState = () => {
64
- const currentState = this.wrappedPlayer.getState();
65
-
66
- if (this.delayedSeekPosition === null) {
67
- return currentState;
68
- }
69
-
70
- return {
71
- ...currentState,
72
- contentPosition: this.delayedSeekPosition,
73
- isPaused: false,
74
- seekPosition: this.delayedSeekPosition,
75
- };
76
- };
77
-
78
- forward = (deltaTime: number) => {
79
- if (this.delayedSeekPosition !== null) {
80
- this.delayedSeekPosition += deltaTime;
81
- this.playerState.seekPosition = this.delayedSeekPosition;
82
-
83
- this.onVideoProgress({
84
- currentTime: this.playerState.seekPosition,
85
- duration: this.getDuration(),
86
- seekableDuration: this.playerState.seekableDuration,
87
- isLive: this.playerState.isLive,
88
- });
89
-
90
- // this.scheduleResumePlayback(DELAYED_SEEK_DELAY, this.delayedSeekPosition);
91
-
92
- return;
93
- }
94
-
95
- if (this.playerState.seekPosition == null) {
96
- this.playerState.seekPosition = this.playerState.contentPosition;
97
- }
98
-
99
- this.playerState.seekPosition += deltaTime;
100
-
101
- this.wrappedPlayer.forward(deltaTime);
102
- };
103
-
104
- rewind = (deltaTime: number) => {
105
- if (this.delayedSeekPosition !== null) {
106
- this.delayedSeekPosition -= deltaTime;
107
-
108
- if (this.delayedSeekPosition < 0) {
109
- this.delayedSeekPosition = 0;
110
- }
111
-
112
- this.playerState.seekPosition = this.delayedSeekPosition;
113
-
114
- this.onVideoProgress({
115
- currentTime: this.playerState.seekPosition,
116
- duration: this.getDuration(),
117
- seekableDuration: this.playerState.seekableDuration,
118
- isLive: this.playerState.isLive,
119
- });
120
-
121
- // this.scheduleResumePlayback(DELAYED_SEEK_DELAY, this.delayedSeekPosition);
122
-
123
- return;
124
- }
125
-
126
- if (this.playerState.seekPosition == null) {
127
- this.playerState.seekPosition = this.playerState.contentPosition;
128
- }
129
-
130
- this.playerState.seekPosition -= deltaTime;
131
- this.wrappedPlayer.rewind(deltaTime);
132
- };
133
-
134
- public getConfig = () => this.wrappedPlayer.getConfig();
135
-
136
- // TODO: replace with enum of supported orientations
137
- isFullScreenSupported(): boolean {
138
- return this.wrappedPlayer.isFullScreenSupported();
139
- }
140
-
141
- public supportsNativeControls = (): boolean =>
142
- this.wrappedPlayer.supportsNativeControls();
143
-
144
- public supportNativeCast = (): boolean =>
145
- this.wrappedPlayer.supportNativeCast();
146
-
147
- public isInDelayedSeek = () => this.delayedSeekPosition !== null;
148
-
149
- public enterDelayedSeek() {
150
- if (this.delayedSeekPosition !== null) {
151
- return;
152
- }
153
-
154
- if (this.playerState.seekPosition === null) {
155
- this.playerState.seekPosition = this.playerState.contentPosition;
156
- }
157
-
158
- this.delayedSeekPosition = this.playerState.seekPosition;
159
-
160
- if (!this.isPaused()) {
161
- this.wasPlaying = true;
162
- this.wrappedPlayer.pause();
163
- }
164
- }
165
-
166
- public exitDelayedSeek() {
167
- if (this.delayedSeekPosition === null) {
168
- return;
169
- }
170
-
171
- this.wrappedPlayer.seekTo(this.delayedSeekPosition);
172
-
173
- if (this.wasPlaying) {
174
- this.wasPlaying = false;
175
- this.wrappedPlayer.play();
176
- }
177
-
178
- this.delayedSeekPosition = null;
179
- }
180
- }
@@ -1,106 +0,0 @@
1
- import React, { useEffect, useState } from "react";
2
- import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
3
- import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
4
- import {
5
- MAX_SEEK_TIME,
6
- ON_HOLD_INTERVAL,
7
- SEEK_TYPE,
8
- SKIP_TIME_BASE,
9
- } from "./const";
10
- import { noop } from "../../functionUtils";
11
-
12
- export const useAutoSeek = (resetHUDTimer = noop) => {
13
- const [isRunning, setIsRunning] = useState<boolean>(false);
14
- const [direction, setDirection] = useState<Nullable<SEEK_TYPE>>(null);
15
- const [multiplier, setMultiplier] = useState(1);
16
-
17
- const intervalTimer = React.useRef(null);
18
- const prevRunning = usePrevious(isRunning);
19
-
20
- const setIntervalTimer = (cb) => {
21
- if (intervalTimer.current) {
22
- return;
23
- }
24
-
25
- intervalTimer.current = setInterval(() => {
26
- intervalTimer.current = null;
27
- cb();
28
- }, ON_HOLD_INTERVAL);
29
- };
30
-
31
- const clearIntervalTimer = () => {
32
- clearInterval(intervalTimer.current);
33
- intervalTimer.current = null;
34
- };
35
-
36
- const resetState = () => {
37
- setIsRunning(false);
38
- setDirection(null);
39
- setMultiplier(1);
40
- clearIntervalTimer();
41
- };
42
-
43
- useEffect(() => {
44
- const player = playerManager.getInstanceController();
45
- if (!player) return;
46
-
47
- if (isRunning) {
48
- player?.enterDelayedSeek();
49
- } else if (!isRunning) {
50
- player.exitDelayedSeek();
51
- }
52
- }, [isRunning]);
53
-
54
- useEffect(() => {
55
- if (!isRunning) {
56
- return;
57
- }
58
-
59
- const player = playerManager.getInstanceController();
60
-
61
- if (!player) return;
62
-
63
- if (direction) {
64
- player[direction](Math.min(MAX_SEEK_TIME, SKIP_TIME_BASE * multiplier));
65
- resetHUDTimer();
66
- }
67
- }, [multiplier, direction, isRunning]);
68
-
69
- useEffect(() => {
70
- if (isRunning && isRunning !== prevRunning) {
71
- setIntervalTimer(() => {
72
- setMultiplier((prev) => {
73
- return prev + 1;
74
- });
75
- });
76
- } else if (!isRunning && isRunning !== prevRunning) {
77
- resetState();
78
- }
79
-
80
- return () => {
81
- clearIntervalTimer();
82
- };
83
- }, [isRunning, direction]);
84
-
85
- const autoSeekStop = React.useCallback(() => {
86
- resetState();
87
- }, []);
88
-
89
- const autoSeekStart = React.useCallback(
90
- (eventType: SEEK_TYPE) => {
91
- // Check if there is another session running
92
- if (isRunning) {
93
- autoSeekStop();
94
- }
95
-
96
- setDirection(eventType);
97
- setIsRunning(true);
98
- },
99
- [isRunning, autoSeekStop]
100
- );
101
-
102
- return React.useMemo(
103
- () => ({ autoSeekStart, autoSeekStop }),
104
- [autoSeekStart, autoSeekStop]
105
- );
106
- };
@@ -1,17 +0,0 @@
1
- import React, { useMemo } from "react";
2
- import { noop } from "../../functionUtils";
3
- import { TVSeekController } from "./TVSeekControlller/TVSeekController";
4
-
5
- export const useSeek = (resetHUDTimer = noop) => {
6
- return useMemo(() => TVSeekController.getInstance().getSeekMethods(), []);
7
- };
8
-
9
- export const withUseSeek = (Component) =>
10
- Object.assign(
11
- (props) => {
12
- const seekMethods = useSeek(props?.resetHUDTimer);
13
-
14
- return <Component {...props} seekMethods={seekMethods} />;
15
- },
16
- { displayName: "WithUseSeek" }
17
- );
@@ -1,85 +0,0 @@
1
- import { useCallback, useRef, useState } from "react";
2
- import * as R from "ramda";
3
- import {
4
- MAX_SEEK_TIME,
5
- ON_PRESS_RESET_DURATION,
6
- SEEK_TYPE,
7
- SKIP_TIME_BASE,
8
- } from "./const";
9
- import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
10
-
11
- type SeekType = SEEK_TYPE | null;
12
-
13
- const getSkipTime = (multiplier) =>
14
- R.min(MAX_SEEK_TIME, SKIP_TIME_BASE * multiplier);
15
-
16
- export const useTapSeek = () => {
17
- const [resumeTimer, setResumeTimer] = useState<NodeJS.Timeout>(null);
18
- const onPressMultiplier = useRef(1);
19
- const lastPressTime = useRef(0);
20
- const currentOnPressEventType = useRef<SeekType>(null);
21
-
22
- const resetMultiplier = useCallback(() => {
23
- onPressMultiplier.current = 1;
24
- }, []);
25
-
26
- const handlePressEvent = useCallback(
27
- (eventType) => {
28
- const player = playerManager.getInstanceController();
29
- if (!player) return;
30
-
31
- const now = Date.now();
32
- const timeSinceLastPress = now - lastPressTime.current;
33
- const isSameEventType = eventType === currentOnPressEventType.current;
34
-
35
- const isWithinResetDuration =
36
- timeSinceLastPress <= ON_PRESS_RESET_DURATION;
37
-
38
- const shouldIncreaseMultiplier = isSameEventType && isWithinResetDuration;
39
-
40
- if (shouldIncreaseMultiplier) {
41
- onPressMultiplier.current += 1;
42
- } else {
43
- resetMultiplier();
44
- }
45
-
46
- const seekTime = getSkipTime(onPressMultiplier.current);
47
-
48
- player[eventType](seekTime);
49
-
50
- if (resumeTimer) {
51
- clearTimeout(resumeTimer);
52
-
53
- const timer = setTimeout(() => {
54
- player.exitDelayedSeek();
55
- setResumeTimer(null);
56
- }, 2000);
57
-
58
- setResumeTimer(timer);
59
- }
60
-
61
- const clicksBeforePause = 3;
62
-
63
- // Only pause player if user starts to seek on large increments
64
- if (onPressMultiplier.current > clicksBeforePause) {
65
- if (!player.isPaused()) {
66
- player.enterDelayedSeek();
67
-
68
- const timer = setTimeout(() => {
69
- player.exitDelayedSeek();
70
- setResumeTimer(null);
71
- }, 2000);
72
-
73
- clearTimeout(resumeTimer);
74
- setResumeTimer(timer);
75
- }
76
- }
77
-
78
- lastPressTime.current = now;
79
- currentOnPressEventType.current = eventType;
80
- },
81
- [resetMultiplier, resumeTimer]
82
- );
83
-
84
- return handlePressEvent;
85
- };
File without changes
File without changes