@scaleflex/widget-media-player 0.0.1

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.
@@ -0,0 +1,36 @@
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
+ };
@@ -0,0 +1,141 @@
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;
@@ -0,0 +1,142 @@
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;
@@ -0,0 +1,49 @@
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;
@@ -0,0 +1,4 @@
1
+ export default {
2
+ mediaPlayerVideoPlayerAutoQualityLabel: 'Auto',
3
+ mediaPlayerVideoPlayerQualityLabel: 'Quality'
4
+ };
package/lib/index.js ADDED
@@ -0,0 +1,92 @@
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;
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@scaleflex/widget-media-player",
3
+ "version": "0.0.1",
4
+ "description": "Media player integration for video/audio files with Scaleflex",
5
+ "license": "MIT",
6
+ "main": "lib/index.js",
7
+ "files": [
8
+ "/dist",
9
+ "/lib",
10
+ "/types"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "dependencies": {
16
+ "@scaleflex/icons": "^3.0.0-beta.11",
17
+ "@scaleflex/ui": "^3.0.0-beta.11",
18
+ "@scaleflex/widget-common": "^0.0.1",
19
+ "video.js": "^8.10.0"
20
+ },
21
+ "devDependencies": {
22
+ "react": "^19.0.0",
23
+ "react-dom": "^19.0.0"
24
+ },
25
+ "peerDependencies": {
26
+ "@reduxjs/toolkit": "^1.9.5",
27
+ "@scaleflex/widget-core": "^0.0.0",
28
+ "@scaleflex/widget-explorer": "^0.0.0",
29
+ "react": ">=19.0.0",
30
+ "react-dom": ">=19.0.0",
31
+ "react-redux": "^8.1.1"
32
+ },
33
+ "gitHead": "64ea82e745b7deda36d6794863350e6671e9010d"
34
+ }