@micromag/element-video 0.2.327 → 0.2.353

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.
@@ -1 +1 @@
1
- .micromag-element-video-container.micromag-element-video-withSize video{position:absolute;top:0;left:0;width:100%;height:100%}.micromag-element-video-container{position:relative}.micromag-element-video-container video{display:block;width:100%}
1
+ .micromag-element-video-container.micromag-element-video-withSize .micromag-element-video-video{position:absolute;top:0;left:0;width:100%;height:100%}.micromag-element-video-container{position:relative}.micromag-element-video-container .micromag-element-video-video{display:block;width:100%}
package/es/index.js CHANGED
@@ -1,14 +1,16 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
3
- import React, { useEffect } from 'react';
3
+ import React, { useMemo, useEffect } from 'react';
4
4
  import PropTypes$1 from 'prop-types';
5
5
  import classNames from 'classnames';
6
6
  import { PropTypes } from '@micromag/core';
7
7
  import { useUserInteracted } from '@micromag/core/contexts';
8
8
  import { useMediaApi } from '@micromag/core/hooks';
9
+ import { getMediaFilesAsArray } from '@micromag/core/utils';
9
10
 
10
- var styles = {"container":"micromag-element-video-container","withSize":"micromag-element-video-withSize"};
11
+ var styles = {"container":"micromag-element-video-container","withSize":"micromag-element-video-withSize","video":"micromag-element-video-video"};
11
12
 
