@scaleflex/widget-media-player 4.1.0 → 4.4.0

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.4.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.1.0...v4.4.0) (2025-10-07)
7
+
8
+ **Note:** Version bump only for package @scaleflex/widget-media-player
9
+
10
+
11
+
12
+
13
+
14
+ # [4.3.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.1.0...v4.3.0) (2025-10-02)
15
+
16
+ **Note:** Version bump only for package @scaleflex/widget-media-player
17
+
18
+
19
+
20
+
21
+
22
+ # [4.2.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.1.0...v4.2.0) (2025-10-02)
23
+
24
+ **Note:** Version bump only for package @scaleflex/widget-media-player
25
+
26
+
27
+
28
+
29
+
6
30
  # [4.1.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.0.8...v4.1.0) (2025-10-02)
7
31
 
8
32
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scaleflex/widget-media-player",
3
- "version": "4.1.0",
3
+ "version": "4.4.0",
4
4
  "description": "Media player integration for video/audio files with Scaleflex",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -15,7 +15,7 @@
15
15
  "dependencies": {
16
16
  "@scaleflex/icons": "^3.0.0-beta.11",
17
17
  "@scaleflex/ui": "^3.0.0-beta.11",
18
- "@scaleflex/widget-common": "^4.1.0",
18
+ "@scaleflex/widget-common": "^4.4.0",
19
19
  "video.js": "^8.10.0"
20
20
  },
21
21
  "devDependencies": {
@@ -30,5 +30,5 @@
30
30
  "react-dom": ">=19.0.0",
31
31
  "react-redux": "^8.1.1"
32
32
  },
33
- "gitHead": "471120d67066617a0d8824eae11b07d1f2259473"
33
+ "gitHead": "04b8ec545c4f10be89f5a44eed954acf8433360c"
34
34
  }
