@atlaskit/media-common 2.19.0 → 2.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/analytics/index.js +0 -2
- package/dist/cjs/analytics/withMediaAnalyticsContext.js +3 -17
- package/dist/cjs/docs/index.js +0 -2
- package/dist/cjs/docs/media-use-only.js +0 -8
- package/dist/cjs/docs/rxjs-notice.js +0 -4
- package/dist/cjs/downloadUrl.js +0 -6
- package/dist/cjs/index.js +0 -6
- package/dist/cjs/mediaFeatureFlag-local.js +2 -4
- package/dist/cjs/mediaFeatureFlags/index.js +0 -1
- package/dist/cjs/mediaFeatureFlags/mediaFeatureFlags.js +13 -34
- package/dist/cjs/mediaFeatureFlags/productKeys.js +4 -2
- package/dist/cjs/mediaFeatureFlags/types.js +2 -0
- package/dist/cjs/mediaTypeUtils/index.js +0 -10
- package/dist/cjs/mediaTypeUtils/isArchive.js +0 -2
- package/dist/cjs/mediaTypeUtils/isMimeTypeSupportedByBrowser.js +3 -12
- package/dist/cjs/mediaTypeUtils/isMimeTypeSupportedByServer.js +27 -26
- package/dist/cjs/utils/helpers.js +3 -28
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/analytics/index.js +3 -1
- package/dist/es2019/analytics/withMediaAnalyticsContext.js +9 -7
- package/dist/es2019/docs/media-use-only.js +0 -4
- package/dist/es2019/downloadUrl.js +0 -4
- package/dist/es2019/index.js +4 -2
- package/dist/es2019/mediaFeatureFlag-local.js +2 -2
- package/dist/es2019/mediaFeatureFlags/mediaFeatureFlags.js +10 -12
- package/dist/es2019/mediaFeatureFlags/productKeys.js +4 -0
- package/dist/es2019/mediaFeatureFlags/types.js +2 -0
- package/dist/es2019/mediaTypeUtils/index.js +0 -5
- package/dist/es2019/mediaTypeUtils/isMimeTypeSupportedByBrowser.js +3 -2
- package/dist/es2019/mediaTypeUtils/isMimeTypeSupportedByServer.js +27 -14
- package/dist/es2019/utils/helpers.js +0 -8
- package/dist/es2019/version.json +1 -1
- package/dist/esm/analytics/index.js +3 -1
- package/dist/esm/analytics/withMediaAnalyticsContext.js +3 -7
- package/dist/esm/docs/media-use-only.js +0 -5
- package/dist/esm/downloadUrl.js +0 -4
- package/dist/esm/index.js +4 -2
- package/dist/esm/mediaFeatureFlag-local.js +2 -2
- package/dist/esm/mediaFeatureFlags/mediaFeatureFlags.js +13 -17
- package/dist/esm/mediaFeatureFlags/productKeys.js +4 -0
- package/dist/esm/mediaFeatureFlags/types.js +2 -0
- package/dist/esm/mediaTypeUtils/index.js +0 -5
- package/dist/esm/mediaTypeUtils/isMimeTypeSupportedByBrowser.js +3 -2
- package/dist/esm/mediaTypeUtils/isMimeTypeSupportedByServer.js +27 -14
- package/dist/esm/utils/helpers.js +3 -15
- package/dist/esm/version.json +1 -1
- package/package.json +2 -2
|
@@ -1,96 +1,72 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.debounce = void 0;
|
|
9
8
|
exports.getRandomHex = getRandomHex;
|
|
10
9
|
exports.pick = exports.omitBy = exports.matches = exports.isUndefined = void 0;
|
|
11
|
-
|
|
12
10
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
|
-
|
|
14
11
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
-
|
|
16
12
|
var isUndefined = function isUndefined(value) {
|
|
17
13
|
return value === undefined;
|
|
18
14
|
};
|
|
19
|
-
|
|
20
15
|
exports.isUndefined = isUndefined;
|
|
21
|
-
|
|
22
16
|
var pick = function pick(obj) {
|
|
23
17
|
var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
24
|
-
|
|
25
18
|
if (obj === undefined) {
|
|
26
19
|
return {};
|
|
27
20
|
}
|
|
28
|
-
|
|
29
21
|
return Object.fromEntries(Object.entries(obj).filter(function (_ref) {
|
|
30
22
|
var _ref2 = (0, _slicedToArray2.default)(_ref, 1),
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
k = _ref2[0];
|
|
33
24
|
return keys.includes(k);
|
|
34
25
|
}));
|
|
35
26
|
};
|
|
36
|
-
|
|
37
27
|
exports.pick = pick;
|
|
38
|
-
|
|
39
28
|
var omitBy = function omitBy(obj, predicate) {
|
|
40
29
|
return Object.fromEntries(Object.entries(obj).filter(function (_ref3) {
|
|
41
30
|
var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
k = _ref4[0],
|
|
32
|
+
v = _ref4[1];
|
|
45
33
|
return !predicate(v);
|
|
46
34
|
}));
|
|
47
35
|
};
|
|
48
|
-
|
|
49
36
|
exports.omitBy = omitBy;
|
|
50
|
-
|
|
51
37
|
var debounce = function debounce(func, wait) {
|
|
52
38
|
var timeout;
|
|
53
39
|
return function () {
|
|
54
40
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
55
41
|
args[_key] = arguments[_key];
|
|
56
42
|
}
|
|
57
|
-
|
|
58
43
|
clearTimeout(timeout);
|
|
59
44
|
timeout = setTimeout(function () {
|
|
60
45
|
return func.apply(void 0, args);
|
|
61
46
|
}, wait);
|
|
62
47
|
};
|
|
63
48
|
};
|
|
64
|
-
|
|
65
49
|
exports.debounce = debounce;
|
|
66
|
-
|
|
67
50
|
var matches = function matches(srcObj) {
|
|
68
51
|
return function (obj) {
|
|
69
52
|
var key;
|
|
70
|
-
|
|
71
53
|
for (key in srcObj) {
|
|
72
54
|
if (obj[key] === undefined || obj[key] !== srcObj[key]) {
|
|
73
55
|
return false;
|
|
74
56
|
}
|
|
75
57
|
}
|
|
76
|
-
|
|
77
58
|
return true;
|
|
78
59
|
};
|
|
79
60
|
};
|
|
80
|
-
|
|
81
61
|
exports.matches = matches;
|
|
82
|
-
|
|
83
62
|
function getRandomHexValues(byte) {
|
|
84
63
|
return (0, _toConsumableArray2.default)(Array(byte * 2)).map(function () {
|
|
85
64
|
return Math.floor(Math.random() * 16).toString(16);
|
|
86
65
|
}).join('');
|
|
87
66
|
}
|
|
88
|
-
|
|
89
67
|
function getRandomHex(byte) {
|
|
90
68
|
var _window;
|
|
91
|
-
|
|
92
69
|
var randomHex;
|
|
93
|
-
|
|
94
70
|
if ((_window = window) !== null && _window !== void 0 && _window.crypto) {
|
|
95
71
|
try {
|
|
96
72
|
randomHex = Array.from(window.crypto.getRandomValues(new Uint8Array(byte))).map(function (b) {
|
|
@@ -102,6 +78,5 @@ function getRandomHex(byte) {
|
|
|
102
78
|
} else {
|
|
103
79
|
randomHex = getRandomHexValues(byte);
|
|
104
80
|
}
|
|
105
|
-
|
|
106
81
|
return randomHex;
|
|
107
82
|
}
|
package/dist/cjs/version.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Analytics base types
|
|
2
|
+
|
|
2
3
|
// Analytics context
|
|
3
|
-
export { withMediaAnalyticsContext } from './withMediaAnalyticsContext';
|
|
4
|
+
export { withMediaAnalyticsContext } from './withMediaAnalyticsContext';
|
|
4
5
|
|
|
6
|
+
// Analytics constants
|
|
5
7
|
export { ANALYTICS_MEDIA_CHANNEL } from './constants';
|
|
@@ -3,10 +3,11 @@ import React, { forwardRef, useMemo } from 'react';
|
|
|
3
3
|
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
4
4
|
import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context/MediaAnalyticsContext';
|
|
5
5
|
import { getMediaFeatureFlag } from '../mediaFeatureFlags';
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const getFilteredFeatureFlags = (keys, featureFlags) => keys.reduce((result, key) => ({
|
|
7
|
+
...result,
|
|
8
8
|
[key]: getMediaFeatureFlag(key, featureFlags)
|
|
9
9
|
}), {});
|
|
10
|
+
|
|
10
11
|
/**
|
|
11
12
|
* HOC for attaching MediaAnalyticsContext to a top-level React Component.
|
|
12
13
|
*
|
|
@@ -19,8 +20,6 @@ const getFilteredFeatureFlags = (keys, featureFlags) => keys.reduce((result, key
|
|
|
19
20
|
*
|
|
20
21
|
* @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
23
|
export const withMediaAnalyticsContext = (contextPublicAttributes, options = {}) => WrappedComponent => {
|
|
25
24
|
// forwardRef() allows passing React refs to the wrapped component WithMediaAnalyticsContext
|
|
26
25
|
const WithMediaAnalyticsContext = /*#__PURE__*/forwardRef((props, ref) => {
|
|
@@ -35,8 +34,10 @@ export const withMediaAnalyticsContext = (contextPublicAttributes, options = {})
|
|
|
35
34
|
const contextPrivateAttributes = {
|
|
36
35
|
featureFlags: filteredFlags
|
|
37
36
|
};
|
|
38
|
-
return {
|
|
39
|
-
|
|
37
|
+
return {
|
|
38
|
+
...contextPublicAttributes,
|
|
39
|
+
[MEDIA_CONTEXT]: {
|
|
40
|
+
...contextPrivateAttributes
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
}, [filterFeatureFlags, featureFlags]);
|
|
@@ -46,7 +47,8 @@ export const withMediaAnalyticsContext = (contextPublicAttributes, options = {})
|
|
|
46
47
|
ref: ref
|
|
47
48
|
})));
|
|
48
49
|
});
|
|
49
|
-
WithMediaAnalyticsContext.displayName = `WithMediaAnalyticsContext(${
|
|
50
|
+
WithMediaAnalyticsContext.displayName = `WithMediaAnalyticsContext(${
|
|
51
|
+
// @ts-ignore displayName doesn't exist on type
|
|
50
52
|
WrappedComponent.displayName || WrappedComponent.name})`;
|
|
51
53
|
return WithMediaAnalyticsContext;
|
|
52
54
|
};
|
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import SectionMessage from '@atlaskit/section-message';
|
|
3
|
-
|
|
4
3
|
function AlternativePackagesMessage({
|
|
5
4
|
alternatePackages
|
|
6
5
|
}) {
|
|
7
6
|
if (!alternatePackages) {
|
|
8
7
|
return null;
|
|
9
8
|
}
|
|
10
|
-
|
|
11
9
|
if (alternatePackages.length === 1) {
|
|
12
10
|
return /*#__PURE__*/React.createElement("p", null, "Consider using", ' ', /*#__PURE__*/React.createElement("a", {
|
|
13
11
|
href: alternatePackages[0].link
|
|
14
12
|
}, alternatePackages[0].name), ' ', "instead.");
|
|
15
13
|
}
|
|
16
|
-
|
|
17
14
|
return /*#__PURE__*/React.createElement("p", null, "Consider using one of these packages instead:", /*#__PURE__*/React.createElement("ul", null, alternatePackages.map(p => /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("a", {
|
|
18
15
|
href: p.link
|
|
19
16
|
}, p.name)))));
|
|
20
17
|
}
|
|
21
|
-
|
|
22
18
|
export function createMediaUseOnlyNotice(componentName, alternatePackages) {
|
|
23
19
|
return /*#__PURE__*/React.createElement(SectionMessage, {
|
|
24
20
|
title: "Internal Media Use Only",
|
|
@@ -4,7 +4,6 @@ export const downloadUrl = (url, options) => {
|
|
|
4
4
|
const iframeName = 'media-download-iframe';
|
|
5
5
|
const link = document.createElement('a');
|
|
6
6
|
let iframe = document.getElementById(iframeName);
|
|
7
|
-
|
|
8
7
|
if (!iframe) {
|
|
9
8
|
iframe = document.createElement('iframe');
|
|
10
9
|
iframe.style.display = 'none';
|
|
@@ -12,13 +11,10 @@ export const downloadUrl = (url, options) => {
|
|
|
12
11
|
iframe.name = iframeName;
|
|
13
12
|
document.body.appendChild(iframe);
|
|
14
13
|
}
|
|
15
|
-
|
|
16
14
|
link.href = url;
|
|
17
|
-
|
|
18
15
|
if (options && options.name) {
|
|
19
16
|
link.download = options.name;
|
|
20
17
|
}
|
|
21
|
-
|
|
22
18
|
link.target = isIE11 || isSafari ? '_blank' : iframeName;
|
|
23
19
|
document.body.appendChild(link);
|
|
24
20
|
link.click();
|
package/dist/es2019/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
export { downloadUrl } from './downloadUrl';
|
|
1
|
+
export { downloadUrl } from './downloadUrl';
|
|
2
|
+
// Warning! You can't add new media types!
|
|
2
3
|
// See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
|
|
3
4
|
|
|
4
5
|
// Media Feature Flags
|
|
5
6
|
export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
|
|
6
7
|
// Analytics context
|
|
7
|
-
export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
|
|
8
|
+
export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
|
|
8
9
|
|
|
10
|
+
// Analytics constants
|
|
9
11
|
export { ANALYTICS_MEDIA_CHANNEL } from './analytics/constants';
|
|
10
12
|
export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
|
|
11
13
|
export { isUndefined, pick, omitBy, debounce, matches, getRandomHex } from './utils/helpers';
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
export const getLocalMediaFeatureFlag = key => {
|
|
3
3
|
try {
|
|
4
4
|
return typeof window !== 'undefined' && window.localStorage ? window.localStorage.getItem(key) : null;
|
|
5
|
-
} catch (e) {
|
|
5
|
+
} catch (e) {
|
|
6
|
+
// do nothing, return null by default
|
|
6
7
|
}
|
|
7
|
-
|
|
8
8
|
return null;
|
|
9
9
|
};
|
|
@@ -6,11 +6,9 @@ export const areEqualFeatureFlags = (ffA, ffB) => {
|
|
|
6
6
|
if (!ffA && !ffB) {
|
|
7
7
|
return true;
|
|
8
8
|
}
|
|
9
|
-
|
|
10
9
|
if (!ffA || !ffB) {
|
|
11
10
|
return false;
|
|
12
11
|
}
|
|
13
|
-
|
|
14
12
|
const results = {
|
|
15
13
|
newCardExperience: ffA.newCardExperience === ffB.newCardExperience,
|
|
16
14
|
captions: ffA.captions === ffB.captions,
|
|
@@ -18,6 +16,8 @@ export const areEqualFeatureFlags = (ffA, ffB) => {
|
|
|
18
16
|
folderUploads: ffA.folderUploads === ffB.folderUploads,
|
|
19
17
|
observedWidth: ffA.observedWidth === ffB.observedWidth,
|
|
20
18
|
timestampOnVideo: ffA.timestampOnVideo === ffB.timestampOnVideo,
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
mediaUploadApiV2: ffA.mediaUploadApiV2 === ffB.mediaUploadApiV2,
|
|
21
21
|
memoryCacheLogging: ffA.memoryCacheLogging === ffB.memoryCacheLogging,
|
|
22
22
|
fetchFileStateAfterUpload: ffA.fetchFileStateAfterUpload === ffB.fetchFileStateAfterUpload
|
|
23
23
|
};
|
|
@@ -27,28 +27,29 @@ export const filterFeatureFlagNames = flags => {
|
|
|
27
27
|
const pairs = Object.entries(flags);
|
|
28
28
|
return pairs.filter(([_key, value]) => !!value).map(([key]) => key);
|
|
29
29
|
};
|
|
30
|
+
|
|
30
31
|
/**
|
|
31
32
|
* Takes a record of {Media Feature Flag Names → boolean} and a supported product name.
|
|
32
33
|
* Returns the corresponding product’s Launch Darkly Keys for each of the flags set as true in the input record.
|
|
33
34
|
* */
|
|
34
|
-
|
|
35
35
|
export const mapAndFilterFeatureFlagNames = (flags, product) => {
|
|
36
36
|
const mediaFeatureFlags = filterFeatureFlagNames(flags);
|
|
37
37
|
return mediaFeatureFlags.map(key => getProductKeys()[product][key]);
|
|
38
|
-
};
|
|
38
|
+
};
|
|
39
39
|
|
|
40
|
+
// TODO(MEX-1547): This is temporary solution to just return the launch darkly feature flags for all products.
|
|
40
41
|
/**
|
|
41
42
|
* Takes a record of {Media Feature Flag Names → boolean}.
|
|
42
43
|
* Returns the Launch Darkly Keys from all products for each of the flags set as true in the input record.
|
|
43
44
|
* */
|
|
44
|
-
|
|
45
45
|
export const filterFeatureFlagKeysAllProducts = flags => {
|
|
46
46
|
const filteredFlags = filterFeatureFlagNames(flags);
|
|
47
47
|
const ldFeatureFlags = [];
|
|
48
48
|
filteredFlags.forEach(flag => supportedProducts.forEach(product => ldFeatureFlags.push(getProductKeys()[product][flag])));
|
|
49
49
|
return ldFeatureFlags.filter(flag => flag !== '');
|
|
50
|
-
};
|
|
50
|
+
};
|
|
51
51
|
|
|
52
|
+
// default values defined here, not necessary for components to know directly as they should use the function below
|
|
52
53
|
export const defaultMediaFeatureFlags = {
|
|
53
54
|
newCardExperience: false,
|
|
54
55
|
captions: false,
|
|
@@ -58,9 +59,12 @@ export const defaultMediaFeatureFlags = {
|
|
|
58
59
|
folderUploads: false,
|
|
59
60
|
observedWidth: false,
|
|
60
61
|
timestampOnVideo: false,
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
mediaUploadApiV2: true,
|
|
61
64
|
memoryCacheLogging: false,
|
|
62
65
|
fetchFileStateAfterUpload: false
|
|
63
66
|
};
|
|
67
|
+
|
|
64
68
|
/**
|
|
65
69
|
* Public accessor from components to fallback to defaults if flags not passed,
|
|
66
70
|
* otherwise whatever product has set will be returned.
|
|
@@ -71,28 +75,22 @@ export const defaultMediaFeatureFlags = {
|
|
|
71
75
|
*
|
|
72
76
|
* (you will see a warning in console if override used)
|
|
73
77
|
* */
|
|
74
|
-
|
|
75
78
|
export function getMediaFeatureFlag(flagName, featureFlags) {
|
|
76
79
|
const devOverride = getLocalMediaFeatureFlag(flagName);
|
|
77
|
-
|
|
78
80
|
if (devOverride !== null) {
|
|
79
81
|
try {
|
|
80
82
|
return JSON.parse(devOverride);
|
|
81
83
|
} catch (e) {}
|
|
82
84
|
}
|
|
83
|
-
|
|
84
85
|
if (featureFlags) {
|
|
85
86
|
return flagName in featureFlags ? featureFlags[flagName] : defaultMediaFeatureFlags[flagName];
|
|
86
87
|
}
|
|
87
|
-
|
|
88
88
|
return defaultMediaFeatureFlags[flagName];
|
|
89
89
|
}
|
|
90
90
|
export const useMemoizeFeatureFlags = featureFlags => {
|
|
91
91
|
const ref = useRef();
|
|
92
|
-
|
|
93
92
|
if (!areEqualFeatureFlags(featureFlags, ref.current)) {
|
|
94
93
|
ref.current = featureFlags;
|
|
95
94
|
}
|
|
96
|
-
|
|
97
95
|
return ref.current;
|
|
98
96
|
};
|
|
@@ -7,6 +7,8 @@ const productKeys = {
|
|
|
7
7
|
//TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
|
|
8
8
|
observedWidth: '',
|
|
9
9
|
timestampOnVideo: 'confluence.frontend.media.timestamp.on.video',
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
mediaUploadApiV2: 'confluence.enable.media.upload.api.v2',
|
|
10
12
|
memoryCacheLogging: 'confluence-frontend-media-card-memory-cache-logging',
|
|
11
13
|
fetchFileStateAfterUpload: 'confluence-frontend-media-client-fetch-file-state-after-upload'
|
|
12
14
|
},
|
|
@@ -19,6 +21,8 @@ const productKeys = {
|
|
|
19
21
|
//TODO fill the value after https://product-fabric.atlassian.net/browse/MEX-1593
|
|
20
22
|
observedWidth: '',
|
|
21
23
|
timestampOnVideo: 'issue.details.media-cards-timestamp-on-video',
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
mediaUploadApiV2: 'issue.details.enable-media-upload-api-version-2',
|
|
22
26
|
memoryCacheLogging: 'jira-frontend-media-card-memory-cache-logging',
|
|
23
27
|
fetchFileStateAfterUpload: 'jira-frontend-media-client-fetch-file-state-after-upload'
|
|
24
28
|
}
|
|
@@ -7,22 +7,17 @@ export const getMediaTypeFromMimeType = mimeType => {
|
|
|
7
7
|
if (isArchive(mimeType)) {
|
|
8
8
|
return 'archive';
|
|
9
9
|
}
|
|
10
|
-
|
|
11
10
|
if (isImageMimeTypeSupportedByBrowser(mimeType) || isImageMimeTypeSupportedByServer(mimeType)) {
|
|
12
11
|
return 'image';
|
|
13
12
|
}
|
|
14
|
-
|
|
15
13
|
if (isDocumentMimeTypeSupportedByBrowser(mimeType) || isDocumentMimeTypeSupportedByServer(mimeType)) {
|
|
16
14
|
return 'doc';
|
|
17
15
|
}
|
|
18
|
-
|
|
19
16
|
if (isAudioMimeTypeSupportedByBrowser(mimeType) || isAudioMimeTypeSupportedByServer(mimeType)) {
|
|
20
17
|
return 'audio';
|
|
21
18
|
}
|
|
22
|
-
|
|
23
19
|
if (isVideoMimeTypeSupportedByBrowser(mimeType) || isVideoMimeTypeSupportedByServer(mimeType)) {
|
|
24
20
|
return 'video';
|
|
25
21
|
}
|
|
26
|
-
|
|
27
22
|
return 'unknown';
|
|
28
23
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Based on https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types
|
|
2
|
-
export const isImageMimeTypeSupportedByBrowser = mimeType => ['image/apng', 'image/bmp', 'image/gif', 'image/x-icon', 'image/jpeg', 'image/png', 'image/webp'
|
|
2
|
+
export const isImageMimeTypeSupportedByBrowser = mimeType => ['image/apng', 'image/bmp', 'image/gif', 'image/x-icon', 'image/jpeg', 'image/png', 'image/webp'
|
|
3
|
+
//'image/svg+xml', // Removed because of https://product-fabric.atlassian.net/browse/BMPT-625
|
|
3
4
|
].indexOf(mimeType.toLowerCase()) > -1;
|
|
4
5
|
export const isDocumentMimeTypeSupportedByBrowser = mimeType => mimeType.toLowerCase() === 'application/pdf';
|
|
5
6
|
export const isAudioMimeTypeSupportedByBrowser = mimeType => ['audio/aac', 'audio/flac', 'audio/mp4', 'audio/mpeg', 'audio/ogg', 'audio/x-ogg', 'audio/wav', 'audio/x-wav'].indexOf(mimeType.toLowerCase()) > -1;
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* For backward compatilbity, we assume MP4/MOV is natively supported.
|
|
8
10
|
* TODO: Improve detection of supported video formats by the browser.
|
|
@@ -12,6 +14,5 @@ export const isAudioMimeTypeSupportedByBrowser = mimeType => ['audio/aac', 'audi
|
|
|
12
14
|
* - https://product-fabric.atlassian.net/browse/EDM-634
|
|
13
15
|
* - https://product-fabric.atlassian.net/browse/EDM-426
|
|
14
16
|
*/
|
|
15
|
-
|
|
16
17
|
export const isVideoMimeTypeSupportedByBrowser = mimeType => ['video/mp4', 'video/quicktime'].indexOf(mimeType.toLowerCase()) > -1;
|
|
17
18
|
export const isMimeTypeSupportedByBrowser = mimeType => isDocumentMimeTypeSupportedByBrowser(mimeType) || isImageMimeTypeSupportedByBrowser(mimeType) || isAudioMimeTypeSupportedByBrowser(mimeType) || isVideoMimeTypeSupportedByBrowser(mimeType);
|
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
// Based on https://developer.atlassian.com/platform/media/learning/file-previews/
|
|
2
2
|
export const isImageMimeTypeSupportedByServer = mimeType => ['image/bmp', 'image/x-windows-bmp', 'application/dicom', 'image/gif', 'image/jpeg', 'image/jpg', 'image/jp_', 'application/jpg', 'application/x-jpg', 'image/png', 'application/png', 'application/x-png', 'application/vnd.adobe.photoshop', 'image/vnd.adobe.photoshop', 'image/photoshop', 'image/x-photoshop', 'image/psd', 'application/photoshop', 'application/psd', 'zz-application/zz-winassoc-psd', 'image/tiff', 'image/x-tif', 'image/x-tiff', 'application/tif', 'application/x-tif', 'application/tiff', 'application/x-tiff', 'image/svg+xml', 'image/heif', 'image/heif-sequence', 'image/heic', 'image/heic-sequence'].indexOf(mimeType.toLowerCase()) > -1;
|
|
3
|
-
export const isDocumentMimeTypeSupportedByServer = mimeType => [
|
|
4
|
-
|
|
5
|
-
'application/vnd.
|
|
6
|
-
|
|
7
|
-
'application/
|
|
8
|
-
|
|
9
|
-
'application/vnd.ms-
|
|
10
|
-
|
|
11
|
-
'application/
|
|
12
|
-
|
|
13
|
-
'
|
|
14
|
-
|
|
3
|
+
export const isDocumentMimeTypeSupportedByServer = mimeType => [
|
|
4
|
+
// Adobe PDF
|
|
5
|
+
'application/pdf', 'application/x-pdf', 'application/acrobat', 'applications/vnd.pdf', 'text/pdf', 'text/x-pdf',
|
|
6
|
+
// Adobe Illustrator
|
|
7
|
+
'application/vnd.adobe.illustrator',
|
|
8
|
+
// Microsoft Office
|
|
9
|
+
'application/vnd.ms-office',
|
|
10
|
+
// Microsoft Word
|
|
11
|
+
'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.ms-word.document.macroenabled.12', 'application/vnd.ms-word.template.macroenabled.12',
|
|
12
|
+
// Microsoft Excel
|
|
13
|
+
'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.ms-excel.sheet.macroenabled.12', 'application/vnd.ms-excel.template.macroenabled.12', 'application/vnd.ms-excel.addin.macroenabled.12', 'application/vnd.ms-excel.sheet.macroenabled', 'application/vnd.ms-excel.template.macroenabled', 'application/vnd.ms-excel.addin.macroenabled',
|
|
14
|
+
// Microsoft Powerpoint
|
|
15
|
+
'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'application/vnd.ms-powerpoint.template.macroenabled.12', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
|
|
16
|
+
// OpenOffice
|
|
17
|
+
'application/vnd.sun.xml.writer', 'application/vnd.sun.xml.writer.template',
|
|
18
|
+
// OpenDocument
|
|
19
|
+
'application/vnd.sun.xml.draw', 'application/vnd.sun.xml.draw.template', 'application/vnd.oasis.opendocument.graphics', 'application/vnd.oasis.opendocument.presentation', 'application/x-vnd.oasis.opendocument.presentation', 'application/vnd.sun.xml.calc', 'application/vnd.sun.xml.calc.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/x-vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.spreadsheet-template', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.text-template', 'application/vnd.oasis.opendocument.text-master', 'application/x-vnd.oasis.opendocument.text', 'application/x-vnd.oasis.opendocument.text-template', 'application/x-vnd.oasis.opendocument.text-master',
|
|
20
|
+
// WordPerfect
|
|
21
|
+
'application/vnd.wordperfect',
|
|
22
|
+
// Text files
|
|
23
|
+
'text/csv', 'text/x-diff', 'text/x-perl', 'text/x-python', 'text/x-ruby', 'text/rtf', 'text/richtext', 'text/plain', 'application/txt',
|
|
24
|
+
// Rich text
|
|
25
|
+
'application/rtf', 'application/x-rtf',
|
|
26
|
+
// PostScript
|
|
15
27
|
'application/postscript'].indexOf(mimeType.toLowerCase()) > -1;
|
|
16
28
|
export const isAudioMimeTypeSupportedByServer = mimeType => ['audio/aac', 'audio/x-hx-aac-adts', 'audio/vnd.dolby.dd-raw', 'audio/aiff', 'audio/x-aiff', 'audio/x-monkeys-audio', 'audio/x-ape', 'audio/basic', 'audio/flac', 'audio/mp4', 'audio/midi', 'audio/x-matroska', 'audio/x-mod', 'audio/mpeg', 'audio/ogg', 'audio/x-ogg', 'audio/x-pn-realaudio', 'audio/wav', 'audio/x-wav', 'audio/x-ms-wma'].indexOf(mimeType.toLowerCase()) > -1;
|
|
17
|
-
export const isVideoMimeTypeSupportedByServer = mimeType => ['video/3gpp', 'video/3gpp2', 'video/x-ms-asf', 'video/avi', 'video/msvideo', 'video/x-msvideo', 'video/x-dv', 'video/x-flv', 'video/m2ts', 'video/x-m4v', 'video/x-matroska', 'video/quicktime', 'video/mp4', 'video/mpeg', 'video/ogg', 'video/x-ogg', 'video/webm', 'video/x-ms-wmv'].indexOf(mimeType.toLowerCase()) > -1;
|
|
18
|
-
// Once these cloud files are processed they are receiving a more relevant mimeType
|
|
29
|
+
export const isVideoMimeTypeSupportedByServer = mimeType => ['video/3gpp', 'video/3gpp2', 'video/x-ms-asf', 'video/avi', 'video/msvideo', 'video/x-msvideo', 'video/x-dv', 'video/x-flv', 'video/m2ts', 'video/x-m4v', 'video/x-matroska', 'video/quicktime', 'video/mp4', 'video/mpeg', 'video/ogg', 'video/x-ogg', 'video/webm', 'video/x-ms-wmv'].indexOf(mimeType.toLowerCase()) > -1;
|
|
19
30
|
|
|
31
|
+
// BMPT-620: The backend momentarily returns this mimeType for cloud files imported via dt-api-mediapicker
|
|
32
|
+
// Once these cloud files are processed they are receiving a more relevant mimeType
|
|
20
33
|
export const isUnknownMimeTypeSupportedByServer = mimeType => ['binary/octet-stream'].indexOf(mimeType.toLowerCase()) > -1;
|
|
21
34
|
export const isMimeTypeSupportedByServer = mimeType => isImageMimeTypeSupportedByServer(mimeType) || isDocumentMimeTypeSupportedByServer(mimeType) || isAudioMimeTypeSupportedByServer(mimeType) || isVideoMimeTypeSupportedByServer(mimeType) || isUnknownMimeTypeSupportedByServer(mimeType);
|
|
@@ -3,7 +3,6 @@ export const pick = (obj, keys = []) => {
|
|
|
3
3
|
if (obj === undefined) {
|
|
4
4
|
return {};
|
|
5
5
|
}
|
|
6
|
-
|
|
7
6
|
return Object.fromEntries(Object.entries(obj).filter(([k]) => keys.includes(k)));
|
|
8
7
|
};
|
|
9
8
|
export const omitBy = (obj, predicate) => Object.fromEntries(Object.entries(obj).filter(([k, v]) => !predicate(v)));
|
|
@@ -17,26 +16,20 @@ export const debounce = (func, wait) => {
|
|
|
17
16
|
export const matches = srcObj => {
|
|
18
17
|
return obj => {
|
|
19
18
|
let key;
|
|
20
|
-
|
|
21
19
|
for (key in srcObj) {
|
|
22
20
|
if (obj[key] === undefined || obj[key] !== srcObj[key]) {
|
|
23
21
|
return false;
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
|
-
|
|
27
24
|
return true;
|
|
28
25
|
};
|
|
29
26
|
};
|
|
30
|
-
|
|
31
27
|
function getRandomHexValues(byte) {
|
|
32
28
|
return [...Array(byte * 2)].map(() => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
33
29
|
}
|
|
34
|
-
|
|
35
30
|
export function getRandomHex(byte) {
|
|
36
31
|
var _window;
|
|
37
|
-
|
|
38
32
|
let randomHex;
|
|
39
|
-
|
|
40
33
|
if ((_window = window) !== null && _window !== void 0 && _window.crypto) {
|
|
41
34
|
try {
|
|
42
35
|
randomHex = Array.from(window.crypto.getRandomValues(new Uint8Array(byte))).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
@@ -46,6 +39,5 @@ export function getRandomHex(byte) {
|
|
|
46
39
|
} else {
|
|
47
40
|
randomHex = getRandomHexValues(byte);
|
|
48
41
|
}
|
|
49
|
-
|
|
50
42
|
return randomHex;
|
|
51
43
|
}
|
package/dist/es2019/version.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Analytics base types
|
|
2
|
+
|
|
2
3
|
// Analytics context
|
|
3
|
-
export { withMediaAnalyticsContext } from './withMediaAnalyticsContext';
|
|
4
|
+
export { withMediaAnalyticsContext } from './withMediaAnalyticsContext';
|
|
4
5
|
|
|
6
|
+
// Analytics constants
|
|
5
7
|
export { ANALYTICS_MEDIA_CHANNEL } from './constants';
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
-
|
|
4
3
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
5
|
-
|
|
6
4
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
7
|
-
|
|
8
5
|
import React, { forwardRef, useMemo } from 'react';
|
|
9
6
|
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
10
7
|
import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context/MediaAnalyticsContext';
|
|
11
8
|
import { getMediaFeatureFlag } from '../mediaFeatureFlags';
|
|
12
|
-
|
|
13
9
|
var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlags) {
|
|
14
10
|
return keys.reduce(function (result, key) {
|
|
15
11
|
return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, key, getMediaFeatureFlag(key, featureFlags)));
|
|
16
12
|
}, {});
|
|
17
13
|
};
|
|
14
|
+
|
|
18
15
|
/**
|
|
19
16
|
* HOC for attaching MediaAnalyticsContext to a top-level React Component.
|
|
20
17
|
*
|
|
@@ -27,8 +24,6 @@ var getFilteredFeatureFlags = function getFilteredFeatureFlags(keys, featureFlag
|
|
|
27
24
|
*
|
|
28
25
|
* @see packages/analytics/analytics-next/src/hocs/withAnalyticsContext.tsx
|
|
29
26
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
27
|
export var withMediaAnalyticsContext = function withMediaAnalyticsContext(contextPublicAttributes) {
|
|
33
28
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
34
29
|
return function (WrappedComponent) {
|
|
@@ -49,7 +44,8 @@ export var withMediaAnalyticsContext = function withMediaAnalyticsContext(contex
|
|
|
49
44
|
ref: ref
|
|
50
45
|
})));
|
|
51
46
|
});
|
|
52
|
-
WithMediaAnalyticsContext.displayName = "WithMediaAnalyticsContext(".concat(
|
|
47
|
+
WithMediaAnalyticsContext.displayName = "WithMediaAnalyticsContext(".concat(
|
|
48
|
+
// @ts-ignore displayName doesn't exist on type
|
|
53
49
|
WrappedComponent.displayName || WrappedComponent.name, ")");
|
|
54
50
|
return WithMediaAnalyticsContext;
|
|
55
51
|
};
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import SectionMessage from '@atlaskit/section-message';
|
|
3
|
-
|
|
4
3
|
function AlternativePackagesMessage(_ref) {
|
|
5
4
|
var alternatePackages = _ref.alternatePackages;
|
|
6
|
-
|
|
7
5
|
if (!alternatePackages) {
|
|
8
6
|
return null;
|
|
9
7
|
}
|
|
10
|
-
|
|
11
8
|
if (alternatePackages.length === 1) {
|
|
12
9
|
return /*#__PURE__*/React.createElement("p", null, "Consider using", ' ', /*#__PURE__*/React.createElement("a", {
|
|
13
10
|
href: alternatePackages[0].link
|
|
14
11
|
}, alternatePackages[0].name), ' ', "instead.");
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
return /*#__PURE__*/React.createElement("p", null, "Consider using one of these packages instead:", /*#__PURE__*/React.createElement("ul", null, alternatePackages.map(function (p) {
|
|
18
14
|
return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("a", {
|
|
19
15
|
href: p.link
|
|
20
16
|
}, p.name));
|
|
21
17
|
})));
|
|
22
18
|
}
|
|
23
|
-
|
|
24
19
|
export function createMediaUseOnlyNotice(componentName, alternatePackages) {
|
|
25
20
|
return /*#__PURE__*/React.createElement(SectionMessage, {
|
|
26
21
|
title: "Internal Media Use Only",
|
package/dist/esm/downloadUrl.js
CHANGED
|
@@ -4,7 +4,6 @@ export var downloadUrl = function downloadUrl(url, options) {
|
|
|
4
4
|
var iframeName = 'media-download-iframe';
|
|
5
5
|
var link = document.createElement('a');
|
|
6
6
|
var iframe = document.getElementById(iframeName);
|
|
7
|
-
|
|
8
7
|
if (!iframe) {
|
|
9
8
|
iframe = document.createElement('iframe');
|
|
10
9
|
iframe.style.display = 'none';
|
|
@@ -12,13 +11,10 @@ export var downloadUrl = function downloadUrl(url, options) {
|
|
|
12
11
|
iframe.name = iframeName;
|
|
13
12
|
document.body.appendChild(iframe);
|
|
14
13
|
}
|
|
15
|
-
|
|
16
14
|
link.href = url;
|
|
17
|
-
|
|
18
15
|
if (options && options.name) {
|
|
19
16
|
link.download = options.name;
|
|
20
17
|
}
|
|
21
|
-
|
|
22
18
|
link.target = isIE11 || isSafari ? '_blank' : iframeName;
|
|
23
19
|
document.body.appendChild(link);
|
|
24
20
|
link.click();
|
package/dist/esm/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
export { downloadUrl } from './downloadUrl';
|
|
1
|
+
export { downloadUrl } from './downloadUrl';
|
|
2
|
+
// Warning! You can't add new media types!
|
|
2
3
|
// See packages/media/media-core/src/__tests__/cache-backward-compatibility.spec.ts
|
|
3
4
|
|
|
4
5
|
// Media Feature Flags
|
|
5
6
|
export { getMediaFeatureFlag, defaultMediaFeatureFlags, areEqualFeatureFlags, useMemoizeFeatureFlags, filterFeatureFlagNames, filterFeatureFlagKeysAllProducts } from './mediaFeatureFlags';
|
|
6
7
|
// Analytics context
|
|
7
|
-
export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
|
|
8
|
+
export { withMediaAnalyticsContext } from './analytics/withMediaAnalyticsContext';
|
|
8
9
|
|
|
10
|
+
// Analytics constants
|
|
9
11
|
export { ANALYTICS_MEDIA_CHANNEL } from './analytics/constants';
|
|
10
12
|
export { getMediaTypeFromMimeType, isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './mediaTypeUtils';
|
|
11
13
|
export { isUndefined, pick, omitBy, debounce, matches, getRandomHex } from './utils/helpers';
|