13
+ var _excluded = ["ref"];
12
14
  var propTypes = {
13
15
  media: PropTypes.videoMedia,
14
16
  width: PropTypes$1.number,
@@ -32,7 +34,8 @@ var propTypes = {
32
34
  onProgressStep: PropTypes$1.func,
33
35
  onDurationChanged: PropTypes$1.func,
34
36
  onVolumeChanged: PropTypes$1.func,
35
- focusable: PropTypes$1.bool // onPosterLoaded: PropTypes.func,
37
+ focusable: PropTypes$1.bool,
38
+ supportedMimes: PropTypes$1.arrayOf(PropTypes$1.string) // onPosterLoaded: PropTypes.func,
36
39
 
37
40
  };
38
41
  var defaultProps = {
@@ -56,12 +59,13 @@ var defaultProps = {
56
59
  onProgressStep: null,
57
60
  onDurationChanged: null,
58
61
  onVolumeChanged: null,
59
- focusable: true // onPosterLoaded: null,
62
+ focusable: true,
63
+ supportedMimes: ['video/mp4', 'video/webm', 'video/ogg'] // onPosterLoaded: null,
60
64
 
61
65
  };
62
66
 
63
67
  var Video = function Video(_ref) {
64
- var _ref3;
68
+ var _ref6;
65
69
 
66
70
  var media = _ref.media,
67
71
  width = _ref.width,
@@ -83,16 +87,54 @@ var Video = function Video(_ref) {
83
87
  onProgressStep = _ref.onProgressStep,
84
88
  onDurationChanged = _ref.onDurationChanged,
85
89
  onVolumeChanged = _ref.onVolumeChanged,
86
- focusable = _ref.focusable;
90
+ focusable = _ref.focusable,
91
+ supportedMimes = _ref.supportedMimes;
87
92
 
88
93
  var _ref2 = media || {},
89
94
  _ref2$url = _ref2.url,
90
- url = _ref2$url === void 0 ? null : _ref2$url,
95
+ mediaUrl = _ref2$url === void 0 ? null : _ref2$url,
91
96
  _ref2$files = _ref2.files,
92
- files = _ref2$files === void 0 ? null : _ref2$files;
97
+ files = _ref2$files === void 0 ? null : _ref2$files,
98
+ _ref2$metadata = _ref2.metadata,
99
+ metadata = _ref2$metadata === void 0 ? null : _ref2$metadata;
93
100
 
94
- var hasFiles = files !== null && typeof files.h264 !== 'undefined' && typeof files.webm !== 'undefined';
95
- var mediaUrl = hasFiles ? files.h264.url : url;
101
+ var _ref3 = metadata || {},
102
+ _ref3$description = _ref3.description,
103
+ description = _ref3$description === void 0 ? null : _ref3$description,
104
+ _ref3$mime = _ref3.mime,
105
+ mediaMime = _ref3$mime === void 0 ? null : _ref3$mime;
106
+
107
+ var filesArray = useMemo(function () {
108
+ return getMediaFilesAsArray(files);
109
+ }, [files]); // Get source files with supported mimes
110
+
111
+ var sourceFiles = useMemo(function () {
112
+ if (filesArray.length === 0) {
113
+ return null;
114
+ }
115
+
116
+ var supportVideo = document.createElement('video');
117
+ var finalSupportedMimes = supportedMimes.filter(function (mime) {
118
+ return supportVideo.canPlayType(mime) !== '';
119
+ });
120
+ return finalSupportedMimes.length > 0 ? filesArray.filter(function (file) {
121
+ var _file$mime = file.mime,
122
+ mime = _file$mime === void 0 ? "video/".concat(file.id === 'h264' ? 'mp4' : file.id) : _file$mime;
123
+ return finalSupportedMimes.indexOf(mime) !== -1;
124
+ }, null) : null;
125
+ }, [filesArray, supportedMimes]); // @NOTE: Media is an animated image and doesn't have source files in video formats
126
+
127
+ var _ref4 = filesArray.find(function (_ref5) {
128
+ var id = _ref5.id;
129
+ return id === 'original';
130
+ }) || {},
131
+ _ref4$type = _ref4.type,
132
+ originalType = _ref4$type === void 0 ? null : _ref4$type,
133
+ _ref4$mime = _ref4.mime,
134
+ originalMime = _ref4$mime === void 0 ? mediaMime : _ref4$mime;
135
+
136
+ var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
137
+ var isImageWithoutSourceFile = originalFileIsImage && sourceFiles === null;
96
138
  var userInteracted = useUserInteracted();
97
139
  var finalInitialMuted = initialMuted === true || initialMuted === 'auto' && autoPlay && !userInteracted;
98
140
 
@@ -109,7 +151,7 @@ var Video = function Video(_ref) {
109
151
  onVolumeChanged: onVolumeChanged
110
152
  }),
111
153
  ref = _useMediaApi.ref,
112
- api = _objectWithoutProperties(_useMediaApi, ["ref"]);
154
+ api = _objectWithoutProperties(_useMediaApi, _excluded);
113
155
 
114
156
  if (apiRef !== null) {
115
157
  apiRef.current = api;
@@ -152,15 +194,19 @@ var Video = function Video(_ref) {
152
194
  }
153
195
  }, [autoPlay]);
154
196
  return /*#__PURE__*/React.createElement("div", {
155
- className: classNames([styles.container, (_ref3 = {}, _defineProperty(_ref3, className, className !== null), _defineProperty(_ref3, styles.paused, !playing), _defineProperty(_ref3, styles.withSize, withSize), _ref3)]),
197
+ className: classNames([styles.container, (_ref6 = {}, _defineProperty(_ref6, className, className !== null), _defineProperty(_ref6, styles.paused, !playing), _defineProperty(_ref6, styles.withSize, withSize), _ref6)]),
156
198
  style: withSize ? {
157
199
  width: width,
158
200
  height: height
159
201
  } : null
160
- }, /*#__PURE__*/React.createElement("video", {
202
+ }, isImageWithoutSourceFile ? /*#__PURE__*/React.createElement("img", {
203
+ src: mediaUrl,
204
+ alt: description,
205
+ className: styles.video
206
+ }) : /*#__PURE__*/React.createElement("video", {
161
207
  key: mediaUrl,
162
208
  ref: ref,
163
- src: !hasFiles ? mediaUrl : null,
209
+ src: sourceFiles === null ? mediaUrl : null,
164
210
  autoPlay: autoPlay,
165
211
  loop: loop,
166
212
  muted: muted // poster={thumbnailUrl}
@@ -168,14 +214,17 @@ var Video = function Video(_ref) {
168
214
  preload: preload,
169
215
  playsInline: playsInline,
170
216
  crossOrigin: withoutCors ? 'anonymous' : null,
171
- tabIndex: focusable ? '0' : '-1'
172
- }, hasFiles ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("source", {
173
- src: files.webm.url,
174
- type: "video/webm"
175
- }), /*#__PURE__*/React.createElement("source", {
176
- src: files.h264.url,
177
- type: "video/mp4"
178
- })) : null));
217
+ tabIndex: focusable ? '0' : '-1',
218
+ className: styles.video
219
+ }, (sourceFiles || []).map(function (_ref7) {
220
+ var sourceUrl = _ref7.url,
221
+ sourceMime = _ref7.mime;
222
+ return /*#__PURE__*/React.createElement("source", {
223
+ key: "".concat(sourceUrl, "-").concat(sourceMime),
224
+ src: sourceUrl,
225
+ type: sourceMime
226
+ });
227
+ })));
179
228
  };
