@livepeer-frameworks/player-react 0.1.0 → 0.1.2

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 (187) hide show
  1. package/README.md +7 -9
  2. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +359 -0
  3. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  4. package/dist/cjs/assets/logomark.svg.js +8 -0
  5. package/dist/cjs/assets/logomark.svg.js.map +1 -0
  6. package/dist/cjs/components/DevModePanel.js +826 -0
  7. package/dist/cjs/components/DevModePanel.js.map +1 -0
  8. package/dist/cjs/components/DvdLogo.js +200 -0
  9. package/dist/cjs/components/DvdLogo.js.map +1 -0
  10. package/dist/cjs/components/Icons.js +439 -0
  11. package/dist/cjs/components/Icons.js.map +1 -0
  12. package/dist/cjs/components/IdleScreen.js +587 -0
  13. package/dist/cjs/components/IdleScreen.js.map +1 -0
  14. package/dist/cjs/components/LoadingScreen.js +523 -0
  15. package/dist/cjs/components/LoadingScreen.js.map +1 -0
  16. package/dist/cjs/components/Player.js +420 -0
  17. package/dist/cjs/components/Player.js.map +1 -0
  18. package/dist/cjs/components/PlayerControls.js +798 -0
  19. package/dist/cjs/components/PlayerControls.js.map +1 -0
  20. package/dist/cjs/components/PlayerErrorBoundary.js +80 -0
  21. package/dist/cjs/components/PlayerErrorBoundary.js.map +1 -0
  22. package/dist/cjs/components/SeekBar.js +253 -0
  23. package/dist/cjs/components/SeekBar.js.map +1 -0
  24. package/dist/cjs/components/SkipIndicator.js +92 -0
  25. package/dist/cjs/components/SkipIndicator.js.map +1 -0
  26. package/dist/cjs/components/SpeedIndicator.js +43 -0
  27. package/dist/cjs/components/SpeedIndicator.js.map +1 -0
  28. package/dist/cjs/components/StatsPanel.js +202 -0
  29. package/dist/cjs/components/StatsPanel.js.map +1 -0
  30. package/dist/cjs/components/StreamStateOverlay.js +229 -0
  31. package/dist/cjs/components/StreamStateOverlay.js.map +1 -0
  32. package/dist/cjs/components/ThumbnailOverlay.js +86 -0
  33. package/dist/cjs/components/ThumbnailOverlay.js.map +1 -0
  34. package/dist/cjs/components/TitleOverlay.js +32 -0
  35. package/dist/cjs/components/TitleOverlay.js.map +1 -0
  36. package/dist/cjs/context/PlayerContext.js +46 -0
  37. package/dist/cjs/context/PlayerContext.js.map +1 -0
  38. package/dist/cjs/hooks/useMetaTrack.js +165 -0
  39. package/dist/cjs/hooks/useMetaTrack.js.map +1 -0
  40. package/dist/cjs/hooks/usePlaybackQuality.js +131 -0
  41. package/dist/cjs/hooks/usePlaybackQuality.js.map +1 -0
  42. package/dist/cjs/hooks/usePlayerController.js +518 -0
  43. package/dist/cjs/hooks/usePlayerController.js.map +1 -0
  44. package/dist/cjs/hooks/usePlayerSelection.js +90 -0
  45. package/dist/cjs/hooks/usePlayerSelection.js.map +1 -0
  46. package/dist/cjs/hooks/useStreamState.js +360 -0
  47. package/dist/cjs/hooks/useStreamState.js.map +1 -0
  48. package/dist/cjs/hooks/useTelemetry.js +120 -0
  49. package/dist/cjs/hooks/useTelemetry.js.map +1 -0
  50. package/dist/cjs/hooks/useViewerEndpoints.js +222 -0
  51. package/dist/cjs/hooks/useViewerEndpoints.js.map +1 -0
  52. package/dist/cjs/index.js +97 -1
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/ui/badge.js +34 -0
  55. package/dist/cjs/ui/badge.js.map +1 -0
  56. package/dist/cjs/ui/button.js +74 -0
  57. package/dist/cjs/ui/button.js.map +1 -0
  58. package/dist/cjs/ui/context-menu.js +163 -0
  59. package/dist/cjs/ui/context-menu.js.map +1 -0
  60. package/dist/cjs/ui/slider.js +60 -0
  61. package/dist/cjs/ui/slider.js.map +1 -0
  62. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  63. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  64. package/dist/esm/assets/logomark.svg.js +4 -0
  65. package/dist/esm/assets/logomark.svg.js.map +1 -0
  66. package/dist/esm/components/DevModePanel.js +822 -0
  67. package/dist/esm/components/DevModePanel.js.map +1 -0
  68. package/dist/esm/components/DvdLogo.js +196 -0
  69. package/dist/esm/components/DvdLogo.js.map +1 -0
  70. package/dist/esm/components/Icons.js +421 -0
  71. package/dist/esm/components/Icons.js.map +1 -0
  72. package/dist/esm/components/IdleScreen.js +582 -0
  73. package/dist/esm/components/IdleScreen.js.map +1 -0
  74. package/dist/esm/components/LoadingScreen.js +519 -0
  75. package/dist/esm/components/LoadingScreen.js.map +1 -0
  76. package/dist/esm/components/Player.js +416 -0
  77. package/dist/esm/components/Player.js.map +1 -0
  78. package/dist/esm/components/PlayerControls.js +794 -0
  79. package/dist/esm/components/PlayerControls.js.map +1 -0
  80. package/dist/esm/components/PlayerErrorBoundary.js +76 -0
  81. package/dist/esm/components/PlayerErrorBoundary.js.map +1 -0
  82. package/dist/esm/components/SeekBar.js +249 -0
  83. package/dist/esm/components/SeekBar.js.map +1 -0
  84. package/dist/esm/components/SkipIndicator.js +88 -0
  85. package/dist/esm/components/SkipIndicator.js.map +1 -0
  86. package/dist/esm/components/SpeedIndicator.js +39 -0
  87. package/dist/esm/components/SpeedIndicator.js.map +1 -0
  88. package/dist/esm/components/StatsPanel.js +198 -0
  89. package/dist/esm/components/StatsPanel.js.map +1 -0
  90. package/dist/esm/components/StreamStateOverlay.js +224 -0
  91. package/dist/esm/components/StreamStateOverlay.js.map +1 -0
  92. package/dist/esm/components/ThumbnailOverlay.js +82 -0
  93. package/dist/esm/components/ThumbnailOverlay.js.map +1 -0
  94. package/dist/esm/components/TitleOverlay.js +28 -0
  95. package/dist/esm/components/TitleOverlay.js.map +1 -0
  96. package/dist/esm/context/PlayerContext.js +41 -0
  97. package/dist/esm/context/PlayerContext.js.map +1 -0
  98. package/dist/esm/hooks/useMetaTrack.js +163 -0
  99. package/dist/esm/hooks/useMetaTrack.js.map +1 -0
  100. package/dist/esm/hooks/usePlaybackQuality.js +129 -0
  101. package/dist/esm/hooks/usePlaybackQuality.js.map +1 -0
  102. package/dist/esm/hooks/usePlayerController.js +516 -0
  103. package/dist/esm/hooks/usePlayerController.js.map +1 -0
  104. package/dist/esm/hooks/usePlayerSelection.js +88 -0
  105. package/dist/esm/hooks/usePlayerSelection.js.map +1 -0
  106. package/dist/esm/hooks/useStreamState.js +358 -0
  107. package/dist/esm/hooks/useStreamState.js.map +1 -0
  108. package/dist/esm/hooks/useTelemetry.js +118 -0
  109. package/dist/esm/hooks/useTelemetry.js.map +1 -0
  110. package/dist/esm/hooks/useViewerEndpoints.js +220 -0
  111. package/dist/esm/hooks/useViewerEndpoints.js.map +1 -0
  112. package/dist/esm/index.js +23 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/ui/badge.js +31 -0
  115. package/dist/esm/ui/badge.js.map +1 -0
  116. package/dist/esm/ui/button.js +52 -0
  117. package/dist/esm/ui/button.js.map +1 -0
  118. package/dist/esm/ui/context-menu.js +132 -0
  119. package/dist/esm/ui/context-menu.js.map +1 -0
  120. package/dist/esm/ui/slider.js +38 -0
  121. package/dist/esm/ui/slider.js.map +1 -0
  122. package/dist/types/components/DvdLogo.d.ts +1 -1
  123. package/dist/types/components/Icons.d.ts +1 -1
  124. package/dist/types/components/Player.d.ts +1 -1
  125. package/dist/types/components/PlayerErrorBoundary.d.ts +2 -1
  126. package/dist/types/components/StreamStateOverlay.d.ts +2 -2
  127. package/dist/types/components/SubtitleRenderer.d.ts +2 -2
  128. package/dist/types/context/PlayerContext.d.ts +2 -2
  129. package/dist/types/context/index.d.ts +2 -2
  130. package/dist/types/hooks/useMetaTrack.d.ts +3 -3
  131. package/dist/types/hooks/usePlaybackQuality.d.ts +2 -2
  132. package/dist/types/hooks/usePlayerController.d.ts +26 -3
  133. package/dist/types/hooks/usePlayerSelection.d.ts +1 -1
  134. package/dist/types/hooks/useStreamState.d.ts +1 -1
  135. package/dist/types/hooks/useTelemetry.d.ts +1 -1
  136. package/dist/types/hooks/useViewerEndpoints.d.ts +3 -3
  137. package/dist/types/index.d.ts +28 -28
  138. package/dist/types/types.d.ts +3 -3
  139. package/dist/types/ui/select.d.ts +1 -1
  140. package/package.json +22 -14
  141. package/src/components/DevModePanel.tsx +244 -143
  142. package/src/components/DvdLogo.tsx +1 -1
  143. package/src/components/Icons.tsx +105 -25
  144. package/src/components/IdleScreen.tsx +262 -128
  145. package/src/components/LoadingScreen.tsx +169 -151
  146. package/src/components/LogoOverlay.tsx +3 -6
  147. package/src/components/Player.tsx +126 -59
  148. package/src/components/PlayerControls.tsx +384 -272
  149. package/src/components/PlayerErrorBoundary.tsx +7 -13
  150. package/src/components/SeekBar.tsx +96 -88
  151. package/src/components/SkipIndicator.tsx +2 -12
  152. package/src/components/SpeedIndicator.tsx +2 -11
  153. package/src/components/StatsPanel.tsx +31 -22
  154. package/src/components/StreamStateOverlay.tsx +105 -49
  155. package/src/components/SubtitleRenderer.tsx +29 -29
  156. package/src/components/ThumbnailOverlay.tsx +5 -6
  157. package/src/components/TitleOverlay.tsx +2 -8
  158. package/src/context/PlayerContext.tsx +4 -8
  159. package/src/context/index.ts +3 -3
  160. package/src/hooks/useMetaTrack.ts +27 -27
  161. package/src/hooks/usePlaybackQuality.ts +3 -3
  162. package/src/hooks/usePlayerController.ts +246 -138
  163. package/src/hooks/usePlayerSelection.ts +6 -6
  164. package/src/hooks/useStreamState.ts +51 -56
  165. package/src/hooks/useTelemetry.ts +18 -3
  166. package/src/hooks/useViewerEndpoints.ts +34 -23
  167. package/src/index.tsx +36 -28
  168. package/src/types.ts +8 -8
  169. package/src/ui/badge.tsx +6 -5
  170. package/src/ui/button.tsx +9 -8
  171. package/src/ui/context-menu.tsx +42 -61
  172. package/src/ui/select.tsx +13 -7
  173. package/src/ui/slider.tsx +18 -29
  174. package/dist/types/components/players/DashJsPlayer.d.ts +0 -18
  175. package/dist/types/components/players/HlsJsPlayer.d.ts +0 -18
  176. package/dist/types/components/players/MewsWsPlayer/index.d.ts +0 -18
  177. package/dist/types/components/players/MistPlayer.d.ts +0 -20
  178. package/dist/types/components/players/MistWebRTCPlayer/index.d.ts +0 -20
  179. package/dist/types/components/players/NativePlayer.d.ts +0 -19
  180. package/dist/types/components/players/VideoJsPlayer.d.ts +0 -18
  181. package/src/components/players/DashJsPlayer.tsx +0 -56
  182. package/src/components/players/HlsJsPlayer.tsx +0 -56
  183. package/src/components/players/MewsWsPlayer/index.tsx +0 -56
  184. package/src/components/players/MistPlayer.tsx +0 -60
  185. package/src/components/players/MistWebRTCPlayer/index.tsx +0 -59
  186. package/src/components/players/NativePlayer.tsx +0 -58
  187. package/src/components/players/VideoJsPlayer.tsx +0 -56