@@ -1,21 +0,0 @@
1
- import { useMemo } from 'react';
2
- import MediaControls from './MediaControls';
3
- import { jsx as _jsx } from "react/jsx-runtime";
4
- var AudioPlayer = function AudioPlayer(_ref) {
5
- var mediaOptions = _ref.mediaOptions;
6
- var _ref2 = mediaOptions || {},
7
- audioPath = _ref2.audioPath;
8
- var audioRef = useMemo(function () {
9
- return {
10
- current: new Audio(audioPath)
11
- };
12
- }, [audioPath]);
13
- if (!audioPath) {
14
- return null;
15
- }
16
- return /*#__PURE__*/_jsx(MediaControls, {
17
- mediaRef: audioRef,
18
- isPlayerReady: true
19
- });
20
- };
21
- export default AudioPlayer;
@@ -1,324 +0,0 @@
1
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
- import { useRef, useState, useEffect } from 'react';
8
- import { Play, Pause } from '@scaleflex/icons';
9
- import TimeLapse from './Timelapse';
10
- import PlaybackSpeedMenu from './PlaybackSpeedMenu';
11
- import Styled from './MediaPlayer.styled';
12
- import VolumeControl from './VolumeControl';
13
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
- var MediaControls = function MediaControls(_ref) {
15
- var extraControllers = _ref.extraControllers,
16
- mediaRef = _ref.mediaRef,
17
- isPlayerReady = _ref.isPlayerReady,
18
- _ref$dismissInitialLo = _ref.dismissInitialLoad,
19
- dismissInitialLoad = _ref$dismissInitialLo === void 0 ? false : _ref$dismissInitialLo,
20
- onKeyboardFullscreenKeyDown = _ref.onKeyboardFullscreenKeyDown,
21
- mediaPlayerRef = _ref.mediaPlayerRef;
22
- var _useState = useState(0),
23
- _useState2 = _slicedToArray(_useState, 2),
24
- trackProgress = _useState2[0],
25
- setTrackProgress = _useState2[1];
26
- var _useState3 = useState(false),
27
- _useState4 = _slicedToArray(_useState3, 2),
28
- isPlaying = _useState4[0],
29
- setIsPlaying = _useState4[1];
30
- var _useState5 = useState(false),
31
- _useState6 = _slicedToArray(_useState5, 2),
32
- trackEnded = _useState6[0],
33
- setTrackEnded = _useState6[1];
34
- var _useState7 = useState(0),
35
- _useState8 = _slicedToArray(_useState7, 2),
36
- duration = _useState8[0],
37
- setDuration = _useState8[1];
38
- var _useState9 = useState(1),
39
- _useState10 = _slicedToArray(_useState9, 2),
40
- playbackSpeed = _useState10[0],
41
- setPlaybackSpeed = _useState10[1];
42
- var _useState11 = useState(),
43
- _useState12 = _slicedToArray(_useState11, 2),
44
- playbackMenuAnchor = _useState12[0],
45
- setPlaybackMenuAnchor = _useState12[1];
46
- var _useState13 = useState(1),
47
- _useState14 = _slicedToArray(_useState13, 2),
48
- volumeLevel = _useState14[0],
49
- setVolumeLevel = _useState14[1];
50
- var _useState15 = useState(0),
51
- _useState16 = _slicedToArray(_useState15, 2),
52
- beforeMutedVolumeLevel = _useState16[0],
53
- setBeforeMutedVolumeLevel = _useState16[1];
54
- var _useState17 = useState(false),
55
- _useState18 = _slicedToArray(_useState17, 2),
56
- isSeeking = _useState18[0],
57
- setIsSeeking = _useState18[1];
58
- var _useState19 = useState(false),
59
- _useState20 = _slicedToArray(_useState19, 2),
60
- isAudioSliderOpen = _useState20[0],
61
- setIsAudioSliderOpen = _useState20[1];
62
- var _useState21 = useState(false),
63
- _useState22 = _slicedToArray(_useState21, 2),
64
- isMuted = _useState22[0],
65
- setIsMuted = _useState22[1];
66
- var controlsContainerRef = useRef();
67
- var intervalRef = useRef();
68
- var audioSliderTimerRef = useRef();
69
- var isReadyRef = useRef(false);
70
- var containerRef = mediaPlayerRef !== null && mediaPlayerRef !== void 0 && mediaPlayerRef.current ? mediaPlayerRef : controlsContainerRef;
71
- var resetControls = function resetControls() {
72
- setVolumeLevel(1);
73
- setPlaybackSpeed(1);
74
- setTrackProgress(0);
75
- };
76
- var handleTogglePlaybackMenu = function handleTogglePlaybackMenu(event) {
77
- if (!playbackMenuAnchor) {
78
- setPlaybackMenuAnchor(event.currentTarget);
79
- } else {
80
- setPlaybackMenuAnchor();
81
- }
82
- };
83
- var handleChangePlaybackSpeed = function handleChangePlaybackSpeed(value) {
84
- return function () {
85
- setPlaybackSpeed(value);
86
- handleTogglePlaybackMenu();
87
- mediaRef.current.playbackRate = value;
88
- };
89
- };
90
- var startTimer = function startTimer() {
91
- // Clear any timers already running
92
- clearInterval(intervalRef.current);
93
- intervalRef.current = setInterval(function () {
94
- if (mediaRef.current.ended) {
95
- setTrackEnded(true);
96
- setIsPlaying(false);
97
- } else {
98
- setTrackProgress(mediaRef.current.currentTime);
99
- }
100
- }, [1000]);
101
- };
102
- var onScrub = function onScrub(_, value) {
103
- // Clear any timers already running
104
- clearInterval(intervalRef.current);
105
- mediaRef.current.currentTime = value;
106
- setIsSeeking(true);
107
- setIsPlaying(false);
108
- setTrackProgress(mediaRef.current.currentTime);
109
- };
110
- var onScrubEnd = function onScrubEnd() {
111
- // If not already playing, start
112
- if (!isPlaying) {
113
- setIsPlaying(true);
114
- }
115
- setIsSeeking(false);
116
- startTimer();
117
- };
118
- var checkAndSetIsMutedBySlider = function checkAndSetIsMutedBySlider(value) {
119
- setIsMuted(value === 0);
120
- };
121
- var handleChangeVolumeLevel = function handleChangeVolumeLevel(value) {
122
- var adaptedValue = Math.min(Math.max(value, 0), 1);
123
- if (!isFinite(adaptedValue)) {
124
- return;
125
- }
126
- setVolumeLevel(adaptedValue);
127
- mediaRef.current.volume = adaptedValue;
128
- };
129
- var handleToggleMute = function handleToggleMute() {
130
- var nextIsMuted;
131
- setIsMuted(function (prevIsMuted) {
132
- nextIsMuted = !prevIsMuted;
133
- return nextIsMuted;
134
- });
135
- var nextVolumeLevel = 0;
136
- if (nextIsMuted) {
137
- setBeforeMutedVolumeLevel(volumeLevel);
138
- nextVolumeLevel = 0;
139
- } else if (volumeLevel > 0.1) {
140
- nextVolumeLevel = volumeLevel;
141
- } else {
142
- nextVolumeLevel = beforeMutedVolumeLevel;
143
- }
144
- handleChangeVolumeLevel(nextVolumeLevel);
145
- };
146
- var closeAudioSlider = function closeAudioSlider() {
147
- setIsAudioSliderOpen(true);
148
- clearTimeout(audioSliderTimerRef.current);
149
- audioSliderTimerRef.current = setTimeout(function () {
150
- setIsAudioSliderOpen(false);
151
- }, [1000]);
152
- };
153
- var handleVolumeUp = function handleVolumeUp() {
154
- setIsMuted(false);
155
- handleChangeVolumeLevel((mediaRef.current.volume || 0) + 0.2);
156
- closeAudioSlider();
157
- };
158
- var handleVolumeDown = function handleVolumeDown() {
159
- var nextValue = (mediaRef.current.volume || 0) - 0.2;
160
- handleChangeVolumeLevel(nextValue);
161
- closeAudioSlider();
162
- };
163
- var handleSeek = function handleSeek(value) {
164
- clearInterval(intervalRef.current);
165
- var newTime = mediaRef.current.currentTime + value;
166
- if (!isFinite(newTime)) {
167
- return;
168
- }
169
- mediaRef.current.currentTime = newTime;
170
- setTrackProgress(mediaRef.current.currentTime);
171
- startTimer();
172
- };
173
- var handleCanPlay = function handleCanPlay() {
174
- isReadyRef.current = true;
175
- setDuration(mediaRef.current.duration);
176
- handlePlay();
177
- };
178
- var handleKeyboardControls = function handleKeyboardControls(event) {
179
- var keyCode = event.keyCode;
180
- switch (keyCode) {
181
- case 32: // space
182
- case 75:
183
- // 'k'
184
- event.preventDefault();
185
- return handlePlayPause();
186
- case 39:
187
- // arrowRight
188
- event.preventDefault();
189
- return handleSeek(5);
190
- case 37:
191
- // arrowLeft
192
- event.preventDefault();
193
- return handleSeek(-5);
194
- case 38:
195
- // arrowUp
196
- event.preventDefault();
197
- return handleVolumeUp();
198
- case 40:
199
- // arrowDown
200
- event.preventDefault();
201
- return handleVolumeDown();
202
- case 70:
203
- // 'f'
204
- if (typeof onKeyboardFullscreenKeyDown === 'function') {
205
- event.preventDefault();
206
- onKeyboardFullscreenKeyDown();
207
- }
208
- return;
209
- case 77:
210
- // 'm'
211
- event.preventDefault();
212
- return handleToggleMute();
213
- }
214
- };
215
- var handlePlay = function handlePlay() {
216
- if (!isReadyRef.current) return;
217
- mediaRef.current.play();
218
- };
219
- var handlePause = function handlePause() {
220
- if (!isReadyRef.current) return;
221
- mediaRef.current.pause();
222
- };
223
- var onPlay = function onPlay() {
224
- setIsPlaying(true);
225
- startTimer();
226
- };
227
- var onPause = function onPause() {
228
- setIsPlaying(false);
229
- clearInterval(intervalRef.current);
230
- };
231
- var handlePlayPause = function handlePlayPause() {
232
- if (mediaRef.current.paused) {
233
- handlePlay();
234
- } else {
235
- handlePause();
236
- }
237
- };
238
- useEffect(function () {
239
- if (isPlayerReady && (mediaRef === null || mediaRef === void 0 ? void 0 : mediaRef.current) !== null) {
240
- var _containerRef$current;
241
- if (!dismissInitialLoad) {
242
- mediaRef.current.load();
243
- }
244
- mediaRef.current.addEventListener('canplaythrough', handleCanPlay);
245
- mediaRef.current.addEventListener('play', onPlay);
246
- mediaRef.current.addEventListener('pause', onPause);
247
- (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.addEventListener('keydown', handleKeyboardControls);
248
-
249
- // Pause and clean up on unmount
250
- return function () {
251
- var _containerRef$current2;
252
- if (mediaRef.current) {
253
- mediaRef.current.pause();
254
- mediaRef.current.removeEventListener('canplaythrough', handleCanPlay);
255
- mediaRef.current.removeEventListener('play', onPlay);
256
- mediaRef.current.removeEventListener('pause', onPause);
257
- }
258
- (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeEventListener('keydown', handleKeyboardControls);
259
- resetControls();
260
- clearInterval(intervalRef.current);
261
- };
262
- }
263
- }, [isPlayerReady, mediaRef]);
264
- useEffect(function () {
265
- checkAndSetIsMutedBySlider(volumeLevel);
266
- }, [volumeLevel]);
267
- return /*#__PURE__*/_jsxs(Styled.MediaControls, {
268
- ref: controlsContainerRef,
269
- children: [/*#__PURE__*/_jsx(Styled.SeekSlider, {
270
- value: trackProgress || 0,
271
- step: 1,
272
- min: 0,
273
- hideAnnotation: true,
274
- labelTooltip: "off",
275
- max: duration || 0,
276
- $forceShow: trackEnded || !isPlaying || isSeeking,
277
- onChange: onScrub,
278
- onMouseUp: onScrubEnd
279
- }), /*#__PURE__*/_jsxs(Styled.ControlsWrapper, {
280
- children: [/*#__PURE__*/_jsxs(Styled.PlayButton, {
281
- color: "basic",
282
- size: "lg",
283
- disabled: !isPlaying && !isReadyRef.current,
284
- $disableHover: !isReadyRef.current,
285
- onClick: handlePlayPause,
286
- children: [/*#__PURE__*/_jsx(Styled.LoadingIcon, {
287
- $hidden: isReadyRef.current,
288
- size: 40
289
- }), /*#__PURE__*/_jsx(Styled.Icon, {
290
- $hidden: isPlaying,
291
- icon: /*#__PURE__*/_jsx(Play, {
292
- size: 18
293
- })
294
- }), /*#__PURE__*/_jsx(Styled.Icon, {
295
- $hidden: !isPlaying,
296
- icon: /*#__PURE__*/_jsx(Pause, {
297
- size: 18
298
- })
299
- })]
300
- }), /*#__PURE__*/_jsx(Styled.PlaybackButton, {
301
- color: "basic",
302
- onClick: handleTogglePlaybackMenu,
303
- children: "".concat(playbackSpeed, "x")
304
- }), /*#__PURE__*/_jsx(VolumeControl, {
305
- value: volumeLevel,
306
- onChange: handleChangeVolumeLevel,
307
- isAudioSliderOpen: isAudioSliderOpen,
308
- setIsAudioSliderOpen: setIsAudioSliderOpen,
309
- isMuted: isMuted,
310
- toggleMute: handleToggleMute,
311
- closeAudioSlider: closeAudioSlider
312
- }), /*#__PURE__*/_jsx(TimeLapse, {
313
- trackProgress: trackProgress,
314
- duration: duration
315
- }), typeof extraControllers === 'function' && extraControllers()]
316
- }), /*#__PURE__*/_jsx(PlaybackSpeedMenu, {
317
- value: playbackSpeed,
318
- onClose: handleTogglePlaybackMenu,
319
- onClick: handleChangePlaybackSpeed,
320
- anchor: playbackMenuAnchor
321
- })]
322
- });
323
- };
324
- export default MediaControls;
@@ -1,95 +0,0 @@
1
- var _excluded = ["icon"];
2
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18;
3
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
- function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
6
- import { cloneElement } from 'react';
7
- import { FV, PC } from '@scaleflex/widget-common';
8
- import styled, { css } from 'styled-components';
9
- import { Slider as SfxSlider, Menu as SfxMenu, IconButton, Button } from '@scaleflex/ui/core';
10
- import { Loading } from '@scaleflex/icons';
11
- var MediaControls = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: 100%;\n display: flex;\n flex-direction: column;\n margin-top: -14px;\n"])));
12
- var SeekSlider = styled(SfxSlider)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n appearance: none;\n height: 4px;\n border: 0;\n padding: 0;\n border-radius: 0;\n transition: height 150ms linear;\n\n .SfxSlider-rail {\n background: ", ";\n border: inherit;\n border-radius: inherit;\n }\n\n .SfxSlider-Track {\n background: ", ";\n border: inherit;\n border-radius: inherit;\n transition: height 100ms linear;\n }\n\n .SfxSlider-thumb {\n background: ", ";\n width: 0;\n height: 0;\n transition: width 150ms linear, height 150ms linear;\n transform: translate(0, -50%);\n }\n\n ", "\n\n &:hover {\n height: 6px;\n\n .SfxSlider-thumb {\n width: 15px;\n height: 15px;\n }\n\n .SfxSlider-Track {\n background: ", ";\n }\n }\n"])), function (_ref) {
13
- var palette = _ref.theme.palette;
14
- return palette[PC.IconsPlaceholder];
15
- }, function (_ref2) {
16
- var palette = _ref2.theme.palette;
17
- return palette[PC.IconsMuted];
18
- }, function (_ref3) {
19
- var palette = _ref3.theme.palette;
20
- return palette[PC.AccentStateless];
21
- }, function (_ref4) {
22
- var $forceShow = _ref4.$forceShow;
23
- return $forceShow && css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n height: 6px;\n\n .SfxSlider-thumb {\n width: 15px;\n height: 15px;\n }\n\n .SfxSlider-Track {\n background: ", ";\n }\n "])), function (_ref5) {
24
- var palette = _ref5.theme.palette;
25
- return palette[PC.AccentStateless];
26
- });
27
- }, function (_ref6) {
28
- var palette = _ref6.theme.palette;
29
- return palette[PC.AccentStateless];
30
- });
31
- var ControlsWrapper = styled.div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n width: 100%;\n display: flex;\n align-items: center;\n column-gap: 12px;\n padding: 10px calc(24px - 6px);\n"])));
32
- var TimeLapse = styled.p(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n margin: 0;\n color: ", ";\n ", ";\n"])), function (_ref7) {
33
- var palette = _ref7.theme.palette;
34
- return palette[PC.TextSecondary];
35
- }, function (_ref8) {
36
- var typography = _ref8.theme.typography;
37
- return typography.font[FV.LabelLargeEmphasis];
38
- });
39
- var Menu = styled(SfxMenu)(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n transition: all 200ms ease-out;\n margin-bottom: 5px;\n ", "\n"])), function (_ref9) {
40
- var $isOpen = _ref9.$isOpen;
41
- return !$isOpen && css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n opacity: 0;\n "])));
42
- });
43
- var VolumeSlider = styled(SfxSlider)(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n border: 0;\n width: 0;\n border-radius: 4px;\n height: 2px;\n transition: margin .2s cubic-bezier(0.4,0,1,1), width .2s cubic-bezier(0.4,0,1,1);\n\n .SfxSlider-rail {\n background: ", ";\n border: inherit;\n border-radius: inherit;\n }\n\n .SfxSlider-Track {\n background: ", ";\n border: inherit;\n transition: height 100ms linear;\n }\n\n .SfxSlider-thumb {\n background: ", ";\n transition: width 150ms linear, height 150ms linear;\n width: 8px;\n height: 8px;\n opacity: 0;\n transition: opacity 100ms ease-out;\n }\n"])), function (_ref10) {
44
- var palette = _ref10.theme.palette;
45
- return palette[PC.BorderPrimaryStateless];
46
- }, function (_ref11) {
47
- var palette = _ref11.theme.palette;
48
- return palette[PC.IconsPrimary];
49
- }, function (_ref12) {
50
- var palette = _ref12.theme.palette;
51
- return palette[PC.IconsPrimary];
52
- });
53
- var PlayButton = styled(IconButton)(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n position: relative;\n\n &:active, &:focus {\n background-color: transparent;\n }\n\n &:hover {\n background-color: transparent;\n\n ", "\n }\n"])), function (_ref13) {
54
- var $disableHover = _ref13.$disableHover;
55
- return $disableHover && css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n background-color: transparent;\n "])));
56
- });
57
- var PlaybackButton = styled(Button)(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n border: 0;\n min-width: 40px;\n"])));
58
- var LoadingIcon = styled(Loading)(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n position: absolute;\n animation: spinner 2s linear infinite;\n top: calc(50% - 20.5px);\n left: calc(50% - 20.5px);\n transition: opacity 100ms ease-in-out;\n color: ", ";\n\n ", "\n"])), function (_ref14) {
59
- var palette = _ref14.theme.palette;
60
- return palette[PC.AccentStateless];
61
- }, function (_ref15) {
62
- var $hidden = _ref15.$hidden;
63
- return $hidden && css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n opacity: 0;\n visibility: hidden;\n "])));
64
- });
65
- var VolumeControlWrapper = styled.div(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n column-gap: 10px;\n\n", "\n\n &:hover ", " {\n width: 56px;\n\n .SfxSlider-thumb {\n opacity: 1;\n }\n }\n "])), function (_ref16) {
66
- var $shown = _ref16.$shown;
67
- return $shown && css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n ", " {\n width: 56px;\n\n .SfxSlider-thumb {\n opacity: 1;\n }\n }\n "])), VolumeSlider);
68
- }, VolumeSlider);
69
- var VolumeIconButton = styled(IconButton)(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n position: relative;\n width: 40px;\n height: 40px;\n\n &:hover, &:active, &:focus {\n background-color: transparent;\n }\n"])));
70
- var Icon = styled(function (_ref17) {
71
- var icon = _ref17.icon,
72
- props = _objectWithoutProperties(_ref17, _excluded);
73
- return /*#__PURE__*/cloneElement(icon, props);
74
- })(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n transition: all 150ms ease-out;\n color: ", ";\n background: transparent;\n\n ", "\n"])), function (_ref18) {
75
- var palette = _ref18.theme.palette;
76
- return palette[PC.IconsPrimary];
77
- }, function (_ref19) {
78
- var $hidden = _ref19.$hidden;
79
- return $hidden && css(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["\n opacity: 0;\n visibility: hidden;\n "])));
80
- });
81
- var Styled = {
82
- MediaControls: MediaControls,
83
- ControlsWrapper: ControlsWrapper,
84
- PlayButton: PlayButton,
85
- PlaybackButton: PlaybackButton,
86
- LoadingIcon: LoadingIcon,
87
- SeekSlider: SeekSlider,
88
- TimeLapse: TimeLapse,
89
- Menu: Menu,
90
- VolumeControlWrapper: VolumeControlWrapper,
91
- VolumeSlider: VolumeSlider,
92
- VolumeIconButton: VolumeIconButton,
93
- Icon: Icon
94
- };
95
- export default Styled;
@@ -1,25 +0,0 @@
1
- import { MenuItem } from '@scaleflex/ui/core';
2
- import Styled from './MediaPlayer.styled';
3
- import { jsx as _jsx } from "react/jsx-runtime";
4
- var PLAYBACK_OPTIONS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
5
- var PlaybackSpeedMenu = function PlaybackSpeedMenu(_ref) {
6
- var value = _ref.value,
7
- anchor = _ref.anchor,
8
- onClose = _ref.onClose,
9
- onClick = _ref.onClick;
10
- return /*#__PURE__*/_jsx(Styled.Menu, {
11
- open: Boolean(anchor),
12
- onClose: onClose,
13
- anchorEl: anchor,
14
- value: value,
15
- position: "top-end",
16
- $isOpen: Boolean(anchor),
17
- children: PLAYBACK_OPTIONS.map(function (option) {
18
- return /*#__PURE__*/_jsx(MenuItem, {
19
- onClick: onClick(option),
20
- children: option
21
- }, option);
22
- })
23
- });
24
- };
25
- export default PlaybackSpeedMenu;
@@ -1,17 +0,0 @@
1
- import formatSeconds from '@scaleflex/widget-utils/lib/formatSeconds';
2
- import Styled from './MediaPlayer.styled';
3
- import { jsx as _jsx } from "react/jsx-runtime";
4
- var formatSecondsToDuration = function formatSecondsToDuration(seconds) {
5
- if (!seconds || !Number.isFinite(seconds)) return '00:00';
6
- return formatSeconds(seconds);
7
- };
8
- var TimeLapse = function TimeLapse(_ref) {
9
- var trackProgress = _ref.trackProgress,
10
- duration = _ref.duration;
11
- var formattedProgress = formatSecondsToDuration(trackProgress);
12
- var formattedDuration = formatSecondsToDuration(duration);
13
- return /*#__PURE__*/_jsx(Styled.TimeLapse, {
14
- children: "".concat(formattedProgress, " / ").concat(formattedDuration)
15
- });
16
- };
17
- export default TimeLapse;
@@ -1,28 +0,0 @@
1
- export var defaultVideoPlayerOptions = {
2
- responsive: false,
3
- controls: false,
4
- children: [],
5
- userActions: {},
6
- autoplay: true,
7
- html5: {
8
- nativeControlsForTouch: false,
9
- vhs: {
10
- overrideNative: true,
11
- maxPlaylistRetries: 11,
12
- // 11 is a random number for max retries not expected to have more than such a number?
13
- limitRenditionByPlayerDimensions: true,
14
- useDevicePixelRatio: true,
15
- enableLowInitialPlaylist: false,
16
- bandwidth: 10500000
17
- }
18
- }
19
- };
20
- export var VIDEO_PLAYER_AUTO_QUALITY_ID = 'auto';
21
- export var qualityLevelPixelToResolution = {
22
- '480p': 'SD',
23
- '720p': 'HD',
24
- '1080p': 'FHD',
25
- '1440p': '2K / QHD',
26
- '2160p': '4K / UHD',
27
- '4320p': '8K / FUHD'
28
- };
@@ -1,32 +0,0 @@
1
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
2
- function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
- import styled from 'styled-components';
4
- import { PC, FV } from '@scaleflex/widget-common';
5
- import { IconButton, Menu, MenuItem } from '@scaleflex/ui/core';
6
- import StyledFileWindowPreviewBody from '@scaleflex/widget-explorer/lib/components/FileWindowPanel/Body/Body.styled';
7
- var ExtraControllers = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n flex: 1;\n justify-content: flex-end;\n gap: 12px;\n"])));
8
- var ExtraControllerBtn = styled(IconButton)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: inline-flex;\n"])));
9
- var VideoPlayerWrapper = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex-direction: column;\n"])));
10
- var VideoNodeWrapper = styled.div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n flex-grow: 1;\n height: 75%;\n width: 100%;\n position: relative;\n\n div[id^=\"vjs_video\"] {\n width: 100%;\n height: 100%;\n }\n\n video {\n width: 100%;\n height: 100%;\n object-fit: contain;\n outline: none;\n }\n"])));
11
- var VideoPlayerControls = styled(StyledFileWindowPreviewBody.Footer)(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n background: ", ";\n padding: 0;\n"])), function (_ref) {
12
- var theme = _ref.theme;
13
- return theme.palette[PC.BackgroundStateless];
14
- });
15
- var QualityLevelsMenu = styled(Menu)(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n width: auto;\n"])));
16
- var QualityLevelsMenuLabel = styled(MenuItem)(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n text-align: center;\n justify-content: center;\n color: ", ";\n ", ";\n"])), function (_ref2) {
17
- var theme = _ref2.theme;
18
- return theme.palette[PC.TextSecondary];
19
- }, function (_ref3) {
20
- var theme = _ref3.theme;
21
- return theme.typography.font[FV.LabelMedium];
22
- });
23
- var Styled = {
24
- ExtraControllers: ExtraControllers,
25
- ExtraControllerBtn: ExtraControllerBtn,
26
- VideoPlayerWrapper: VideoPlayerWrapper,
27
- VideoNodeWrapper: VideoNodeWrapper,
28
- VideoPlayerControls: VideoPlayerControls,
29
- QualityLevelsMenu: QualityLevelsMenu,
30
- QualityLevelsMenuLabel: QualityLevelsMenuLabel
31
- };
32
- export default Styled;
@@ -1,36 +0,0 @@
1
- var propsToProxify = ['playbackRate', 'ended', 'currentTime', 'volume', 'duration', 'paused', 'addEventListener', 'removeEventListener'];
2
- var nativeToCustomPropFns = {
3
- addEventListener: 'on',
4
- removeEventListener: 'off'
5
- };
6
-
7
- // as videojs support getting the params by using mehotds ex. player.volume()
8
- // and native js video/audio API is using property player.volume
9
- // then we are proxifying specific properties (used for the native ones also), to deal with them with a unified API
10
- // as getter/setter ex. (getting value -> player.volume) & (setting value -> player.volume = 1).
11
- // if u need to support more props that are newly added in MediaControls Component then add the prop name at the top array.
12
- export var proxifyPlayerPropGettersSetters = function proxifyPlayerPropGettersSetters(player) {
13
- return new Proxy(player, {
14
- get: function get(target, prop) {
15
- return propsToProxify.includes(prop) ? target[prop] && target[prop]() || target[nativeToCustomPropFns[prop]] : typeof target[prop] === 'function' && target[prop].bind(target) || target[prop];
16
- },
17
- set: function set(obj, prop, value) {
18
- if (typeof obj[prop] === 'function') {
19
- obj[prop](value);
20
- } else {
21
- obj[prop] = value;
22
- }
23
- return true;
24
- }
25
- });
26
- };
27
- export var qualityLevelTransformer = function qualityLevelTransformer() {
28
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
29
- height = _ref.height,
30
- width = _ref.width,
31
- id = _ref.id;
32
- return {
33
- id: id,
34
- label: "".concat(Math.min(height, width), "p")
35
- };
36
- };
@@ -1,141 +0,0 @@
1
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
- import { useRef, useState, useEffect } from 'react';
8
- import { Optimization } from '@scaleflex/icons';
9
- import { Button, MenuItem } from '@scaleflex/ui/core';
10
- import debounce from '@scaleflex/widget-utils/lib/debounce';
11
- import { usePlugin } from '@scaleflex/widget-core/lib/hooks';
12
- import { PLUGINS_IDS } from '@scaleflex/widget-utils/lib/constants';
13
- import Styled from './VideoPlayer.styled';
14
- import { VIDEO_PLAYER_AUTO_QUALITY_ID, qualityLevelPixelToResolution } from './VideoPlayer.constants';
15
- import { qualityLevelTransformer } from './VideoPlayer.utils';
16
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
17
- var VideoPlayerQualityLevels = function VideoPlayerQualityLevels(_ref) {
18
- var videoRef = _ref.videoRef,
19
- isPlayerReady = _ref.isPlayerReady;
20
- var _ref2 = usePlugin(PLUGINS_IDS.MEDIA_PLAYER) || {},
21
- i18n = _ref2.i18n;
22
- var qualityLevelsRef = useRef(null);
23
- var _useState = useState(null),
24
- _useState2 = _slicedToArray(_useState, 2),
25
- levelsAnchorEl = _useState2[0],
26
- setLevelsAnchorEl = _useState2[1];
27
- var _useState3 = useState([]),
28
- _useState4 = _slicedToArray(_useState3, 2),
29
- qualityLevels = _useState4[0],
30
- setQualityLevels = _useState4[1];
31
- var _useState5 = useState({
32
- id: VIDEO_PLAYER_AUTO_QUALITY_ID,
33
- label: i18n('mediaPlayerVideoPlayerAutoQualityLabel')
34
- }),
35
- _useState6 = _slicedToArray(_useState5, 2),
36
- selectedQualityLevel = _useState6[0],
37
- setSelectedQualityLevel = _useState6[1];
38
- var assignQualityLevels = debounce(function () {
39
- if (!qualityLevelsRef.current) {
40
- return;
41
- }
42
- if (qualityLevelsRef.current.length > 1) {
43
- var newLevels = Array.from(qualityLevelsRef.current, qualityLevelTransformer);
44
- var videoPlayerAutoQualityLevel = {
45
- id: VIDEO_PLAYER_AUTO_QUALITY_ID,
46
- label: i18n('mediaPlayerVideoPlayerAutoQualityLabel')
47
- };
48
- newLevels.push(videoPlayerAutoQualityLevel);
49
- setQualityLevels(newLevels);
50
- }
51
- }, 10);
52
- var toggleQualityLevelsMenu = function toggleQualityLevelsMenu(e) {
53
- setLevelsAnchorEl(levelsAnchorEl ? null : e.currentTarget);
54
- };
55
- var changeQualityLevel = debounce(function (newQualityLevel) {
56
- if (newQualityLevel.id === selectedQualityLevel.id) {
57
- return;
58
- }
59
- setSelectedQualityLevel(newQualityLevel);
60
- var isAutoQuality = newQualityLevel.id === VIDEO_PLAYER_AUTO_QUALITY_ID;
61
- var qualityLevels = Array.from(qualityLevelsRef.current);
62
-
63
- // We are disabling the current quality level first, after enabling the newly selected level and disabling others..
64
- // avoiding to having fallback quality level triggered if we disabled the current quality level before enabling the newly one.
65
- var currentSelectedQualityIndex;
66
- var newSelectedQualityIndex;
67
- qualityLevels.forEach(function (qualityLevel, index) {
68
- if (qualityLevel.id === selectedQualityLevel.id) {
69
- currentSelectedQualityIndex = index;
70
- return;
71
- }
72
- if (qualityLevel.id === newQualityLevel.id) {
73
- newSelectedQualityIndex = index;
74
- return;
75
- }
76
- qualityLevel.enabled = qualityLevel.id === newQualityLevel.id || isAutoQuality;
77
- });
78
- if (currentSelectedQualityIndex >= 0) {
79
- qualityLevels[currentSelectedQualityIndex].enabled = isAutoQuality;
80
- }
81
- if (newSelectedQualityIndex >= 0) {
82
- qualityLevels[newSelectedQualityIndex].enabled = true;
83
- }
84
- }, 5);
85
- var getQualityResolution = function getQualityResolution(qualityLevel) {
86
- var resolution = qualityLevelPixelToResolution[qualityLevel];
87
- return resolution ? " (".concat(resolution, ")") : '';
88
- };
89
- useEffect(function () {
90
- if (isPlayerReady) {
91
- if (videoRef.current) {
92
- qualityLevelsRef.current = videoRef.current.qualityLevels();
93
- }
94
- if (qualityLevelsRef.current) {
95
- // we are debouncing the callback fn. cause it is going to be called on each quality level added.
96
- qualityLevelsRef.current.on('addqualitylevel', assignQualityLevels);
97
- }
98
- }
99
- return function () {
100
- if (qualityLevelsRef.current) {
101
- qualityLevelsRef.current.off('addqualitylevel', assignQualityLevels);
102
- qualityLevelsRef.current = null;
103
- }
104
- };
105
- }, [isPlayerReady]);
106
- if (qualityLevels.length === 0) {
107
- return null;
108
- }
109
- return /*#__PURE__*/_jsxs(_Fragment, {
110
- children: [/*#__PURE__*/_jsxs(Styled.QualityLevelsMenu, {
111
- anchorEl: levelsAnchorEl,
112
- onClose: toggleQualityLevelsMenu,
113
- open: Boolean(levelsAnchorEl),
114
- position: "top",
115
- hideScroll: false,
116
- enableOverlay: true,
117
- children: [/*#__PURE__*/_jsx(Styled.QualityLevelsMenuLabel, {
118
- disabled: true,
119
- children: i18n('mediaPlayerVideoPlayerQualityLabel')
120
- }), qualityLevels.map(function (quality) {
121
- return quality && /*#__PURE__*/_jsx(MenuItem, {
122
- onClick: function onClick() {
123
- return changeQualityLevel(quality);
124
- },
125
- active: selectedQualityLevel.id === quality.id,
126
- size: "sm",
127
- children: "".concat(quality.label).concat(getQualityResolution(quality.label))
128
- }, quality.id);
129
- })]
130
- }), /*#__PURE__*/_jsx(Button, {
131
- size: "sm",
132
- color: "link-basic-secondary",
133
- onClick: toggleQualityLevelsMenu,
134
- startIcon: /*#__PURE__*/_jsx(Optimization, {
135
- size: 18
136
- }),
137
- children: selectedQualityLevel.label
138
- })]
139
- });
140
- };
141
- export default VideoPlayerQualityLevels;
@@ -1,142 +0,0 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- var _excluded = ["width", "height", "sources", "setVideoRef"];
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
6
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
7
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
9
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
11
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
12
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
13
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
14
- function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
15
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
16
- import { useEffect, useRef, useState } from 'react';
17
- import videoJs from 'video.js';
18
- import { FitScreen } from '@scaleflex/icons';
19
- import toggleElementFullscreen from '@scaleflex/widget-utils/lib/toggleElementFullscreen';
20
- import MediaControls from '../MediaControls';
21
- import Styled from './VideoPlayer.styled';
22
- import { proxifyPlayerPropGettersSetters } from './VideoPlayer.utils';
23
- import { defaultVideoPlayerOptions } from './VideoPlayer.constants';
24
- import VideoPlayerQualityLevels from './VideoPlayerQualityLevels';
25
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
26
- var VideoPlayer = function VideoPlayer(_ref) {
27
- var mediaOptions = _ref.mediaOptions,
28
- onReady = _ref.onReady,
29
- onError = _ref.onError,
30
- beforeControlsElement = _ref.beforeControlsElement;
31
- var _ref2 = mediaOptions || {},
32
- width = _ref2.width,
33
- height = _ref2.height,
34
- sources = _ref2.sources,
35
- setVideoRef = _ref2.setVideoRef,
36
- moreOptions = _objectWithoutProperties(_ref2, _excluded);
37
- var videoPlayerRef = useRef(null);
38
- var videoNodeWrapperRef = useRef(null);
39
- var videoNodeRef = useRef(null);
40
- var playerRef = useRef(null);
41
- var errorAttempts = useRef(0);
42
- var _useState = useState(false),
43
- _useState2 = _slicedToArray(_useState, 2),
44
- isPlayerReady = _useState2[0],
45
- setIsPlayerReady = _useState2[1];
46
- var handleSourceError = function handleSourceError(error) {
47
- if (++errorAttempts.current === sources.length && typeof onError === 'function') {
48
- onError(error);
49
- }
50
- };
51
- var assignPlayerSources = function assignPlayerSources() {
52
- var player = playerRef.current;
53
- if (!player || JSON.stringify(sources) === JSON.stringify(player.currentSources())) {
54
- return;
55
- }
56
- player.autoplay(true);
57
- player.src(sources);
58
- };
59
- useEffect(function () {
60
- if (!playerRef.current && videoNodeRef.current) {
61
- var player = videoJs(videoNodeRef.current, _objectSpread(_objectSpread({}, defaultVideoPlayerOptions), {}, {
62
- sources: sources,
63
- width: width,
64
- height: height
65
- }, moreOptions), function () {
66
- setIsPlayerReady(true);
67
- if (typeof onReady === 'function') {
68
- onReady(player);
69
- }
70
- });
71
- player.on('error', handleSourceError);
72
- playerRef.current = proxifyPlayerPropGettersSetters(player);
73
- if (typeof setVideoRef === 'function') {
74
- setVideoRef(videoNodeRef.current);
75
- }
76
- } else {
77
- assignPlayerSources();
78
- }
79
- }, [sources]);
80
- useEffect(function () {
81
- var player = playerRef.current;
82
- return function () {
83
- if (player && !player.isDisposed()) {
84
- player.dispose();
85
- player.off('error', handleSourceError);
86
- playerRef.current = null;
87
- }
88
- };
89
- }, []);
90
- var handleVideoFullScreenClick = function handleVideoFullScreenClick() {
91
- if (!videoPlayerRef.current) {
92
- return;
93
- }
94
- toggleElementFullscreen(videoPlayerRef.current);
95
- };
96
- var toggleVideo = function toggleVideo() {
97
- if (!playerRef.current) {
98
- return;
99
- }
100
- if (playerRef.current.paused) {
101
- playerRef.current.play();
102
- } else {
103
- playerRef.current.pause();
104
- }
105
- };
106
- var renderExtraControllers = function renderExtraControllers() {
107
- return /*#__PURE__*/_jsxs(Styled.ExtraControllers, {
108
- children: [/*#__PURE__*/_jsx(VideoPlayerQualityLevels, {
109
- videoRef: playerRef,
110
- isPlayerReady: isPlayerReady
111
- }), /*#__PURE__*/_jsx(Styled.ExtraControllerBtn, {
112
- size: "lg",
113
- color: "basic",
114
- onClick: handleVideoFullScreenClick,
115
- children: /*#__PURE__*/_jsx(FitScreen, {
116
- size: 18
117
- })
118
- })]
119
- });
120
- };
121
- return /*#__PURE__*/_jsxs(Styled.VideoPlayerWrapper, {
122
- ref: videoPlayerRef,
123
- children: [/*#__PURE__*/_jsxs(Styled.VideoNodeWrapper, {
124
- ref: videoNodeWrapperRef,
125
- onClick: toggleVideo,
126
- onDoubleClick: handleVideoFullScreenClick,
127
- children: [/*#__PURE__*/_jsx("video", {
128
- ref: videoNodeRef
129
- }), Boolean(beforeControlsElement) && beforeControlsElement]
130
- }), /*#__PURE__*/_jsx(Styled.VideoPlayerControls, {
131
- children: /*#__PURE__*/_jsx(MediaControls, {
132
- extraControllers: renderExtraControllers,
133
- mediaPlayerRef: videoPlayerRef,
134
- mediaRef: playerRef,
135
- isPlayerReady: isPlayerReady,
136
- onKeyboardFullscreenKeyDown: handleVideoFullScreenClick,
137
- dismissInitialLoad: true
138
- })
139
- })]
140
- });
141
- };
142
- export default VideoPlayer;
@@ -1,49 +0,0 @@
1
- import { Volume, Mute } from '@scaleflex/icons';
2
- import Styled from './MediaPlayer.styled';
3
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
- var VolumeControl = function VolumeControl(_ref) {
5
- var value = _ref.value,
6
- onChange = _ref.onChange,
7
- isMuted = _ref.isMuted,
8
- toggleMute = _ref.toggleMute,
9
- isAudioSliderOpen = _ref.isAudioSliderOpen,
10
- setIsAudioSliderOpen = _ref.setIsAudioSliderOpen,
11
- closeAudioSlider = _ref.closeAudioSlider;
12
- var onScrubStart = function onScrubStart(_, value) {
13
- onChange(value);
14
- setIsAudioSliderOpen(true);
15
- };
16
- var onScrubEnd = function onScrubEnd() {
17
- closeAudioSlider();
18
- setIsAudioSliderOpen(false);
19
- };
20
- return /*#__PURE__*/_jsxs(Styled.VolumeControlWrapper, {
21
- $shown: isAudioSliderOpen,
22
- children: [/*#__PURE__*/_jsxs(Styled.VolumeIconButton, {
23
- size: "lg",
24
- onClick: toggleMute,
25
- color: "basic",
26
- children: [/*#__PURE__*/_jsx(Styled.Icon, {
27
- $hidden: isMuted,
28
- icon: /*#__PURE__*/_jsx(Volume, {
29
- size: 18
30
- })
31
- }), /*#__PURE__*/_jsx(Styled.Icon, {
32
- $hidden: !isMuted,
33
- icon: /*#__PURE__*/_jsx(Mute, {
34
- size: 18
35
- })
36
- })]
37
- }), /*#__PURE__*/_jsx(Styled.VolumeSlider, {
38
- hideAnnotation: true,
39
- min: 0,
40
- max: 1,
41
- step: 0.1,
42
- value: value !== null && value !== void 0 ? value : 1,
43
- onChange: onScrubStart,
44
- onMouseUp: onScrubEnd,
45
- onKeyUp: onScrubEnd
46
- })]
47
- });
48
- };
49
- export default VolumeControl;
@@ -1,4 +0,0 @@
1
- export default {
2
- mediaPlayerVideoPlayerAutoQualityLabel: 'Auto',
3
- mediaPlayerVideoPlayerQualityLabel: 'Quality'
4
- };
package/lib/index.js DELETED
@@ -1,92 +0,0 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
3
- function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
4
- function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
5
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
8
- function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
9
- function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
10
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
- function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
12
- function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
13
- function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
14
- import { Plugin } from '@scaleflex/widget-core';
15
- import Explorer from '@scaleflex/widget-explorer';
16
- import Translator from '@scaleflex/widget-utils/lib/Translator';
17
- import { PLUGINS_IDS } from '@scaleflex/widget-utils/lib/constants';
18
- import defaultLocale from './defaultLocale';
19
- import VideoPlayer from './components/VideoPlayer';
20
- import AudioPlayer from './components/AudioPlayer';
21
-
22
- // TODO: find a way to show version of the current plugin
23
- // why solution below isn't good?
24
- // first import doesn't work with webpack 5 as it was deprecated
25
- // second import fixes webpack 5 issue as it was mentioned in their docs
26
- // but it exposes our package.json to the client and it is mentioned as security rist in mutiple places
27
- // https://github.com/axelpale/genversion
28
- // https://stackoverflow.com/questions/64993118/error-should-not-import-the-named-export-version-imported-as-version
29
- // https://stackoverflow.com/questions/9153571/is-there-a-way-to-get-version-from-package-json-in-nodejs-code/10855054#10855054
30
- // import { version } from '../package.json'
31
- // import packageInfo from '../package.json'
32
- var MediaPlayer = /*#__PURE__*/function (_Plugin) {
33
- // static VERSION = packageInfo.version
34
-
35
- function MediaPlayer(filerobot) {
36
- var _this;
37
- var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
38
- _classCallCheck(this, MediaPlayer);
39
- _this = _callSuper(this, MediaPlayer, [filerobot, opts]);
40
- _this.id = PLUGINS_IDS.MEDIA_PLAYER;
41
- _this.title = 'media-player';
42
- _this.type = 'editor';
43
- _this.opts = opts;
44
- _this.defaultLocale = {
45
- strings: defaultLocale
46
- };
47
- _this.i18nInit();
48
- return _this;
49
- }
50
- _inherits(MediaPlayer, _Plugin);
51
- return _createClass(MediaPlayer, [{
52
- key: "i18nInit",
53
- value: function i18nInit() {
54
- this.translator = new Translator([this.defaultLocale, this.filerobot.locale, this.opts.locale]);
55
- this.i18n = this.translator.translate.bind(this.translator);
56
- this.i18nArray = this.translator.translateArray.bind(this.translator);
57
- }
58
- }, {
59
- key: "install",
60
- value: function install() {
61
- if (Explorer) {
62
- this.mount(Explorer, this);
63
- }
64
- }
65
- }, {
66
- key: "uninstall",
67
- value: function uninstall() {
68
- this.unmount();
69
- }
70
- }, {
71
- key: "render",
72
- value: function render(_ref) {
73
- var mediaOptions = _ref.mediaOptions,
74
- onError = _ref.onError,
75
- onReady = _ref.onReady,
76
- beforeControlsElement = _ref.beforeControlsElement,
77
- _ref$type = _ref.type,
78
- type = _ref$type === void 0 ? 'audio' : _ref$type;
79
- var isVideo = type === 'video';
80
- return isVideo ? VideoPlayer({
81
- mediaOptions: mediaOptions,
82
- onError: onError,
83
- onReady: onReady,
84
- beforeControlsElement: beforeControlsElement
85
- }) : AudioPlayer({
86
- mediaOptions: mediaOptions,
87
- beforeControlsElement: beforeControlsElement
88
- });
89
- }
90
- }]);
91
- }(Plugin);
92
- export default MediaPlayer;