180
229
 
181
230
  Video.propTypes = propTypes;
@@ -186,4 +235,4 @@ var Video$1 = /*#__PURE__*/React.forwardRef(function (props, ref) {
186
235
  }, props));
187
236
  });
188
237
 
189
- export default Video$1;
238
+ export { Video$1 as default };
package/lib/index.js CHANGED
@@ -8,6 +8,7 @@ var classNames = require('classnames');
8
8
  var core = require('@micromag/core');
9
9
  var contexts = require('@micromag/core/contexts');
10
10
  var hooks = require('@micromag/core/hooks');
11
+ var utils = require('@micromag/core/utils');
11
12
 
12
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
14
 
@@ -17,32 +18,34 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
18
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
18
19
  var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
19
20
 
20
- var styles = {"container":"micromag-element-video-container","withSize":"micromag-element-video-withSize"};
21
+ var styles = {"container":"micromag-element-video-container","withSize":"micromag-element-video-withSize","video":"micromag-element-video-video"};
21
22
 
23
+ var _excluded = ["ref"];
22
24
  var propTypes = {
23
25
  media: core.PropTypes.videoMedia,
24
- width: PropTypes__default['default'].number,
25
- height: PropTypes__default['default'].number,
26
- apiRef: PropTypes__default['default'].oneOfType([PropTypes__default['default'].func, PropTypes__default['default'].shape({
27
- current: PropTypes__default['default'].any
26
+ width: PropTypes__default["default"].number,
27
+ height: PropTypes__default["default"].number,
28
+ apiRef: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].shape({
29
+ current: PropTypes__default["default"].any
28
30
  })]),
29
- initialMuted: PropTypes__default['default'].oneOf(['auto', true, false]),
30
- autoPlay: PropTypes__default['default'].bool,
31
- loop: PropTypes__default['default'].bool,
32
- playsInline: PropTypes__default['default'].bool,
33
- preload: PropTypes__default['default'].string,
34
- withoutCors: PropTypes__default['default'].bool,
35
- className: PropTypes__default['default'].string,
36
- onReady: PropTypes__default['default'].func,
37
- onPlay: PropTypes__default['default'].func,
38
- onPause: PropTypes__default['default'].func,
39
- onEnded: PropTypes__default['default'].func,
40
- onSeeked: PropTypes__default['default'].func,
41
- onTimeUpdate: PropTypes__default['default'].func,
42
- onProgressStep: PropTypes__default['default'].func,
43
- onDurationChanged: PropTypes__default['default'].func,
44
- onVolumeChanged: PropTypes__default['default'].func,
45
- focusable: PropTypes__default['default'].bool // onPosterLoaded: PropTypes.func,
31
+ initialMuted: PropTypes__default["default"].oneOf(['auto', true, false]),
32
+ autoPlay: PropTypes__default["default"].bool,
33
+ loop: PropTypes__default["default"].bool,
34
+ playsInline: PropTypes__default["default"].bool,
35
+ preload: PropTypes__default["default"].string,
36
+ withoutCors: PropTypes__default["default"].bool,
37
+ className: PropTypes__default["default"].string,
38
+ onReady: PropTypes__default["default"].func,
39
+ onPlay: PropTypes__default["default"].func,
40
+ onPause: PropTypes__default["default"].func,
41
+ onEnded: PropTypes__default["default"].func,
42
+ onSeeked: PropTypes__default["default"].func,
43
+ onTimeUpdate: PropTypes__default["default"].func,
44
+ onProgressStep: PropTypes__default["default"].func,
45
+ onDurationChanged: PropTypes__default["default"].func,
46
+ onVolumeChanged: PropTypes__default["default"].func,
47
+ focusable: PropTypes__default["default"].bool,
48
+ supportedMimes: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string) // onPosterLoaded: PropTypes.func,
46
49
 
47
50
  };