@@ -0,0 +1,516 @@
1
+ import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { useRef, useState, useEffect, useCallback } from 'react';
3
+ import { PlayerController } from '@livepeer-frameworks/player-core';
4
+
5
+ var _excluded = ["enabled", "onStateChange", "onStreamStateChange", "onError", "onReady", "onProtocolSwapped", "onPlaybackFailed"];
6
+ // ============================================================================
7
+ // Initial State
8
+ // ============================================================================
9
+ var initialState = {
10
+ state: "booting",
11
+ streamState: null,
12
+ endpoints: null,
13
+ metadata: null,
14
+ videoElement: null,
15
+ currentTime: 0,
16
+ duration: NaN,
17
+ isPlaying: false,
18
+ isPaused: true,
19
+ isBuffering: false,
20
+ isMuted: true,
21
+ volume: 1,
22
+ error: null,
23
+ errorDetails: null,
24
+ isPassiveError: false,
25
+ hasPlaybackStarted: false,
26
+ isHoldingSpeed: false,
27
+ holdSpeed: 2,
28
+ isHovering: false,
29
+ shouldShowControls: false,
30
+ isLoopEnabled: false,
31
+ isFullscreen: false,
32
+ isPiPActive: false,
33
+ isEffectivelyLive: false,
34
+ shouldShowIdleScreen: true,
35
+ currentPlayerInfo: null,
36
+ currentSourceInfo: null,
37
+ playbackQuality: null,
38
+ subtitlesEnabled: false,
39
+ qualities: [],
40
+ textTracks: [],
41
+ streamInfo: null,
42
+ toast: null
43
+ };
44
+ // ============================================================================
45
+ // Hook
46
+ // ============================================================================
47
+ function usePlayerController(config) {
48
+ var _config$enabled = config.enabled,
49
+ enabled = _config$enabled === void 0 ? true : _config$enabled,
50
+ onStateChange = config.onStateChange,
51
+ onStreamStateChange = config.onStreamStateChange,
52
+ onError = config.onError,
53
+ onReady = config.onReady,
54
+ onProtocolSwapped = config.onProtocolSwapped,
55
+ onPlaybackFailed = config.onPlaybackFailed,
56
+ controllerConfig = _objectWithoutProperties(config, _excluded);
57
+ var containerRef = useRef(null);
58
+ var controllerRef = useRef(null);
59
+ var _useState = useState(initialState),
60
+ _useState2 = _slicedToArray(_useState, 2),
61
+ state = _useState2[0],
62
+ setState = _useState2[1];
63
+ // Stable config ref for effect dependencies
64
+ var configRef = useRef(controllerConfig);
65
+ configRef.current = controllerConfig;
66
+ // Create and attach controller
67
+ useEffect(function () {
68
+ if (!enabled) return;
69
+ var container = containerRef.current;
70
+ if (!container) return;
71
+ // Create controller
72
+ var controller = new PlayerController({
73
+ contentId: configRef.current.contentId,
74
+ contentType: configRef.current.contentType,
75
+ endpoints: configRef.current.endpoints,
76
+ gatewayUrl: configRef.current.gatewayUrl,
77
+ mistUrl: configRef.current.mistUrl,
78
+ authToken: configRef.current.authToken,
79
+ autoplay: configRef.current.autoplay,
80
+ muted: configRef.current.muted,
81
+ controls: configRef.current.controls,
82
+ poster: configRef.current.poster,
83
+ debug: configRef.current.debug
84
+ });
85
+ controllerRef.current = controller;
86
+ // Subscribe to events
87
+ var unsubs = [];
88
+ // Sync state from controller - called on video events
89
+ var syncState = function syncState() {
90
+ if (!controllerRef.current) return;
91
+ var c = controllerRef.current;
92
+ setState(function (prev) {
93
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
94
+ isPlaying: c.isPlaying(),
95
+ isPaused: c.isPaused(),
96
+ isBuffering: c.isBuffering(),
97
+ isMuted: c.isMuted(),
98
+ volume: c.getVolume(),
99
+ hasPlaybackStarted: c.hasPlaybackStarted(),
100
+ shouldShowControls: c.shouldShowControls(),
101
+ shouldShowIdleScreen: c.shouldShowIdleScreen(),
102
+ playbackQuality: c.getPlaybackQuality(),
103
+ isLoopEnabled: c.isLoopEnabled(),
104
+ subtitlesEnabled: c.isSubtitlesEnabled(),
105
+ qualities: c.getQualities(),
106
+ streamInfo: c.getStreamInfo()
107
+ });
108
+ });
109
+ };
110
+ unsubs.push(controller.on("stateChange", function (_ref) {
111
+ var newState = _ref.state;
112
+ setState(function (prev) {
113
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
114
+ state: newState
115
+ });
116
+ });
117
+ onStateChange === null || onStateChange === void 0 || onStateChange(newState);
118
+ }));
119
+ unsubs.push(controller.on("streamStateChange", function (_ref2) {
120
+ var streamState = _ref2.state;
121
+ setState(function (prev) {
122
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
123
+ streamState: streamState,
124
+ metadata: controller.getMetadata(),
125
+ isEffectivelyLive: controller.isEffectivelyLive(),
126
+ shouldShowIdleScreen: controller.shouldShowIdleScreen()
127
+ });
128
+ });
129
+ onStreamStateChange === null || onStreamStateChange === void 0 || onStreamStateChange(streamState);
130
+ }));
131
+ unsubs.push(controller.on("timeUpdate", function (_ref3) {
132
+ var currentTime = _ref3.currentTime,
133
+ duration = _ref3.duration;
134
+ setState(function (prev) {
135
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
136
+ currentTime: currentTime,
137
+ duration: duration
138
+ });
139
+ });
140
+ }));
141
+ unsubs.push(controller.on("error", function (_ref4) {
142
+ var error = _ref4.error;
143
+ setState(function (prev) {
144
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
145
+ error: error,
146
+ isPassiveError: controller.isPassiveError()
147
+ });
148
+ });
149
+ onError === null || onError === void 0 || onError(error);
150
+ }));
151
+ unsubs.push(controller.on("errorCleared", function () {
152
+ setState(function (prev) {
153
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
154
+ error: null,
155
+ isPassiveError: false
156
+ });
157
+ });
158
+ }));
159
+ unsubs.push(controller.on("ready", function (_ref5) {
160
+ var videoElement = _ref5.videoElement;
161
+ setState(function (prev) {
162
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
163
+ videoElement: videoElement,
164
+ endpoints: controller.getEndpoints(),
165
+ metadata: controller.getMetadata(),
166
+ streamInfo: controller.getStreamInfo(),
167
+ isEffectivelyLive: controller.isEffectivelyLive(),
168
+ shouldShowIdleScreen: controller.shouldShowIdleScreen(),
169
+ currentPlayerInfo: controller.getCurrentPlayerInfo(),
170
+ currentSourceInfo: controller.getCurrentSourceInfo(),
171
+ qualities: controller.getQualities()
172
+ });
173
+ });
174
+ onReady === null || onReady === void 0 || onReady(videoElement);
175
+ // Set up video event listeners AFTER video is ready
176
+ // syncState is defined below - this closure captures it
177
+ var handleVideoEvent = function handleVideoEvent() {
178
+ var _controllerRef$curren, _controllerRef$curren2;
179
+ if ((_controllerRef$curren = controllerRef.current) !== null && _controllerRef$curren !== void 0 && (_controllerRef$curren2 = _controllerRef$curren.shouldSuppressVideoEvents) !== null && _controllerRef$curren2 !== void 0 && _controllerRef$curren2.call(_controllerRef$curren)) return;
180
+ syncState();
181
+ };
182
+ videoElement.addEventListener("play", handleVideoEvent);
183
+ videoElement.addEventListener("pause", handleVideoEvent);
184
+ videoElement.addEventListener("waiting", handleVideoEvent);
185
+ videoElement.addEventListener("playing", handleVideoEvent);
186
+ unsubs.push(function () {
187
+ videoElement.removeEventListener("play", handleVideoEvent);
188
+ videoElement.removeEventListener("pause", handleVideoEvent);
189
+ videoElement.removeEventListener("waiting", handleVideoEvent);
190
+ videoElement.removeEventListener("playing", handleVideoEvent);
191
+ });
192
+ }));
193
+ unsubs.push(controller.on("playerSelected", function (_ref6) {
194
+ _ref6.player;
195
+ var source = _ref6.source;
196
+ setState(function (prev) {
197
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
198
+ currentPlayerInfo: controller.getCurrentPlayerInfo(),
199
+ currentSourceInfo: {
200
+ url: source.url,
201
+ type: source.type
202
+ },
203
+ qualities: controller.getQualities()
204
+ });
205
+ });
206
+ }));
207
+ unsubs.push(controller.on("volumeChange", function (_ref7) {
208
+ var volume = _ref7.volume,
209
+ muted = _ref7.muted;
210
+ setState(function (prev) {
211
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
212
+ volume: volume,
213
+ isMuted: muted
214
+ });
215
+ });
216
+ }));
217
+ unsubs.push(controller.on("loopChange", function (_ref8) {
218
+ var isLoopEnabled = _ref8.isLoopEnabled;
219
+ setState(function (prev) {
220
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
221
+ isLoopEnabled: isLoopEnabled
222
+ });
223
+ });
224
+ }));
225
+ unsubs.push(controller.on("fullscreenChange", function (_ref9) {
226
+ var isFullscreen = _ref9.isFullscreen;
227
+ setState(function (prev) {
228
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
229
+ isFullscreen: isFullscreen
230
+ });
231
+ });
232
+ }));
233
+ unsubs.push(controller.on("pipChange", function (_ref0) {
234
+ var isPiP = _ref0.isPiP;
235
+ setState(function (prev) {
236
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
237
+ isPiPActive: isPiP
238
+ });
239
+ });
240
+ }));
241
+ unsubs.push(controller.on("holdSpeedStart", function (_ref1) {
242
+ var speed = _ref1.speed;
243
+ setState(function (prev) {
244
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
245
+ isHoldingSpeed: true,
246
+ holdSpeed: speed
247
+ });
248
+ });
249
+ }));
250
+ unsubs.push(controller.on("holdSpeedEnd", function () {
251
+ setState(function (prev) {
252
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
253
+ isHoldingSpeed: false
254
+ });
255
+ });
256
+ }));
257
+ unsubs.push(controller.on("hoverStart", function () {
258
+ setState(function (prev) {
259
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
260
+ isHovering: true,
261
+ shouldShowControls: true
262
+ });
263
+ });
264
+ }));
265
+ unsubs.push(controller.on("hoverEnd", function () {
266
+ setState(function (prev) {
267
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
268
+ isHovering: false,
269
+ shouldShowControls: controller.shouldShowControls()
270
+ });
271
+ });
272
+ }));
273
+ unsubs.push(controller.on("captionsChange", function (_ref10) {
274
+ var enabled = _ref10.enabled;
275
+ setState(function (prev) {
276
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
277
+ subtitlesEnabled: enabled
278
+ });
279
+ });
280
+ }));
281
+ // Error handling events - show toasts/modals
282
+ unsubs.push(controller.on("protocolSwapped", function (data) {
283
+ var message = "Switched to ".concat(data.toProtocol);
284
+ setState(function (prev) {
285
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
286
+ toast: {
287
+ message: message,
288
+ timestamp: Date.now()
289
+ }
290
+ });
291
+ });
292
+ onProtocolSwapped === null || onProtocolSwapped === void 0 || onProtocolSwapped(data);
293
+ }));
294
+ unsubs.push(controller.on("playbackFailed", function (data) {
295
+ setState(function (prev) {
296
+ var _data$details;
297
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
298
+ error: data.message,
299
+ errorDetails: (_data$details = data.details) !== null && _data$details !== void 0 ? _data$details : null,
300
+ isPassiveError: false
301
+ });
302
+ });
303
+ onPlaybackFailed === null || onPlaybackFailed === void 0 || onPlaybackFailed({
304
+ code: data.code,
305
+ message: data.message,
306
+ details: data.details
307
+ });
308
+ }));
309
+ // Attach controller to container
310
+ // Note: Video event listeners are set up in the 'ready' handler above
311
+ controller.attach(container)["catch"](function (err) {
312
+ console.warn("[usePlayerController] Attach failed:", err);
313
+ });
314
+ // Set initial state
315
+ setState(function (prev) {
316
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
317
+ isLoopEnabled: controller.isLoopEnabled()
318
+ });
319
+ });
320
+ return function () {
321
+ unsubs.forEach(function (fn) {
322
+ return fn();
323
+ });
324
+ controller.destroy();
325
+ controllerRef.current = null;
326
+ setState(initialState);
327
+ };
328
+ }, [enabled, config.contentId, config.contentType]); // Re-create on content change
329
+ // Stable action callbacks
330
+ var play = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
331
+ var _controllerRef$curren3;
332
+ return _regenerator().w(function (_context) {
333
+ while (1) switch (_context.n) {
334
+ case 0:
335
+ _context.n = 1;
336
+ return (_controllerRef$curren3 = controllerRef.current) === null || _controllerRef$curren3 === void 0 ? void 0 : _controllerRef$curren3.play();
337
+ case 1:
338
+ return _context.a(2);
339
+ }
340
+ }, _callee);
341
+ })), []);
342
+ var pause = useCallback(function () {
343
+ var _controllerRef$curren4;
344
+ (_controllerRef$curren4 = controllerRef.current) === null || _controllerRef$curren4 === void 0 || _controllerRef$curren4.pause();
345
+ }, []);
346
+ var togglePlay = useCallback(function () {
347
+ var _controllerRef$curren5;
348
+ (_controllerRef$curren5 = controllerRef.current) === null || _controllerRef$curren5 === void 0 || _controllerRef$curren5.togglePlay();
349
+ }, []);
350
+ var seek = useCallback(function (time) {
351
+ var _controllerRef$curren6;
352
+ (_controllerRef$curren6 = controllerRef.current) === null || _controllerRef$curren6 === void 0 || _controllerRef$curren6.seek(time);
353
+ }, []);
354
+ var seekBy = useCallback(function (delta) {
355
+ var _controllerRef$curren7;
356
+ (_controllerRef$curren7 = controllerRef.current) === null || _controllerRef$curren7 === void 0 || _controllerRef$curren7.seekBy(delta);
357
+ }, []);
358
+ var setVolume = useCallback(function (volume) {
359
+ var _controllerRef$curren8;
360
+ (_controllerRef$curren8 = controllerRef.current) === null || _controllerRef$curren8 === void 0 || _controllerRef$curren8.setVolume(volume);
361
+ }, []);
362
+ var toggleMute = useCallback(function () {
363
+ var _controllerRef$curren9;
364
+ (_controllerRef$curren9 = controllerRef.current) === null || _controllerRef$curren9 === void 0 || _controllerRef$curren9.toggleMute();
365
+ }, []);
366
+ var toggleLoop = useCallback(function () {
367
+ var _controllerRef$curren0;
368
+ (_controllerRef$curren0 = controllerRef.current) === null || _controllerRef$curren0 === void 0 || _controllerRef$curren0.toggleLoop();
369
+ }, []);
370
+ var toggleFullscreen = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
371
+ var _controllerRef$curren1;
372
+ return _regenerator().w(function (_context2) {
373
+ while (1) switch (_context2.n) {
374
+ case 0:
375
+ _context2.n = 1;
376
+ return (_controllerRef$curren1 = controllerRef.current) === null || _controllerRef$curren1 === void 0 ? void 0 : _controllerRef$curren1.toggleFullscreen();
377
+ case 1:
378
+ return _context2.a(2);
379
+ }
380
+ }, _callee2);
381
+ })), []);
382
+ var togglePiP = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
383
+ var _controllerRef$curren10;
384
+ return _regenerator().w(function (_context3) {
385
+ while (1) switch (_context3.n) {
386
+ case 0:
387
+ _context3.n = 1;
388
+ return (_controllerRef$curren10 = controllerRef.current) === null || _controllerRef$curren10 === void 0 ? void 0 : _controllerRef$curren10.togglePictureInPicture();
389
+ case 1:
390
+ return _context3.a(2);
391
+ }
392
+ }, _callee3);
393
+ })), []);
394
+ var toggleSubtitles = useCallback(function () {
395
+ var _controllerRef$curren11;
396
+ (_controllerRef$curren11 = controllerRef.current) === null || _controllerRef$curren11 === void 0 || _controllerRef$curren11.toggleSubtitles();
397
+ }, []);
398
+ var clearError = useCallback(function () {
399
+ var _controllerRef$curren12;
400
+ (_controllerRef$curren12 = controllerRef.current) === null || _controllerRef$curren12 === void 0 || _controllerRef$curren12.clearError();
401
+ setState(function (prev) {
402
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
403
+ error: null,
404
+ errorDetails: null,
405
+ isPassiveError: false
406
+ });
407
+ });
408
+ }, []);
409
+ var dismissToast = useCallback(function () {
410
+ setState(function (prev) {
411
+ return _objectSpread2(_objectSpread2({}, prev), {}, {
412
+ toast: null
413
+ });
414
+ });
415
+ }, []);
416
+ var jumpToLive = useCallback(function () {
417
+ var _controllerRef$curren13;
418
+ (_controllerRef$curren13 = controllerRef.current) === null || _controllerRef$curren13 === void 0 || _controllerRef$curren13.jumpToLive();
419
+ }, []);
420
+ var retry = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
421
+ var _controllerRef$curren14;
422
+ return _regenerator().w(function (_context4) {
423
+ while (1) switch (_context4.n) {
424
+ case 0:
425
+ _context4.n = 1;
426
+ return (_controllerRef$curren14 = controllerRef.current) === null || _controllerRef$curren14 === void 0 ? void 0 : _controllerRef$curren14.retry();
427
+ case 1:
428
+ return _context4.a(2);
429
+ }
430
+ }, _callee4);
431
+ })), []);
432
+ var reload = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
433
+ var _controllerRef$curren15;
434
+ return _regenerator().w(function (_context5) {
435
+ while (1) switch (_context5.n) {
436
+ case 0:
437
+ _context5.n = 1;
438
+ return (_controllerRef$curren15 = controllerRef.current) === null || _controllerRef$curren15 === void 0 ? void 0 : _controllerRef$curren15.reload();
439
+ case 1:
440
+ return _context5.a(2);
441
+ }
442
+ }, _callee5);
443
+ })), []);
444
+ var getQualities = useCallback(function () {
445
+ var _controllerRef$curren16, _controllerRef$curren17;
446
+ return (_controllerRef$curren16 = (_controllerRef$curren17 = controllerRef.current) === null || _controllerRef$curren17 === void 0 ? void 0 : _controllerRef$curren17.getQualities()) !== null && _controllerRef$curren16 !== void 0 ? _controllerRef$curren16 : [];
447
+ }, []);
448
+ var selectQuality = useCallback(function (id) {
449
+ var _controllerRef$curren18;
450
+ (_controllerRef$curren18 = controllerRef.current) === null || _controllerRef$curren18 === void 0 || _controllerRef$curren18.selectQuality(id);
451
+ }, []);
452
+ var handleMouseEnter = useCallback(function () {
453
+ var _controllerRef$curren19;
454
+ (_controllerRef$curren19 = controllerRef.current) === null || _controllerRef$curren19 === void 0 || _controllerRef$curren19.handleMouseEnter();
455
+ }, []);
456
+ var handleMouseLeave = useCallback(function () {
457
+ var _controllerRef$curren20;
458
+ (_controllerRef$curren20 = controllerRef.current) === null || _controllerRef$curren20 === void 0 || _controllerRef$curren20.handleMouseLeave();
459
+ }, []);
460
+ var handleMouseMove = useCallback(function () {
461
+ var _controllerRef$curren21;
462
+ (_controllerRef$curren21 = controllerRef.current) === null || _controllerRef$curren21 === void 0 || _controllerRef$curren21.handleMouseMove();
463
+ }, []);
464
+ var handleTouchStart = useCallback(function () {
465
+ var _controllerRef$curren22;
466
+ (_controllerRef$curren22 = controllerRef.current) === null || _controllerRef$curren22 === void 0 || _controllerRef$curren22.handleTouchStart();
467
+ }, []);
468
+ var setDevModeOptions = useCallback(/*#__PURE__*/function () {
469
+ var _ref16 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(options) {
470
+ var _controllerRef$curren23;
471
+ return _regenerator().w(function (_context6) {
472
+ while (1) switch (_context6.n) {
473
+ case 0:
474
+ _context6.n = 1;
475
+ return (_controllerRef$curren23 = controllerRef.current) === null || _controllerRef$curren23 === void 0 ? void 0 : _controllerRef$curren23.setDevModeOptions(options);
476
+ case 1:
477
+ return _context6.a(2);
478
+ }
479
+ }, _callee6);
480
+ }));
481
+ return function (_x) {
482
+ return _ref16.apply(this, arguments);
483
+ };
484
+ }(), []);
485
+ return {
486
+ containerRef: containerRef,
487
+ state: state,
488
+ controller: controllerRef.current,
489
+ play: play,
490
+ pause: pause,
491
+ togglePlay: togglePlay,
492
+ seek: seek,
493
+ seekBy: seekBy,
494
+ jumpToLive: jumpToLive,
495
+ setVolume: setVolume,
496
+ toggleMute: toggleMute,
497
+ toggleLoop: toggleLoop,
498
+ toggleFullscreen: toggleFullscreen,
499
+ togglePiP: togglePiP,
500
+ toggleSubtitles: toggleSubtitles,
501
+ clearError: clearError,
502
+ dismissToast: dismissToast,
503
+ retry: retry,
504
+ reload: reload,
505
+ getQualities: getQualities,
506
+ selectQuality: selectQuality,
507
+ handleMouseEnter: handleMouseEnter,
508
+ handleMouseLeave: handleMouseLeave,
509
+ handleMouseMove: handleMouseMove,
510
+ handleTouchStart: handleTouchStart,
511
+ setDevModeOptions: setDevModeOptions
512
+ };
513
+ }
514
+
515
+ export { usePlayerController };
516
+ //# sourceMappingURL=usePlayerController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePlayerController.js","sources":["../../../../src/hooks/usePlayerController.ts"],"sourcesContent":["/**\n * usePlayerController.ts\n *\n * React hook that wraps PlayerController for declarative usage.\n * Manages the complete player lifecycle and provides reactive state.\n */\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n PlayerController,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n} from \"@livepeer-frameworks/player-core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UsePlayerControllerConfig extends Omit<PlayerControllerConfig, \"playerManager\"> {\n /** Enable/disable the hook */\n enabled?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: PlayerState) => void;\n /** Callback when stream state changes */\n onStreamStateChange?: (state: StreamState) => void;\n /** Callback when error occurs */\n onError?: (error: string) => void;\n /** Callback when ready */\n onReady?: (videoElement: HTMLVideoElement) => void;\n /** Callback when protocol is swapped (for toast notification) */\n onProtocolSwapped?: (data: {\n fromPlayer: string;\n toPlayer: string;\n fromProtocol: string;\n toProtocol: string;\n reason: string;\n }) => void;\n /** Callback when playback fails after all recovery attempts (for error modal) */\n onPlaybackFailed?: (error: {\n code: string;\n message: string;\n details?: ClassifiedError[\"details\"];\n }) => void;\n}\n\nexport interface PlayerControllerState {\n /** Current player state */\n state: PlayerState;\n /** Stream state (for live streams) */\n streamState: StreamState | null;\n /** Resolved endpoints */\n endpoints: ContentEndpoints | null;\n /** Content metadata */\n metadata: ContentMetadata | null;\n /** Video element (null if not ready) */\n videoElement: HTMLVideoElement | null;\n /** Current time */\n currentTime: number;\n /** Duration */\n duration: number;\n /** Is playing */\n isPlaying: boolean;\n /** Is paused */\n isPaused: boolean;\n /** Is buffering */\n isBuffering: boolean;\n /** Is muted */\n isMuted: boolean;\n /** Volume (0-1) */\n volume: number;\n /** Error text */\n error: string | null;\n /** Error details for debugging */\n errorDetails: ClassifiedError[\"details\"] | null;\n /** Is passive error */\n isPassiveError: boolean;\n /** Has playback ever started */\n hasPlaybackStarted: boolean;\n /** Is holding speed (2x gesture) */\n isHoldingSpeed: boolean;\n /** Current hold speed */\n holdSpeed: number;\n /** Is hovering (controls visible) */\n isHovering: boolean;\n /** Should show controls */\n shouldShowControls: boolean;\n /** Is loop enabled */\n isLoopEnabled: boolean;\n /** Is fullscreen */\n isFullscreen: boolean;\n /** Is PiP active */\n isPiPActive: boolean;\n /** Is effectively live (live or DVR recording) */\n isEffectivelyLive: boolean;\n /** Should show idle screen */\n shouldShowIdleScreen: boolean;\n /** Current player info */\n currentPlayerInfo: { name: string; shortname: string } | null;\n /** Current source info */\n currentSourceInfo: { url: string; type: string } | null;\n /** Playback quality metrics */\n playbackQuality: PlaybackQuality | null;\n /** Subtitles enabled */\n subtitlesEnabled: boolean;\n /** Available quality levels */\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n /** Available text/caption tracks */\n textTracks: Array<{ id: string; label: string; language?: string; active: boolean }>;\n /** Stream info for player selection (sources + tracks) */\n streamInfo: StreamInfo | null;\n /** Toast message to display (auto-dismisses) */\n toast: { message: string; timestamp: number } | null;\n}\n\nexport interface UsePlayerControllerReturn {\n /** Container ref to attach to your player container div */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Current state (reactive) */\n state: PlayerControllerState;\n /** Controller instance (for direct method calls) */\n controller: PlayerController | null;\n /** Play */\n play: () => Promise<void>;\n /** Pause */\n pause: () => void;\n /** Toggle play/pause */\n togglePlay: () => void;\n /** Seek to time */\n seek: (time: number) => void;\n /** Seek by delta */\n seekBy: (delta: number) => void;\n /** Jump to live edge (for live streams) */\n jumpToLive: () => void;\n /** Set volume */\n setVolume: (volume: number) => void;\n /** Toggle mute */\n toggleMute: () => void;\n /** Toggle loop */\n toggleLoop: () => void;\n /** Toggle fullscreen */\n toggleFullscreen: () => Promise<void>;\n /** Toggle PiP */\n togglePiP: () => Promise<void>;\n /** Toggle subtitles */\n toggleSubtitles: () => void;\n /** Clear error */\n clearError: () => void;\n /** Dismiss toast notification */\n dismissToast: () => void;\n /** Retry playback */\n retry: () => Promise<void>;\n /** Reload player */\n reload: () => Promise<void>;\n /** Get qualities */\n getQualities: () => Array<{ id: string; label: string; bitrate?: number }>;\n /** Select quality */\n selectQuality: (id: string) => void;\n /** Handle mouse enter (for controls visibility) */\n handleMouseEnter: () => void;\n /** Handle mouse leave (for controls visibility) */\n handleMouseLeave: () => void;\n /** Handle mouse move (for controls visibility) */\n handleMouseMove: () => void;\n /** Handle touch start (for controls visibility) */\n handleTouchStart: () => void;\n /** Set dev mode options (force player, type, source) */\n setDevModeOptions: (options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) => Promise<void>;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialState: PlayerControllerState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: true,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function usePlayerController(config: UsePlayerControllerConfig): UsePlayerControllerReturn {\n const {\n enabled = true,\n onStateChange,\n onStreamStateChange,\n onError,\n onReady,\n onProtocolSwapped,\n onPlaybackFailed,\n ...controllerConfig\n } = config;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const controllerRef = useRef<PlayerController | null>(null);\n const [state, setState] = useState<PlayerControllerState>(initialState);\n\n // Stable config ref for effect dependencies\n const configRef = useRef(controllerConfig);\n configRef.current = controllerConfig;\n\n // Create and attach controller\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Create controller\n const controller = new PlayerController({\n contentId: configRef.current.contentId,\n contentType: configRef.current.contentType,\n endpoints: configRef.current.endpoints,\n gatewayUrl: configRef.current.gatewayUrl,\n mistUrl: configRef.current.mistUrl,\n authToken: configRef.current.authToken,\n autoplay: configRef.current.autoplay,\n muted: configRef.current.muted,\n controls: configRef.current.controls,\n poster: configRef.current.poster,\n debug: configRef.current.debug,\n });\n\n controllerRef.current = controller;\n\n // Subscribe to events\n const unsubs: Array<() => void> = [];\n\n // Sync state from controller - called on video events\n const syncState = () => {\n if (!controllerRef.current) return;\n const c = controllerRef.current;\n setState((prev) => ({\n ...prev,\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n streamInfo: c.getStreamInfo(),\n }));\n };\n\n unsubs.push(\n controller.on(\"stateChange\", ({ state: newState }) => {\n setState((prev) => ({ ...prev, state: newState }));\n onStateChange?.(newState);\n })\n );\n\n unsubs.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n setState((prev) => ({\n ...prev,\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n }));\n onStreamStateChange?.(streamState);\n })\n );\n\n unsubs.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n setState((prev) => ({ ...prev, currentTime, duration }));\n })\n );\n\n unsubs.push(\n controller.on(\"error\", ({ error }) => {\n setState((prev) => ({\n ...prev,\n error,\n isPassiveError: controller.isPassiveError(),\n }));\n onError?.(error);\n })\n );\n\n unsubs.push(\n controller.on(\"errorCleared\", () => {\n setState((prev) => ({ ...prev, error: null, isPassiveError: false }));\n })\n );\n\n unsubs.push(\n controller.on(\"ready\", ({ videoElement }) => {\n setState((prev) => ({\n ...prev,\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n }));\n onReady?.(videoElement);\n\n // Set up video event listeners AFTER video is ready\n // syncState is defined below - this closure captures it\n const handleVideoEvent = () => {\n if (controllerRef.current?.shouldSuppressVideoEvents?.()) return;\n syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n unsubs.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n unsubs.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n setState((prev) => ({\n ...prev,\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n }));\n })\n );\n\n unsubs.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n setState((prev) => ({ ...prev, volume, isMuted: muted }));\n })\n );\n\n unsubs.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n setState((prev) => ({ ...prev, isLoopEnabled }));\n })\n );\n\n unsubs.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n setState((prev) => ({ ...prev, isFullscreen }));\n })\n );\n\n unsubs.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n setState((prev) => ({ ...prev, isPiPActive: isPiP }));\n })\n );\n\n unsubs.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n setState((prev) => ({ ...prev, isHoldingSpeed: true, holdSpeed: speed }));\n })\n );\n\n unsubs.push(\n controller.on(\"holdSpeedEnd\", () => {\n setState((prev) => ({ ...prev, isHoldingSpeed: false }));\n })\n );\n\n unsubs.push(\n controller.on(\"hoverStart\", () => {\n setState((prev) => ({ ...prev, isHovering: true, shouldShowControls: true }));\n })\n );\n\n unsubs.push(\n controller.on(\"hoverEnd\", () => {\n setState((prev) => ({\n ...prev,\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n }));\n })\n );\n\n unsubs.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n setState((prev) => ({ ...prev, subtitlesEnabled: enabled }));\n })\n );\n\n // Error handling events - show toasts/modals\n unsubs.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n setState((prev) => ({ ...prev, toast: { message, timestamp: Date.now() } }));\n onProtocolSwapped?.(data);\n })\n );\n\n unsubs.push(\n controller.on(\"playbackFailed\", (data) => {\n setState((prev) => ({\n ...prev,\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n }));\n onPlaybackFailed?.({\n code: data.code,\n message: data.message,\n details: data.details,\n });\n })\n );\n\n // Attach controller to container\n // Note: Video event listeners are set up in the 'ready' handler above\n controller.attach(container).catch((err) => {\n console.warn(\"[usePlayerController] Attach failed:\", err);\n });\n\n // Set initial state\n setState((prev) => ({\n ...prev,\n isLoopEnabled: controller.isLoopEnabled(),\n }));\n\n return () => {\n unsubs.forEach((fn) => fn());\n controller.destroy();\n controllerRef.current = null;\n setState(initialState);\n };\n }, [enabled, config.contentId, config.contentType]); // Re-create on content change\n\n // Stable action callbacks\n const play = useCallback(async () => {\n await controllerRef.current?.play();\n }, []);\n\n const pause = useCallback(() => {\n controllerRef.current?.pause();\n }, []);\n\n const togglePlay = useCallback(() => {\n controllerRef.current?.togglePlay();\n }, []);\n\n const seek = useCallback((time: number) => {\n controllerRef.current?.seek(time);\n }, []);\n\n const seekBy = useCallback((delta: number) => {\n controllerRef.current?.seekBy(delta);\n }, []);\n\n const setVolume = useCallback((volume: number) => {\n controllerRef.current?.setVolume(volume);\n }, []);\n\n const toggleMute = useCallback(() => {\n controllerRef.current?.toggleMute();\n }, []);\n\n const toggleLoop = useCallback(() => {\n controllerRef.current?.toggleLoop();\n }, []);\n\n const toggleFullscreen = useCallback(async () => {\n await controllerRef.current?.toggleFullscreen();\n }, []);\n\n const togglePiP = useCallback(async () => {\n await controllerRef.current?.togglePictureInPicture();\n }, []);\n\n const toggleSubtitles = useCallback(() => {\n controllerRef.current?.toggleSubtitles();\n }, []);\n\n const clearError = useCallback(() => {\n controllerRef.current?.clearError();\n setState((prev) => ({\n ...prev,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n }));\n }, []);\n\n const dismissToast = useCallback(() => {\n setState((prev) => ({ ...prev, toast: null }));\n }, []);\n\n const jumpToLive = useCallback(() => {\n controllerRef.current?.jumpToLive();\n }, []);\n\n const retry = useCallback(async () => {\n await controllerRef.current?.retry();\n }, []);\n\n const reload = useCallback(async () => {\n await controllerRef.current?.reload();\n }, []);\n\n const getQualities = useCallback(() => {\n return controllerRef.current?.getQualities() ?? [];\n }, []);\n\n const selectQuality = useCallback((id: string) => {\n controllerRef.current?.selectQuality(id);\n }, []);\n\n const handleMouseEnter = useCallback(() => {\n controllerRef.current?.handleMouseEnter();\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n controllerRef.current?.handleMouseLeave();\n }, []);\n\n const handleMouseMove = useCallback(() => {\n controllerRef.current?.handleMouseMove();\n }, []);\n\n const handleTouchStart = useCallback(() => {\n controllerRef.current?.handleTouchStart();\n }, []);\n\n const setDevModeOptions = useCallback(\n async (options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) => {\n await controllerRef.current?.setDevModeOptions(options);\n },\n []\n );\n\n return {\n containerRef,\n state,\n controller: controllerRef.current,\n play,\n pause,\n togglePlay,\n seek,\n seekBy,\n jumpToLive,\n setVolume,\n toggleMute,\n toggleLoop,\n toggleFullscreen,\n togglePiP,\n toggleSubtitles,\n clearError,\n dismissToast,\n retry,\n reload,\n getQualities,\n selectQuality,\n handleMouseEnter,\n handleMouseLeave,\n handleMouseMove,\n handleTouchStart,\n setDevModeOptions,\n };\n}\n\nexport default usePlayerController;\n"],"names":["initialState","state","streamState","endpoints","metadata","videoElement","currentTime","duration","NaN","isPlaying","isPaused","isBuffering","isMuted","volume","error","errorDetails","isPassiveError","hasPlaybackStarted","isHoldingSpeed","holdSpeed","isHovering","shouldShowControls","isLoopEnabled","isFullscreen","isPiPActive","isEffectivelyLive","shouldShowIdleScreen","currentPlayerInfo","currentSourceInfo","playbackQuality","subtitlesEnabled","qualities","textTracks","streamInfo","toast","usePlayerController","config","_config$enabled","enabled","onStateChange","onStreamStateChange","onError","onReady","onProtocolSwapped","onPlaybackFailed","controllerConfig","_objectWithoutProperties","_excluded","containerRef","useRef","controllerRef","_useState","useState","_useState2","_slicedToArray","setState","configRef","current","useEffect","container","controller","PlayerController","contentId","contentType","gatewayUrl","mistUrl","authToken","autoplay","muted","controls","poster","debug","unsubs","syncState","c","prev","_objectSpread","getVolume","getPlaybackQuality","isSubtitlesEnabled","getQualities","getStreamInfo","push","on","_ref","newState","_ref2","getMetadata","_ref3","_ref4","_ref5","getEndpoints","getCurrentPlayerInfo","getCurrentSourceInfo","handleVideoEvent","_controllerRef$curren","_controllerRef$curren2","shouldSuppressVideoEvents","call","addEventListener","removeEventListener","_ref6","player","source","url","type","_ref7","_ref8","_ref9","_ref0","isPiP","_ref1","speed","_ref10","data","message","concat","toProtocol","timestamp","Date","now","_data$details","details","code","attach","err","console","warn","forEach","fn","destroy","play","useCallback","_asyncToGenerator","_regenerator","m","_callee","_controllerRef$curren3","w","_context","n","a","pause","_controllerRef$curren4","togglePlay","_controllerRef$curren5","seek","time","_controllerRef$curren6","seekBy","delta","_controllerRef$curren7","setVolume","_controllerRef$curren8","toggleMute","_controllerRef$curren9","toggleLoop","_controllerRef$curren0","toggleFullscreen","_callee2","_controllerRef$curren1","_context2","togglePiP","_callee3","_controllerRef$curren10","_context3","togglePictureInPicture","toggleSubtitles","_controllerRef$curren11","clearError","_controllerRef$curren12","dismissToast","jumpToLive","_controllerRef$curren13","retry","_callee4","_controllerRef$curren14","_context4","reload","_callee5","_controllerRef$curren15","_context5","_controllerRef$curren16","_controllerRef$curren17","selectQuality","id","_controllerRef$curren18","handleMouseEnter","_controllerRef$curren19","handleMouseLeave","_controllerRef$curren20","handleMouseMove","_controllerRef$curren21","handleTouchStart","_controllerRef$curren22","setDevModeOptions","_ref16","_callee6","options","_controllerRef$curren23","_context6","_x","apply","arguments"],"mappings":"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"}