@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,518 @@
1
+ 'use strict';
2
+
3
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
4
+ var React = require('react');
5
+ var playerCore = require('@livepeer-frameworks/player-core');
6
+
7
+ var _excluded = ["enabled", "onStateChange", "onStreamStateChange", "onError", "onReady", "onProtocolSwapped", "onPlaybackFailed"];
8
+ // ============================================================================
9
+ // Initial State
10
+ // ============================================================================
11
+ var initialState = {
12
+ state: "booting",
13
+ streamState: null,
14
+ endpoints: null,
15
+ metadata: null,
16
+ videoElement: null,
17
+ currentTime: 0,
18
+ duration: NaN,
19
+ isPlaying: false,
20
+ isPaused: true,
21
+ isBuffering: false,
22
+ isMuted: true,
23
+ volume: 1,
24
+ error: null,
25
+ errorDetails: null,
26
+ isPassiveError: false,
27
+ hasPlaybackStarted: false,
28
+ isHoldingSpeed: false,
29
+ holdSpeed: 2,
30
+ isHovering: false,
31
+ shouldShowControls: false,
32
+ isLoopEnabled: false,
33
+ isFullscreen: false,
34
+ isPiPActive: false,
35
+ isEffectivelyLive: false,
36
+ shouldShowIdleScreen: true,
37
+ currentPlayerInfo: null,
38
+ currentSourceInfo: null,
39
+ playbackQuality: null,
40
+ subtitlesEnabled: false,
41
+ qualities: [],
42
+ textTracks: [],
43
+ streamInfo: null,
44
+ toast: null
45
+ };
46
+ // ============================================================================
47
+ // Hook
48
+ // ============================================================================
49
+ function usePlayerController(config) {
50
+ var _config$enabled = config.enabled,
51
+ enabled = _config$enabled === void 0 ? true : _config$enabled,
52
+ onStateChange = config.onStateChange,
53
+ onStreamStateChange = config.onStreamStateChange,
54
+ onError = config.onError,
55
+ onReady = config.onReady,
56
+ onProtocolSwapped = config.onProtocolSwapped,
57
+ onPlaybackFailed = config.onPlaybackFailed,
58
+ controllerConfig = _rollupPluginBabelHelpers.objectWithoutProperties(config, _excluded);
59
+ var containerRef = React.useRef(null);
60
+ var controllerRef = React.useRef(null);
61
+ var _useState = React.useState(initialState),
62
+ _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
63
+ state = _useState2[0],
64
+ setState = _useState2[1];
65
+ // Stable config ref for effect dependencies
66
+ var configRef = React.useRef(controllerConfig);
67
+ configRef.current = controllerConfig;
68
+ // Create and attach controller
69
+ React.useEffect(function () {
70
+ if (!enabled) return;
71
+ var container = containerRef.current;
72
+ if (!container) return;
73
+ // Create controller
74
+ var controller = new playerCore.PlayerController({
75
+ contentId: configRef.current.contentId,
76
+ contentType: configRef.current.contentType,
77
+ endpoints: configRef.current.endpoints,
78
+ gatewayUrl: configRef.current.gatewayUrl,
79
+ mistUrl: configRef.current.mistUrl,
80
+ authToken: configRef.current.authToken,
81
+ autoplay: configRef.current.autoplay,
82
+ muted: configRef.current.muted,
83
+ controls: configRef.current.controls,
84
+ poster: configRef.current.poster,
85
+ debug: configRef.current.debug
86
+ });
87
+ controllerRef.current = controller;
88
+ // Subscribe to events
89
+ var unsubs = [];
90
+ // Sync state from controller - called on video events
91
+ var syncState = function syncState() {
92
+ if (!controllerRef.current) return;
93
+ var c = controllerRef.current;
94
+ setState(function (prev) {
95
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
96
+ isPlaying: c.isPlaying(),
97
+ isPaused: c.isPaused(),
98
+ isBuffering: c.isBuffering(),
99
+ isMuted: c.isMuted(),
100
+ volume: c.getVolume(),
101
+ hasPlaybackStarted: c.hasPlaybackStarted(),
102
+ shouldShowControls: c.shouldShowControls(),
103
+ shouldShowIdleScreen: c.shouldShowIdleScreen(),
104
+ playbackQuality: c.getPlaybackQuality(),
105
+ isLoopEnabled: c.isLoopEnabled(),
106
+ subtitlesEnabled: c.isSubtitlesEnabled(),
107
+ qualities: c.getQualities(),
108
+ streamInfo: c.getStreamInfo()
109
+ });
110
+ });
111
+ };
112
+ unsubs.push(controller.on("stateChange", function (_ref) {
113
+ var newState = _ref.state;
114
+ setState(function (prev) {
115
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
116
+ state: newState
117
+ });
118
+ });
119
+ onStateChange === null || onStateChange === void 0 || onStateChange(newState);
120
+ }));
121
+ unsubs.push(controller.on("streamStateChange", function (_ref2) {
122
+ var streamState = _ref2.state;
123
+ setState(function (prev) {
124
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
125
+ streamState: streamState,
126
+ metadata: controller.getMetadata(),
127
+ isEffectivelyLive: controller.isEffectivelyLive(),
128
+ shouldShowIdleScreen: controller.shouldShowIdleScreen()
129
+ });
130
+ });
131
+ onStreamStateChange === null || onStreamStateChange === void 0 || onStreamStateChange(streamState);
132
+ }));
133
+ unsubs.push(controller.on("timeUpdate", function (_ref3) {
134
+ var currentTime = _ref3.currentTime,
135
+ duration = _ref3.duration;
136
+ setState(function (prev) {
137
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
138
+ currentTime: currentTime,
139
+ duration: duration
140
+ });
141
+ });
142
+ }));
143
+ unsubs.push(controller.on("error", function (_ref4) {
144
+ var error = _ref4.error;
145
+ setState(function (prev) {
146
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
147
+ error: error,
148
+ isPassiveError: controller.isPassiveError()
149
+ });
150
+ });
151
+ onError === null || onError === void 0 || onError(error);
152
+ }));
153
+ unsubs.push(controller.on("errorCleared", function () {
154
+ setState(function (prev) {
155
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
156
+ error: null,
157
+ isPassiveError: false
158
+ });
159
+ });
160
+ }));
161
+ unsubs.push(controller.on("ready", function (_ref5) {
162
+ var videoElement = _ref5.videoElement;
163
+ setState(function (prev) {
164
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
165
+ videoElement: videoElement,
166
+ endpoints: controller.getEndpoints(),
167
+ metadata: controller.getMetadata(),
168
+ streamInfo: controller.getStreamInfo(),
169
+ isEffectivelyLive: controller.isEffectivelyLive(),
170
+ shouldShowIdleScreen: controller.shouldShowIdleScreen(),
171
+ currentPlayerInfo: controller.getCurrentPlayerInfo(),
172
+ currentSourceInfo: controller.getCurrentSourceInfo(),
173
+ qualities: controller.getQualities()
174
+ });
175
+ });
176
+ onReady === null || onReady === void 0 || onReady(videoElement);
177
+ // Set up video event listeners AFTER video is ready
178
+ // syncState is defined below - this closure captures it
179
+ var handleVideoEvent = function handleVideoEvent() {
180
+ var _controllerRef$curren, _controllerRef$curren2;
181
+ 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;
182
+ syncState();
183
+ };
184
+ videoElement.addEventListener("play", handleVideoEvent);
185
+ videoElement.addEventListener("pause", handleVideoEvent);
186
+ videoElement.addEventListener("waiting", handleVideoEvent);
187
+ videoElement.addEventListener("playing", handleVideoEvent);
188
+ unsubs.push(function () {
189
+ videoElement.removeEventListener("play", handleVideoEvent);
190
+ videoElement.removeEventListener("pause", handleVideoEvent);
191
+ videoElement.removeEventListener("waiting", handleVideoEvent);
192
+ videoElement.removeEventListener("playing", handleVideoEvent);
193
+ });
194
+ }));
195
+ unsubs.push(controller.on("playerSelected", function (_ref6) {
196
+ _ref6.player;
197
+ var source = _ref6.source;
198
+ setState(function (prev) {
199
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
200
+ currentPlayerInfo: controller.getCurrentPlayerInfo(),
201
+ currentSourceInfo: {
202
+ url: source.url,
203
+ type: source.type
204
+ },
205
+ qualities: controller.getQualities()
206
+ });
207
+ });
208
+ }));
209
+ unsubs.push(controller.on("volumeChange", function (_ref7) {
210
+ var volume = _ref7.volume,
211
+ muted = _ref7.muted;
212
+ setState(function (prev) {
213
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
214
+ volume: volume,
215
+ isMuted: muted
216
+ });
217
+ });
218
+ }));
219
+ unsubs.push(controller.on("loopChange", function (_ref8) {
220
+ var isLoopEnabled = _ref8.isLoopEnabled;
221
+ setState(function (prev) {
222
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
223
+ isLoopEnabled: isLoopEnabled
224
+ });
225
+ });
226
+ }));
227
+ unsubs.push(controller.on("fullscreenChange", function (_ref9) {
228
+ var isFullscreen = _ref9.isFullscreen;
229
+ setState(function (prev) {
230
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
231
+ isFullscreen: isFullscreen
232
+ });
233
+ });
234
+ }));
235
+ unsubs.push(controller.on("pipChange", function (_ref0) {
236
+ var isPiP = _ref0.isPiP;
237
+ setState(function (prev) {
238
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
239
+ isPiPActive: isPiP
240
+ });
241
+ });
242
+ }));
243
+ unsubs.push(controller.on("holdSpeedStart", function (_ref1) {
244
+ var speed = _ref1.speed;
245
+ setState(function (prev) {
246
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
247
+ isHoldingSpeed: true,
248
+ holdSpeed: speed
249
+ });
250
+ });
251
+ }));
252
+ unsubs.push(controller.on("holdSpeedEnd", function () {
253
+ setState(function (prev) {
254
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
255
+ isHoldingSpeed: false
256
+ });
257
+ });
258
+ }));
259
+ unsubs.push(controller.on("hoverStart", function () {
260
+ setState(function (prev) {
261
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
262
+ isHovering: true,
263
+ shouldShowControls: true
264
+ });
265
+ });
266
+ }));
267
+ unsubs.push(controller.on("hoverEnd", function () {
268
+ setState(function (prev) {
269
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
270
+ isHovering: false,
271
+ shouldShowControls: controller.shouldShowControls()
272
+ });
273
+ });
274
+ }));
275
+ unsubs.push(controller.on("captionsChange", function (_ref10) {
276
+ var enabled = _ref10.enabled;
277
+ setState(function (prev) {
278
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
279
+ subtitlesEnabled: enabled
280
+ });
281
+ });
282
+ }));
283
+ // Error handling events - show toasts/modals
284
+ unsubs.push(controller.on("protocolSwapped", function (data) {
285
+ var message = "Switched to ".concat(data.toProtocol);
286
+ setState(function (prev) {
287
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
288
+ toast: {
289
+ message: message,
290
+ timestamp: Date.now()
291
+ }
292
+ });
293
+ });
294
+ onProtocolSwapped === null || onProtocolSwapped === void 0 || onProtocolSwapped(data);
295
+ }));
296
+ unsubs.push(controller.on("playbackFailed", function (data) {
297
+ setState(function (prev) {
298
+ var _data$details;
299
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
300
+ error: data.message,
301
+ errorDetails: (_data$details = data.details) !== null && _data$details !== void 0 ? _data$details : null,
302
+ isPassiveError: false
303
+ });
304
+ });
305
+ onPlaybackFailed === null || onPlaybackFailed === void 0 || onPlaybackFailed({
306
+ code: data.code,
307
+ message: data.message,
308
+ details: data.details
309
+ });
310
+ }));
311
+ // Attach controller to container
312
+ // Note: Video event listeners are set up in the 'ready' handler above
313
+ controller.attach(container)["catch"](function (err) {
314
+ console.warn("[usePlayerController] Attach failed:", err);
315
+ });
316
+ // Set initial state
317
+ setState(function (prev) {
318
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
319
+ isLoopEnabled: controller.isLoopEnabled()
320
+ });
321
+ });
322
+ return function () {
323
+ unsubs.forEach(function (fn) {
324
+ return fn();
325
+ });
326
+ controller.destroy();
327
+ controllerRef.current = null;
328
+ setState(initialState);
329
+ };
330
+ }, [enabled, config.contentId, config.contentType]); // Re-create on content change
331
+ // Stable action callbacks
332
+ var play = React.useCallback(/*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
333
+ var _controllerRef$curren3;
334
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
335
+ while (1) switch (_context.n) {
336
+ case 0:
337
+ _context.n = 1;
338
+ return (_controllerRef$curren3 = controllerRef.current) === null || _controllerRef$curren3 === void 0 ? void 0 : _controllerRef$curren3.play();
339
+ case 1:
340
+ return _context.a(2);
341
+ }
342
+ }, _callee);
343
+ })), []);
344
+ var pause = React.useCallback(function () {
345
+ var _controllerRef$curren4;
346
+ (_controllerRef$curren4 = controllerRef.current) === null || _controllerRef$curren4 === void 0 || _controllerRef$curren4.pause();
347
+ }, []);
348
+ var togglePlay = React.useCallback(function () {
349
+ var _controllerRef$curren5;
350
+ (_controllerRef$curren5 = controllerRef.current) === null || _controllerRef$curren5 === void 0 || _controllerRef$curren5.togglePlay();
351
+ }, []);
352
+ var seek = React.useCallback(function (time) {
353
+ var _controllerRef$curren6;
354
+ (_controllerRef$curren6 = controllerRef.current) === null || _controllerRef$curren6 === void 0 || _controllerRef$curren6.seek(time);
355
+ }, []);
356
+ var seekBy = React.useCallback(function (delta) {
357
+ var _controllerRef$curren7;
358
+ (_controllerRef$curren7 = controllerRef.current) === null || _controllerRef$curren7 === void 0 || _controllerRef$curren7.seekBy(delta);
359
+ }, []);
360
+ var setVolume = React.useCallback(function (volume) {
361
+ var _controllerRef$curren8;
362
+ (_controllerRef$curren8 = controllerRef.current) === null || _controllerRef$curren8 === void 0 || _controllerRef$curren8.setVolume(volume);
363
+ }, []);
364
+ var toggleMute = React.useCallback(function () {
365
+ var _controllerRef$curren9;
366
+ (_controllerRef$curren9 = controllerRef.current) === null || _controllerRef$curren9 === void 0 || _controllerRef$curren9.toggleMute();
367
+ }, []);
368
+ var toggleLoop = React.useCallback(function () {
369
+ var _controllerRef$curren0;
370
+ (_controllerRef$curren0 = controllerRef.current) === null || _controllerRef$curren0 === void 0 || _controllerRef$curren0.toggleLoop();
371
+ }, []);
372
+ var toggleFullscreen = React.useCallback(/*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2() {
373
+ var _controllerRef$curren1;
374
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
375
+ while (1) switch (_context2.n) {
376
+ case 0:
377
+ _context2.n = 1;
378
+ return (_controllerRef$curren1 = controllerRef.current) === null || _controllerRef$curren1 === void 0 ? void 0 : _controllerRef$curren1.toggleFullscreen();
379
+ case 1:
380
+ return _context2.a(2);
381
+ }
382
+ }, _callee2);
383
+ })), []);
384
+ var togglePiP = React.useCallback(/*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee3() {
385
+ var _controllerRef$curren10;
386
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
387
+ while (1) switch (_context3.n) {
388
+ case 0:
389
+ _context3.n = 1;
390
+ return (_controllerRef$curren10 = controllerRef.current) === null || _controllerRef$curren10 === void 0 ? void 0 : _controllerRef$curren10.togglePictureInPicture();
391
+ case 1:
392
+ return _context3.a(2);
393
+ }
394
+ }, _callee3);
395
+ })), []);
396
+ var toggleSubtitles = React.useCallback(function () {
397
+ var _controllerRef$curren11;
398
+ (_controllerRef$curren11 = controllerRef.current) === null || _controllerRef$curren11 === void 0 || _controllerRef$curren11.toggleSubtitles();
399
+ }, []);
400
+ var clearError = React.useCallback(function () {
401
+ var _controllerRef$curren12;
402
+ (_controllerRef$curren12 = controllerRef.current) === null || _controllerRef$curren12 === void 0 || _controllerRef$curren12.clearError();
403
+ setState(function (prev) {
404
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
405
+ error: null,
406
+ errorDetails: null,
407
+ isPassiveError: false
408
+ });
409
+ });
410
+ }, []);
411
+ var dismissToast = React.useCallback(function () {
412
+ setState(function (prev) {
413
+ return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, prev), {}, {
414
+ toast: null
415
+ });
416
+ });
417
+ }, []);
418
+ var jumpToLive = React.useCallback(function () {
419
+ var _controllerRef$curren13;
420
+ (_controllerRef$curren13 = controllerRef.current) === null || _controllerRef$curren13 === void 0 || _controllerRef$curren13.jumpToLive();
421
+ }, []);
422
+ var retry = React.useCallback(/*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee4() {
423
+ var _controllerRef$curren14;
424
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
425
+ while (1) switch (_context4.n) {
426
+ case 0:
427
+ _context4.n = 1;
428
+ return (_controllerRef$curren14 = controllerRef.current) === null || _controllerRef$curren14 === void 0 ? void 0 : _controllerRef$curren14.retry();
429
+ case 1:
430
+ return _context4.a(2);
431
+ }
432
+ }, _callee4);
433
+ })), []);
434
+ var reload = React.useCallback(/*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee5() {
435
+ var _controllerRef$curren15;
436
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context5) {
437
+ while (1) switch (_context5.n) {
438
+ case 0:
439
+ _context5.n = 1;
440
+ return (_controllerRef$curren15 = controllerRef.current) === null || _controllerRef$curren15 === void 0 ? void 0 : _controllerRef$curren15.reload();
441
+ case 1:
442
+ return _context5.a(2);
443
+ }
444
+ }, _callee5);
445
+ })), []);
446
+ var getQualities = React.useCallback(function () {
447
+ var _controllerRef$curren16, _controllerRef$curren17;
448
+ return (_controllerRef$curren16 = (_controllerRef$curren17 = controllerRef.current) === null || _controllerRef$curren17 === void 0 ? void 0 : _controllerRef$curren17.getQualities()) !== null && _controllerRef$curren16 !== void 0 ? _controllerRef$curren16 : [];
449
+ }, []);
450
+ var selectQuality = React.useCallback(function (id) {
451
+ var _controllerRef$curren18;
452
+ (_controllerRef$curren18 = controllerRef.current) === null || _controllerRef$curren18 === void 0 || _controllerRef$curren18.selectQuality(id);
453
+ }, []);
454
+ var handleMouseEnter = React.useCallback(function () {
455
+ var _controllerRef$curren19;
456
+ (_controllerRef$curren19 = controllerRef.current) === null || _controllerRef$curren19 === void 0 || _controllerRef$curren19.handleMouseEnter();
457
+ }, []);
458
+ var handleMouseLeave = React.useCallback(function () {
459
+ var _controllerRef$curren20;
460
+ (_controllerRef$curren20 = controllerRef.current) === null || _controllerRef$curren20 === void 0 || _controllerRef$curren20.handleMouseLeave();
461
+ }, []);
462
+ var handleMouseMove = React.useCallback(function () {
463
+ var _controllerRef$curren21;
464
+ (_controllerRef$curren21 = controllerRef.current) === null || _controllerRef$curren21 === void 0 || _controllerRef$curren21.handleMouseMove();
465
+ }, []);
466
+ var handleTouchStart = React.useCallback(function () {
467
+ var _controllerRef$curren22;
468
+ (_controllerRef$curren22 = controllerRef.current) === null || _controllerRef$curren22 === void 0 || _controllerRef$curren22.handleTouchStart();
469
+ }, []);
470
+ var setDevModeOptions = React.useCallback(/*#__PURE__*/function () {
471
+ var _ref16 = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee6(options) {
472
+ var _controllerRef$curren23;
473
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context6) {
474
+ while (1) switch (_context6.n) {
475
+ case 0:
476
+ _context6.n = 1;
477
+ return (_controllerRef$curren23 = controllerRef.current) === null || _controllerRef$curren23 === void 0 ? void 0 : _controllerRef$curren23.setDevModeOptions(options);
478
+ case 1:
479
+ return _context6.a(2);
480
+ }
481
+ }, _callee6);
482
+ }));
483
+ return function (_x) {
484
+ return _ref16.apply(this, arguments);
485
+ };
486
+ }(), []);
487
+ return {
488
+ containerRef: containerRef,
489
+ state: state,
490
+ controller: controllerRef.current,
491
+ play: play,
492
+ pause: pause,
493
+ togglePlay: togglePlay,
494
+ seek: seek,
495
+ seekBy: seekBy,
496
+ jumpToLive: jumpToLive,
497
+ setVolume: setVolume,
498
+ toggleMute: toggleMute,
499
+ toggleLoop: toggleLoop,
500
+ toggleFullscreen: toggleFullscreen,
501
+ togglePiP: togglePiP,
502
+ toggleSubtitles: toggleSubtitles,
503
+ clearError: clearError,
504
+ dismissToast: dismissToast,
505
+ retry: retry,
506
+ reload: reload,
507
+ getQualities: getQualities,
508
+ selectQuality: selectQuality,
509
+ handleMouseEnter: handleMouseEnter,
510
+ handleMouseLeave: handleMouseLeave,
511
+ handleMouseMove: handleMouseMove,
512
+ handleTouchStart: handleTouchStart,
513
+ setDevModeOptions: setDevModeOptions
514
+ };
515
+ }
516
+
517
+ exports.usePlayerController = usePlayerController;
518
+ //# 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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"}