48
51
  var defaultProps = {
@@ -66,12 +69,13 @@ var defaultProps = {
66
69
  onProgressStep: null,
67
70
  onDurationChanged: null,
68
71
  onVolumeChanged: null,
69
- focusable: true // onPosterLoaded: null,
72
+ focusable: true,
73
+ supportedMimes: ['video/mp4', 'video/webm', 'video/ogg'] // onPosterLoaded: null,
70
74
 
71
75
  };
72
76
 
73
77
  var Video = function Video(_ref) {
74
- var _ref3;
78
+ var _ref6;
75
79
 
76
80
  var media = _ref.media,
77
81
  width = _ref.width,
@@ -93,16 +97,54 @@ var Video = function Video(_ref) {
93
97
  onProgressStep = _ref.onProgressStep,
94
98
  onDurationChanged = _ref.onDurationChanged,
95
99
  onVolumeChanged = _ref.onVolumeChanged,
96
- focusable = _ref.focusable;
100
+ focusable = _ref.focusable,
101
+ supportedMimes = _ref.supportedMimes;
97
102
 
98
103
  var _ref2 = media || {},
99
104
  _ref2$url = _ref2.url,
100
- url = _ref2$url === void 0 ? null : _ref2$url,
105
+ mediaUrl = _ref2$url === void 0 ? null : _ref2$url,
101
106
  _ref2$files = _ref2.files,
102
- files = _ref2$files === void 0 ? null : _ref2$files;
107
+ files = _ref2$files === void 0 ? null : _ref2$files,
108
+ _ref2$metadata = _ref2.metadata,
109
+ metadata = _ref2$metadata === void 0 ? null : _ref2$metadata;
110
+
111
+ var _ref3 = metadata || {},
112
+ _ref3$description = _ref3.description,
113
+ description = _ref3$description === void 0 ? null : _ref3$description,
114
+ _ref3$mime = _ref3.mime,
115
+ mediaMime = _ref3$mime === void 0 ? null : _ref3$mime;
116
+
117
+ var filesArray = React.useMemo(function () {
118
+ return utils.getMediaFilesAsArray(files);
119
+ }, [files]); // Get source files with supported mimes
120
+
121
+ var sourceFiles = React.useMemo(function () {
122
+ if (filesArray.length === 0) {
123
+ return null;
124
+ }
103
125
 
104
- var hasFiles = files !== null && typeof files.h264 !== 'undefined' && typeof files.webm !== 'undefined';
105
- var mediaUrl = hasFiles ? files.h264.url : url;
126
+ var supportVideo = document.createElement('video');
127
+ var finalSupportedMimes = supportedMimes.filter(function (mime) {
128
+ return supportVideo.canPlayType(mime) !== '';
129
+ });
130
+ return finalSupportedMimes.length > 0 ? filesArray.filter(function (file) {
131
+ var _file$mime = file.mime,
132
+ mime = _file$mime === void 0 ? "video/".concat(file.id === 'h264' ? 'mp4' : file.id) : _file$mime;
133
+ return finalSupportedMimes.indexOf(mime) !== -1;
134
+ }, null) : null;
135
+ }, [filesArray, supportedMimes]); // @NOTE: Media is an animated image and doesn't have source files in video formats
136
+
137
+ var _ref4 = filesArray.find(function (_ref5) {
138
+ var id = _ref5.id;
139
+ return id === 'original';
140
+ }) || {},
141
+ _ref4$type = _ref4.type,
142
+ originalType = _ref4$type === void 0 ? null : _ref4$type,
143
+ _ref4$mime = _ref4.mime,
144
+ originalMime = _ref4$mime === void 0 ? mediaMime : _ref4$mime;
145
+
146
+ var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
147
+ var isImageWithoutSourceFile = originalFileIsImage && sourceFiles === null;
106
148
  var userInteracted = contexts.useUserInteracted();
107
149
  var finalInitialMuted = initialMuted === true || initialMuted === 'auto' && autoPlay && !userInteracted;
108
150
 
@@ -119,7 +161,7 @@ var Video = function Video(_ref) {
119
161
  onVolumeChanged: onVolumeChanged
120
162
  }),
121
163
  ref = _useMediaApi.ref,
122
- api = _objectWithoutProperties__default['default'](_useMediaApi, ["ref"]);
164
+ api = _objectWithoutProperties__default["default"](_useMediaApi, _excluded);
123
165
 
124
166
  if (apiRef !== null) {
125
167
  apiRef.current = api;
@@ -161,16 +203,20 @@ var Video = function Video(_ref) {
161
203
  pause();
162
204
  }
163
205
  }, [autoPlay]);
164
- return /*#__PURE__*/React__default['default'].createElement("div", {
165
- className: classNames__default['default']([styles.container, (_ref3 = {}, _defineProperty__default['default'](_ref3, className, className !== null), _defineProperty__default['default'](_ref3, styles.paused, !playing), _defineProperty__default['default'](_ref3, styles.withSize, withSize), _ref3)]),
206
+ return /*#__PURE__*/React__default["default"].createElement("div", {
207
+ className: classNames__default["default"]([styles.container, (_ref6 = {}, _defineProperty__default["default"](_ref6, className, className !== null), _defineProperty__default["default"](_ref6, styles.paused, !playing), _defineProperty__default["default"](_ref6, styles.withSize, withSize), _ref6)]),
166
208
  style: withSize ? {
167
209
  width: width,
168
210
  height: height
169
211
  } : null
170
- }, /*#__PURE__*/React__default['default'].createElement("video", {
212
+ }, isImageWithoutSourceFile ? /*#__PURE__*/React__default["default"].createElement("img", {
213
+ src: mediaUrl,
214
+ alt: description,
215
+ className: styles.video
216
+ }) : /*#__PURE__*/React__default["default"].createElement("video", {
171
217
  key: mediaUrl,
172
218
  ref: ref,
173
- src: !hasFiles ? mediaUrl : null,
219
+ src: sourceFiles === null ? mediaUrl : null,
174
220
  autoPlay: autoPlay,
175
221
  loop: loop,
176
222
  muted: muted // poster={thumbnailUrl}
@@ -178,20 +224,23 @@ var Video = function Video(_ref) {
178
224
  preload: preload,
179
225
  playsInline: playsInline,
180
226
  crossOrigin: withoutCors ? 'anonymous' : null,
181
- tabIndex: focusable ? '0' : '-1'
182
- }, hasFiles ? /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("source", {
183
- src: files.webm.url,
184
- type: "video/webm"
185
- }), /*#__PURE__*/React__default['default'].createElement("source", {
186
- src: files.h264.url,
187
- type: "video/mp4"
188
- })) : null));
227
+ tabIndex: focusable ? '0' : '-1',
228
+ className: styles.video
229
+ }, (sourceFiles || []).map(function (_ref7) {
230
+ var sourceUrl = _ref7.url,
231
+ sourceMime = _ref7.mime;
232
+ return /*#__PURE__*/React__default["default"].createElement("source", {
233
+ key: "".concat(sourceUrl, "-").concat(sourceMime),
234
+ src: sourceUrl,
235
+ type: sourceMime
236
+ });
237
+ })));
189
238
  };
190
239
 
191
240
  Video.propTypes = propTypes;
192
241
  Video.defaultProps = defaultProps;
193
- var Video$1 = /*#__PURE__*/React__default['default'].forwardRef(function (props, ref) {
194
- return /*#__PURE__*/React__default['default'].createElement(Video, Object.assign({
242
+ var Video$1 = /*#__PURE__*/React__default["default"].forwardRef(function (props, ref) {
243
+ return /*#__PURE__*/React__default["default"].createElement(Video, Object.assign({
195
244
  apiRef: ref
196
245
  }, props));
197
246
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micromag/element-video",
3
- "version": "0.2.327",
3
+ "version": "0.2.353",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "javascript"
@@ -40,21 +40,21 @@
40
40
  "prepare": "../../scripts/prepare-package.sh"
41
41
  },
42
42
  "devDependencies": {
43
- "react": "^16.8.0",
44
- "react-dom": "^16.8.0"
43
+ "react": "^16.8.0 || ^17.0.0",
44
+ "react-dom": "^16.8.0 || ^17.0.0"
45
45
  },
46
46
  "peerDependencies": {
47
- "react": "^16.8.0",
48
- "react-dom": "^16.8.0"
47
+ "react": "^16.8.0 || ^17.0.0",
48
+ "react-dom": "^16.8.0 || ^17.0.0"
49
49
  },
50
50
  "dependencies": {
51
51
  "@babel/runtime": "^7.13.10",
52
52
  "@fortawesome/fontawesome-svg-core": "^1.2.32",
53
53
  "@fortawesome/free-solid-svg-icons": "^5.15.1",
54
54
  "@fortawesome/react-fontawesome": "^0.1.13",
55
- "@micromag/core": "^0.2.327",
56
- "@micromag/element-closed-captions": "^0.2.327",
57
- "@micromag/element-media-controls": "^0.2.327",
55
+ "@micromag/core": "^0.2.353",
56
+ "@micromag/element-closed-captions": "^0.2.353",
57
+ "@micromag/element-media-controls": "^0.2.353",
58
58
  "classnames": "^2.2.6",
59
59
  "prop-types": "^15.7.2",
60
60
  "react-intl": "^5.12.1",
@@ -63,5 +63,5 @@
63
63
  "publishConfig": {
64
64
  "access": "public"
65
65
  },
66
- "gitHead": "2051023f216b19695acf83053ef3bdca24f96932"
66
+ "gitHead": "2fa5d38251980ca054d584adcb07e9fbe703299f"
67
67
  }