@atlaskit/media-card 73.4.2 → 73.5.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/classnames/package.json +7 -0
  3. package/dist/cjs/classnames.js +19 -0
  4. package/dist/cjs/files/cardImageView/classnames.js +10 -0
  5. package/dist/cjs/files/cardImageView/index.js +4 -7
  6. package/dist/cjs/index.js +3 -3
  7. package/dist/cjs/root/card/cardAnalytics.js +15 -3
  8. package/dist/cjs/root/card/index.js +12 -3
  9. package/dist/cjs/utils/generateUniqueId.js +12 -0
  10. package/dist/cjs/utils/ufoExperiences.js +91 -0
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/classnames.js +1 -0
  13. package/dist/es2019/files/cardImageView/classnames.js +2 -0
  14. package/dist/es2019/files/cardImageView/index.js +1 -2
  15. package/dist/es2019/index.js +1 -1
  16. package/dist/es2019/root/card/cardAnalytics.js +9 -1
  17. package/dist/es2019/root/card/index.js +12 -4
  18. package/dist/es2019/utils/generateUniqueId.js +3 -0
  19. package/dist/es2019/utils/ufoExperiences.js +68 -0
  20. package/dist/es2019/version.json +1 -1
  21. package/dist/esm/classnames.js +1 -0
  22. package/dist/esm/files/cardImageView/classnames.js +2 -0
  23. package/dist/esm/files/cardImageView/index.js +1 -2
  24. package/dist/esm/index.js +1 -1
  25. package/dist/esm/root/card/cardAnalytics.js +11 -1
  26. package/dist/esm/root/card/index.js +12 -4
  27. package/dist/esm/utils/generateUniqueId.js +3 -0
  28. package/dist/esm/utils/ufoExperiences.js +74 -0
  29. package/dist/esm/version.json +1 -1
  30. package/dist/types/classnames.d.ts +1 -0
  31. package/dist/types/files/cardImageView/classnames.d.ts +2 -0
  32. package/dist/types/files/cardImageView/index.d.ts +0 -2
  33. package/dist/types/index.d.ts +1 -1
  34. package/dist/types/root/card/cardAnalytics.d.ts +2 -2
  35. package/dist/types/root/card/index.d.ts +1 -0
  36. package/dist/types/utils/generateUniqueId.d.ts +1 -0
  37. package/dist/types/utils/ufoExperiences.d.ts +6 -0
  38. package/example-helpers/index.tsx +2 -2
  39. package/package.json +8 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/media-card
2
2
 
3
+ ## 73.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`02fb8e78fb9`](https://bitbucket.org/atlassian/atlassian-frontend/commits/02fb8e78fb9) - Implement media card render UFO experience
8
+
9
+ ### Patch Changes
10
+
11
+ - [`3ef794dc11f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/3ef794dc11f) - Removed emoji and media packages dependencies from renderer initial load.
12
+ - [`7948702bf56`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7948702bf56) - Fixing a bug where sometimes the media card pre-load indicator is given 100% height and renders over other components. It now has a max height of 0 and is not a click target
13
+ - [`065ae19cb44`](https://bitbucket.org/atlassian/atlassian-frontend/commits/065ae19cb44) - Enforced "up to date" logged feature flags via type checks
14
+ - Updated dependencies
15
+
3
16
  ## 73.4.2
4
17
 
5
18
  ### Patch Changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@atlaskit/media-card/classnames",
3
+ "main": "../dist/cjs/classnames.js",
4
+ "module": "../dist/esm/classnames.js",
5
+ "module:es2019": "../dist/es2019/classnames.js",
6
+ "types": "../dist/types/classnames.d.ts"
7
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "fileCardImageViewSelectedSelector", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _classnames.fileCardImageViewSelectedSelector;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "fileCardImageViewSelector", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _classnames.fileCardImageViewSelector;
16
+ }
17
+ });
18
+
19
+ var _classnames = require("./files/cardImageView/classnames");
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fileCardImageViewSelector = exports.fileCardImageViewSelectedSelector = void 0;
7
+ var fileCardImageViewSelector = 'media-file-card-view';
8
+ exports.fileCardImageViewSelector = fileCardImageViewSelector;
9
+ var fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
10
+ exports.fileCardImageViewSelectedSelector = fileCardImageViewSelectedSelector;
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.fileCardImageViewSelector = exports.fileCardImageViewSelectedSelector = exports.FileCardImageView = void 0;
10
+ exports.FileCardImageView = void 0;
11
11
 
12
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
13
 
@@ -41,6 +41,8 @@ var _progressBar = require("../../utils/progressBar");
41
41
 
42
42
  var _cardActions = _interopRequireDefault(require("../../utils/cardActions"));
43
43
 
44
+ var _classnames = require("./classnames");
45
+
44
46
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
47
 
46
48
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -49,11 +51,6 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
49
51
 
50
52
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
51
53
 
52
- var fileCardImageViewSelector = 'media-file-card-view';
53
- exports.fileCardImageViewSelector = fileCardImageViewSelector;
54
- var fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
55
- exports.fileCardImageViewSelectedSelector = fileCardImageViewSelectedSelector;
56
-
57
54
  var FileCardImageView = /*#__PURE__*/function (_Component) {
58
55
  (0, _inherits2.default)(FileCardImageView, _Component);
59
56
 
@@ -313,7 +310,7 @@ var FileCardImageView = /*#__PURE__*/function (_Component) {
313
310
  selectable: selectable,
314
311
  selected: selected,
315
312
  mediaType: mediaType,
316
- className: "".concat(fileCardImageViewSelector, " ").concat(selected ? fileCardImageViewSelectedSelector : '')
313
+ className: "".concat(_classnames.fileCardImageViewSelector, " ").concat(selected ? _classnames.fileCardImageViewSelectedSelector : '')
317
314
  }, this.renderCardContents());
318
315
  }
319
316
  }, {
package/dist/cjs/index.js CHANGED
@@ -36,13 +36,13 @@ Object.defineProperty(exports, "defaultImageCardDimensions", {
36
36
  Object.defineProperty(exports, "fileCardImageViewSelectedSelector", {
37
37
  enumerable: true,
38
38
  get: function get() {
39
- return _cardImageView.fileCardImageViewSelectedSelector;
39
+ return _classnames.fileCardImageViewSelectedSelector;
40
40
  }
41
41
  });
42
42
  Object.defineProperty(exports, "fileCardImageViewSelector", {
43
43
  enumerable: true,
44
44
  get: function get() {
45
- return _cardImageView.fileCardImageViewSelector;
45
+ return _classnames.fileCardImageViewSelector;
46
46
  }
47
47
  });
48
48
  Object.defineProperty(exports, "inlinePlayerClassName", {
@@ -66,7 +66,7 @@ var _cardError = require("./utils/lightCards/cardError");
66
66
 
67
67
  var _cardDimensions = require("./utils/cardDimensions");
68
68
 
69
- var _cardImageView = require("./files/cardImageView");
69
+ var _classnames = require("./files/cardImageView/classnames");
70
70
 
71
71
  var _inlinePlayer = require("./root/inlinePlayer");
72
72
 
@@ -3,12 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.relevantFeatureFlagNames = exports.fireScreenEvent = exports.fireOperationalEvent = exports.fireCopiedEvent = exports.fireCommencedEvent = void 0;
6
+ exports.getRelevantFeatureFlagNames = exports.fireScreenEvent = exports.fireOperationalEvent = exports.fireCopiedEvent = exports.fireCommencedEvent = void 0;
7
+
8
+ var _mediaCommon = require("@atlaskit/media-common");
7
9
 
8
10
  var _analytics = require("../../utils/analytics");
9
11
 
10
- var relevantFeatureFlagNames = ['newCardExperience', 'captions', 'timestampOnVideo'];
11
- exports.relevantFeatureFlagNames = relevantFeatureFlagNames;
12
+ var getRelevantFeatureFlagNames = function getRelevantFeatureFlagNames() {
13
+ return (0, _mediaCommon.filterFeatureFlagNames)({
14
+ newCardExperience: true,
15
+ captions: true,
16
+ timestampOnVideo: true,
17
+ observedWidth: true,
18
+ mediaInline: false,
19
+ folderUploads: false
20
+ });
21
+ };
22
+
23
+ exports.getRelevantFeatureFlagNames = getRelevantFeatureFlagNames;
12
24
 
13
25
  var fireOperationalEvent = function fireOperationalEvent(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error) {
14
26
  var fireEvent = function fireEvent(payload) {
@@ -75,6 +75,10 @@ var _dimensionComparer = require("../../utils/dimensionComparer");
75
75
 
76
76
  var _getMediaCardCursor = require("../../utils/getMediaCardCursor");
77
77
 
78
+ var _ufoExperiences = require("../../utils/ufoExperiences");
79
+
80
+ var _generateUniqueId = require("../../utils/generateUniqueId");
81
+
78
82
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
79
83
 
80
84
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -92,6 +96,8 @@ var CardBase = /*#__PURE__*/function (_Component) {
92
96
 
93
97
  var _super = _createSuper(CardBase);
94
98
 
99
+ // An internalOccurrenceKey is a randomly generated value to differentiate various instances
100
+ // of Cards regardless of whether it shares the same file (either internal or external)
95
101
  // We initialise timeElapsedTillCommenced
96
102
  // to avoid extra branching on a possibly undefined value.
97
103
  function CardBase(props) {
@@ -99,6 +105,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
99
105
 
100
106
  (0, _classCallCheck2.default)(this, CardBase);
101
107
  _this = _super.call(this, props);
108
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "internalOccurrenceKey", (0, _generateUniqueId.generateUniqueId)());
102
109
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasBeenMounted", false);
103
110
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "viewportPreAnchorRef", /*#__PURE__*/(0, _react.createRef)());
104
111
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "viewportPostAnchorRef", /*#__PURE__*/(0, _react.createRef)());
@@ -287,7 +294,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
287
294
  if ((0, _getCardPreview.isSSRClientPreview)(cardPreview)) {
288
295
  _this.ssrReliability.client = failedSSRObject;
289
296
  }
290
- /*
297
+ /*
291
298
  If the cardPreview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
292
299
  */
293
300
 
@@ -343,7 +350,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
343
350
  status: 'success'
344
351
  };
345
352
  }
346
- /*
353
+ /*
347
354
  If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
348
355
  */
349
356
 
@@ -950,6 +957,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
950
957
  error = _this$state7.error;
951
958
  var createAnalyticsEvent = this.props.createAnalyticsEvent;
952
959
  createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, this.fileAttributes, this.getPerformanceAttributes(), this.ssrReliability, error);
960
+ (0, _ufoExperiences.completeUfoExperience)(this.internalOccurrenceKey, status, this.fileAttributes, this.ssrReliability, error);
953
961
  }
954
962
  }, {
955
963
  key: "fireCommencedEvent",
@@ -961,6 +969,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
961
969
  durationSincePageStart: this.timeElapsedTillCommenced
962
970
  }
963
971
  });
972
+ (0, _ufoExperiences.startUfoExperience)(this.internalOccurrenceKey);
964
973
  }
965
974
  }, {
966
975
  key: "actions",
@@ -1022,7 +1031,7 @@ var Card = (0, _mediaCommon.withMediaAnalyticsContext)({
1022
1031
  componentName: 'mediaCard',
1023
1032
  component: 'mediaCard'
1024
1033
  }, {
1025
- filterFeatureFlags: _cardAnalytics.relevantFeatureFlagNames
1034
+ filterFeatureFlags: (0, _cardAnalytics.getRelevantFeatureFlagNames)()
1026
1035
  })((0, _analyticsNext.withAnalyticsEvents)()((0, _reactIntlNext.injectIntl)(CardBase, {
1027
1036
  enforceContext: false
1028
1037
  })));
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateUniqueId = void 0;
7
+
8
+ var generateUniqueId = function generateUniqueId() {
9
+ return (performance.now().toString(36) + Math.random().toString(36)).replace(/\./g, '');
10
+ };
11
+
12
+ exports.generateUniqueId = generateUniqueId;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.startUfoExperience = exports.completeUfoExperience = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _ufo = require("@atlaskit/ufo");
13
+
14
+ var _version = require("../version.json");
15
+
16
+ var _analytics = require("./analytics");
17
+
18
+ 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; }
19
+
20
+ 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) { (0, _defineProperty2.default)(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; }
21
+
22
+ var concurrentExperience;
23
+
24
+ var getExperience = function getExperience(id) {
25
+ if (!concurrentExperience) {
26
+ var inlineExperience = {
27
+ platform: {
28
+ component: 'media-card'
29
+ },
30
+ type: _ufo.ExperienceTypes.Experience,
31
+ performanceType: _ufo.ExperiencePerformanceTypes.InlineResult
32
+ };
33
+ concurrentExperience = new _ufo.ConcurrentExperience('media-card-render', inlineExperience);
34
+ }
35
+
36
+ return concurrentExperience.getInstance(id);
37
+ };
38
+
39
+ var startUfoExperience = function startUfoExperience(id) {
40
+ getExperience(id).start();
41
+ };
42
+
43
+ exports.startUfoExperience = startUfoExperience;
44
+
45
+ var completeUfoExperience = function completeUfoExperience(id, status, fileAttributes, ssrReliability, error) {
46
+ switch (status) {
47
+ case 'complete':
48
+ succeedUfoExperience(id, {
49
+ fileAttributes: fileAttributes,
50
+ ssrReliability: ssrReliability
51
+ });
52
+ break;
53
+
54
+ case 'failed-processing':
55
+ failUfoExperience(id, {
56
+ fileAttributes: fileAttributes,
57
+ failReason: 'failed-processing',
58
+ ssrReliability: ssrReliability
59
+ });
60
+ break;
61
+
62
+ case 'error':
63
+ error && failUfoExperience(id, _objectSpread(_objectSpread({
64
+ fileAttributes: fileAttributes
65
+ }, (0, _analytics.extractErrorInfo)(error)), {}, {
66
+ request: (0, _analytics.getRenderErrorRequestMetadata)(error),
67
+ ssrReliability: ssrReliability
68
+ }));
69
+ break;
70
+ }
71
+ };
72
+
73
+ exports.completeUfoExperience = completeUfoExperience;
74
+
75
+ var succeedUfoExperience = function succeedUfoExperience(id, properties) {
76
+ getExperience(id).success({
77
+ metadata: _objectSpread(_objectSpread({}, properties), {}, {
78
+ packageName: _version.name,
79
+ packageVersion: _version.version
80
+ })
81
+ });
82
+ };
83
+
84
+ var failUfoExperience = function failUfoExperience(id, properties) {
85
+ getExperience(id).failure({
86
+ metadata: _objectSpread(_objectSpread({}, properties), {}, {
87
+ packageName: _version.name,
88
+ packageVersion: _version.version
89
+ })
90
+ });
91
+ };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "73.4.2",
3
+ "version": "73.5.0",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1 @@
1
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView/classnames';
@@ -0,0 +1,2 @@
1
+ export const fileCardImageViewSelector = 'media-file-card-view';
2
+ export const fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
@@ -9,8 +9,7 @@ import { CardLoading } from '../../utils/lightCards/cardLoading';
9
9
  import { shouldDisplayImageThumbnail } from '../../utils/shouldDisplayImageThumbnail';
10
10
  import { ProgressBar } from '../../utils/progressBar';
11
11
  import CardActions from '../../utils/cardActions';
12
- export const fileCardImageViewSelector = 'media-file-card-view';
13
- export const fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
12
+ import { fileCardImageViewSelectedSelector, fileCardImageViewSelector } from './classnames';
14
13
  export class FileCardImageView extends Component {
15
14
  constructor(...args) {
16
15
  super(...args);
@@ -2,6 +2,6 @@ export { Card, MediaInlineCard } from './root';
2
2
  export { CardLoading } from './utils/lightCards/cardLoading';
3
3
  export { CardError } from './utils/lightCards/cardError';
4
4
  export { defaultImageCardDimensions } from './utils/cardDimensions';
5
- export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView';
5
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView/classnames';
6
6
  export { inlinePlayerClassName } from './root/inlinePlayer';
7
7
  export { newFileExperienceClassName } from './root/card/cardConstants';
@@ -1,5 +1,13 @@
1
+ import { filterFeatureFlagNames } from '@atlaskit/media-common';
1
2
  import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload, getCopiedFilePayload, getRenderCommencedEventPayload, getRenderPreviewableCardPayload } from '../../utils/analytics';
2
- export const relevantFeatureFlagNames = ['newCardExperience', 'captions', 'timestampOnVideo'];
3
+ export const getRelevantFeatureFlagNames = () => filterFeatureFlagNames({
4
+ newCardExperience: true,
5
+ captions: true,
6
+ timestampOnVideo: true,
7
+ observedWidth: true,
8
+ mediaInline: false,
9
+ folderUploads: false
10
+ });
3
11
  export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error) => {
4
12
  const fireEvent = payload => fireMediaCardEvent(payload, createAnalyticsEvent);
5
13
 
@@ -16,19 +16,25 @@ import { getFileDetails } from '../../utils/metadata';
16
16
  import { InlinePlayer } from '../inlinePlayer';
17
17
  import { getFileAttributes, extractErrorInfo } from '../../utils/analytics';
18
18
  import { isLocalPreviewError, MediaCardError, ensureMediaCardError, ImageLoadError } from '../../errors';
19
- import { fireOperationalEvent, fireCommencedEvent, relevantFeatureFlagNames, fireCopiedEvent, fireScreenEvent } from './cardAnalytics';
19
+ import { fireOperationalEvent, fireCommencedEvent, getRelevantFeatureFlagNames, fireCopiedEvent, fireScreenEvent } from './cardAnalytics';
20
20
  import getDocument from '../../utils/document';
21
21
  import { StoreSSRDataScript, getSSRData } from '../../utils/globalScope';
22
22
  import { getCardStateFromFileState, createStateUpdater } from './cardState';
23
23
  import { getMediaFeatureFlag } from '@atlaskit/media-common';
24
24
  import { isBigger } from '../../utils/dimensionComparer';
25
25
  import { getMediaCardCursor } from '../../utils/getMediaCardCursor';
26
+ import { completeUfoExperience, startUfoExperience } from '../../utils/ufoExperiences';
27
+ import { generateUniqueId } from '../../utils/generateUniqueId';
26
28
  export class CardBase extends Component {
29
+ // An internalOccurrenceKey is a randomly generated value to differentiate various instances
30
+ // of Cards regardless of whether it shares the same file (either internal or external)
27
31
  // We initialise timeElapsedTillCommenced
28
32
  // to avoid extra branching on a possibly undefined value.
29
33
  constructor(props) {
30
34
  super(props);
31
35
 
36
+ _defineProperty(this, "internalOccurrenceKey", generateUniqueId());
37
+
32
38
  _defineProperty(this, "hasBeenMounted", false);
33
39
 
34
40
  _defineProperty(this, "viewportPreAnchorRef", /*#__PURE__*/createRef());
@@ -183,7 +189,7 @@ export class CardBase extends Component {
183
189
  if (isSSRClientPreview(cardPreview)) {
184
190
  this.ssrReliability.client = failedSSRObject;
185
191
  }
186
- /*
192
+ /*
187
193
  If the cardPreview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
188
194
  */
189
195
 
@@ -240,7 +246,7 @@ export class CardBase extends Component {
240
246
  status: 'success'
241
247
  };
242
248
  }
243
- /*
249
+ /*
244
250
  If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
245
251
  */
246
252
 
@@ -902,6 +908,7 @@ export class CardBase extends Component {
902
908
  createAnalyticsEvent
903
909
  } = this.props;
904
910
  createAnalyticsEvent && fireOperationalEvent(createAnalyticsEvent, status, this.fileAttributes, this.getPerformanceAttributes(), this.ssrReliability, error);
911
+ completeUfoExperience(this.internalOccurrenceKey, status, this.fileAttributes, this.ssrReliability, error);
905
912
  }
906
913
 
907
914
  fireCommencedEvent() {
@@ -914,6 +921,7 @@ export class CardBase extends Component {
914
921
  durationSincePageStart: this.timeElapsedTillCommenced
915
922
  }
916
923
  });
924
+ startUfoExperience(this.internalOccurrenceKey);
917
925
  }
918
926
 
919
927
  get actions() {
@@ -971,7 +979,7 @@ export const Card = withMediaAnalyticsContext({
971
979
  componentName: 'mediaCard',
972
980
  component: 'mediaCard'
973
981
  }, {
974
- filterFeatureFlags: relevantFeatureFlagNames
982
+ filterFeatureFlags: getRelevantFeatureFlagNames()
975
983
  })(withAnalyticsEvents()(injectIntl(CardBase, {
976
984
  enforceContext: false
977
985
  })));
@@ -0,0 +1,3 @@
1
+ export const generateUniqueId = () => {
2
+ return (performance.now().toString(36) + Math.random().toString(36)).replace(/\./g, '');
3
+ };
@@ -0,0 +1,68 @@
1
+ import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
+ import { name as packageName, version as packageVersion } from '../version.json';
3
+ import { extractErrorInfo, getRenderErrorRequestMetadata } from './analytics';
4
+ let concurrentExperience;
5
+
6
+ const getExperience = id => {
7
+ if (!concurrentExperience) {
8
+ const inlineExperience = {
9
+ platform: {
10
+ component: 'media-card'
11
+ },
12
+ type: ExperienceTypes.Experience,
13
+ performanceType: ExperiencePerformanceTypes.InlineResult
14
+ };
15
+ concurrentExperience = new ConcurrentExperience('media-card-render', inlineExperience);
16
+ }
17
+
18
+ return concurrentExperience.getInstance(id);
19
+ };
20
+
21
+ export const startUfoExperience = id => {
22
+ getExperience(id).start();
23
+ };
24
+ export const completeUfoExperience = (id, status, fileAttributes, ssrReliability, error) => {
25
+ switch (status) {
26
+ case 'complete':
27
+ succeedUfoExperience(id, {
28
+ fileAttributes,
29
+ ssrReliability
30
+ });
31
+ break;
32
+
33
+ case 'failed-processing':
34
+ failUfoExperience(id, {
35
+ fileAttributes,
36
+ failReason: 'failed-processing',
37
+ ssrReliability
38
+ });
39
+ break;
40
+
41
+ case 'error':
42
+ error && failUfoExperience(id, {
43
+ fileAttributes,
44
+ ...extractErrorInfo(error),
45
+ request: getRenderErrorRequestMetadata(error),
46
+ ssrReliability
47
+ });
48
+ break;
49
+ }
50
+ };
51
+
52
+ const succeedUfoExperience = (id, properties) => {
53
+ getExperience(id).success({
54
+ metadata: { ...properties,
55
+ packageName,
56
+ packageVersion
57
+ }
58
+ });
59
+ };
60
+
61
+ const failUfoExperience = (id, properties) => {
62
+ getExperience(id).failure({
63
+ metadata: { ...properties,
64
+ packageName,
65
+ packageVersion
66
+ }
67
+ });
68
+ };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "73.4.2",
3
+ "version": "73.5.0",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1 @@
1
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView/classnames';
@@ -0,0 +1,2 @@
1
+ export var fileCardImageViewSelector = 'media-file-card-view';
2
+ export var fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
@@ -20,8 +20,7 @@ import { CardLoading } from '../../utils/lightCards/cardLoading';
20
20
  import { shouldDisplayImageThumbnail } from '../../utils/shouldDisplayImageThumbnail';
21
21
  import { ProgressBar } from '../../utils/progressBar';
22
22
  import CardActions from '../../utils/cardActions';
23
- export var fileCardImageViewSelector = 'media-file-card-view';
24
- export var fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
23
+ import { fileCardImageViewSelectedSelector, fileCardImageViewSelector } from './classnames';
25
24
  export var FileCardImageView = /*#__PURE__*/function (_Component) {
26
25
  _inherits(FileCardImageView, _Component);
27
26
 
package/dist/esm/index.js CHANGED
@@ -2,6 +2,6 @@ export { Card, MediaInlineCard } from './root';
2
2
  export { CardLoading } from './utils/lightCards/cardLoading';
3
3
  export { CardError } from './utils/lightCards/cardError';
4
4
  export { defaultImageCardDimensions } from './utils/cardDimensions';
5
- export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView';
5
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView/classnames';
6
6
  export { inlinePlayerClassName } from './root/inlinePlayer';
7
7
  export { newFileExperienceClassName } from './root/card/cardConstants';
@@ -1,5 +1,15 @@
1
+ import { filterFeatureFlagNames } from '@atlaskit/media-common';
1
2
  import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload, getCopiedFilePayload, getRenderCommencedEventPayload, getRenderPreviewableCardPayload } from '../../utils/analytics';
2
- export var relevantFeatureFlagNames = ['newCardExperience', 'captions', 'timestampOnVideo'];
3
+ export var getRelevantFeatureFlagNames = function getRelevantFeatureFlagNames() {
4
+ return filterFeatureFlagNames({
5
+ newCardExperience: true,
6
+ captions: true,
7
+ timestampOnVideo: true,
8
+ observedWidth: true,
9
+ mediaInline: false,
10
+ folderUploads: false
11
+ });
12
+ };
3
13
  export var fireOperationalEvent = function fireOperationalEvent(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error) {
4
14
  var fireEvent = function fireEvent(payload) {
5
15
  return fireMediaCardEvent(payload, createAnalyticsEvent);
@@ -34,18 +34,22 @@ import { getFileDetails } from '../../utils/metadata';
34
34
  import { InlinePlayer } from '../inlinePlayer';
35
35
  import { getFileAttributes, extractErrorInfo } from '../../utils/analytics';
36
36
  import { isLocalPreviewError, MediaCardError, ensureMediaCardError, ImageLoadError } from '../../errors';
37
- import { fireOperationalEvent as _fireOperationalEvent, fireCommencedEvent as _fireCommencedEvent, relevantFeatureFlagNames, fireCopiedEvent, fireScreenEvent } from './cardAnalytics';
37
+ import { fireOperationalEvent as _fireOperationalEvent, fireCommencedEvent as _fireCommencedEvent, getRelevantFeatureFlagNames, fireCopiedEvent, fireScreenEvent } from './cardAnalytics';
38
38
  import getDocument from '../../utils/document';
39
39
  import { StoreSSRDataScript, getSSRData } from '../../utils/globalScope';
40
40
  import { getCardStateFromFileState, createStateUpdater } from './cardState';
41
41
  import { getMediaFeatureFlag } from '@atlaskit/media-common';
42
42
  import { isBigger } from '../../utils/dimensionComparer';
43
43
  import { getMediaCardCursor } from '../../utils/getMediaCardCursor';
44
+ import { completeUfoExperience, startUfoExperience } from '../../utils/ufoExperiences';
45
+ import { generateUniqueId } from '../../utils/generateUniqueId';
44
46
  export var CardBase = /*#__PURE__*/function (_Component) {
45
47
  _inherits(CardBase, _Component);
46
48
 
47
49
  var _super = _createSuper(CardBase);
48
50
 
51
+ // An internalOccurrenceKey is a randomly generated value to differentiate various instances
52
+ // of Cards regardless of whether it shares the same file (either internal or external)
49
53
  // We initialise timeElapsedTillCommenced
50
54
  // to avoid extra branching on a possibly undefined value.
51
55
  function CardBase(props) {
@@ -55,6 +59,8 @@ export var CardBase = /*#__PURE__*/function (_Component) {
55
59
 
56
60
  _this = _super.call(this, props);
57
61
 
62
+ _defineProperty(_assertThisInitialized(_this), "internalOccurrenceKey", generateUniqueId());
63
+
58
64
  _defineProperty(_assertThisInitialized(_this), "hasBeenMounted", false);
59
65
 
60
66
  _defineProperty(_assertThisInitialized(_this), "viewportPreAnchorRef", /*#__PURE__*/createRef());
@@ -255,7 +261,7 @@ export var CardBase = /*#__PURE__*/function (_Component) {
255
261
  if (isSSRClientPreview(cardPreview)) {
256
262
  _this.ssrReliability.client = failedSSRObject;
257
263
  }
258
- /*
264
+ /*
259
265
  If the cardPreview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
260
266
  */
261
267
 
@@ -313,7 +319,7 @@ export var CardBase = /*#__PURE__*/function (_Component) {
313
319
  status: 'success'
314
320
  };
315
321
  }
316
- /*
322
+ /*
317
323
  If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
318
324
  */
319
325
 
@@ -936,6 +942,7 @@ export var CardBase = /*#__PURE__*/function (_Component) {
936
942
  error = _this$state7.error;
937
943
  var createAnalyticsEvent = this.props.createAnalyticsEvent;
938
944
  createAnalyticsEvent && _fireOperationalEvent(createAnalyticsEvent, status, this.fileAttributes, this.getPerformanceAttributes(), this.ssrReliability, error);
945
+ completeUfoExperience(this.internalOccurrenceKey, status, this.fileAttributes, this.ssrReliability, error);
939
946
  }
940
947
  }, {
941
948
  key: "fireCommencedEvent",
@@ -947,6 +954,7 @@ export var CardBase = /*#__PURE__*/function (_Component) {
947
954
  durationSincePageStart: this.timeElapsedTillCommenced
948
955
  }
949
956
  });
957
+ startUfoExperience(this.internalOccurrenceKey);
950
958
  }
951
959
  }, {
952
960
  key: "actions",
@@ -1007,7 +1015,7 @@ export var Card = withMediaAnalyticsContext({
1007
1015
  componentName: 'mediaCard',
1008
1016
  component: 'mediaCard'
1009
1017
  }, {
1010
- filterFeatureFlags: relevantFeatureFlagNames
1018
+ filterFeatureFlags: getRelevantFeatureFlagNames()
1011
1019
  })(withAnalyticsEvents()(injectIntl(CardBase, {
1012
1020
  enforceContext: false
1013
1021
  })));
@@ -0,0 +1,3 @@
1
+ export var generateUniqueId = function generateUniqueId() {
2
+ return (performance.now().toString(36) + Math.random().toString(36)).replace(/\./g, '');
3
+ };
@@ -0,0 +1,74 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+
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; }
4
+
5
+ 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; }
6
+
7
+ import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
8
+ import { name as packageName, version as packageVersion } from '../version.json';
9
+ import { extractErrorInfo, getRenderErrorRequestMetadata } from './analytics';
10
+ var concurrentExperience;
11
+
12
+ var getExperience = function getExperience(id) {
13
+ if (!concurrentExperience) {
14
+ var inlineExperience = {
15
+ platform: {
16
+ component: 'media-card'
17
+ },
18
+ type: ExperienceTypes.Experience,
19
+ performanceType: ExperiencePerformanceTypes.InlineResult
20
+ };
21
+ concurrentExperience = new ConcurrentExperience('media-card-render', inlineExperience);
22
+ }
23
+
24
+ return concurrentExperience.getInstance(id);
25
+ };
26
+
27
+ export var startUfoExperience = function startUfoExperience(id) {
28
+ getExperience(id).start();
29
+ };
30
+ export var completeUfoExperience = function completeUfoExperience(id, status, fileAttributes, ssrReliability, error) {
31
+ switch (status) {
32
+ case 'complete':
33
+ succeedUfoExperience(id, {
34
+ fileAttributes: fileAttributes,
35
+ ssrReliability: ssrReliability
36
+ });
37
+ break;
38
+
39
+ case 'failed-processing':
40
+ failUfoExperience(id, {
41
+ fileAttributes: fileAttributes,
42
+ failReason: 'failed-processing',
43
+ ssrReliability: ssrReliability
44
+ });
45
+ break;
46
+
47
+ case 'error':
48
+ error && failUfoExperience(id, _objectSpread(_objectSpread({
49
+ fileAttributes: fileAttributes
50
+ }, extractErrorInfo(error)), {}, {
51
+ request: getRenderErrorRequestMetadata(error),
52
+ ssrReliability: ssrReliability
53
+ }));
54
+ break;
55
+ }
56
+ };
57
+
58
+ var succeedUfoExperience = function succeedUfoExperience(id, properties) {
59
+ getExperience(id).success({
60
+ metadata: _objectSpread(_objectSpread({}, properties), {}, {
61
+ packageName: packageName,
62
+ packageVersion: packageVersion
63
+ })
64
+ });
65
+ };
66
+
67
+ var failUfoExperience = function failUfoExperience(id, properties) {
68
+ getExperience(id).failure({
69
+ metadata: _objectSpread(_objectSpread({}, properties), {}, {
70
+ packageName: packageName,
71
+ packageVersion: packageVersion
72
+ })
73
+ });
74
+ };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "73.4.2",
3
+ "version": "73.5.0",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1 @@
1
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector, } from './files/cardImageView/classnames';
@@ -0,0 +1,2 @@
1
+ export declare const fileCardImageViewSelector = "media-file-card-view";
2
+ export declare const fileCardImageViewSelectedSelector = "media-file-card-view-selected";
@@ -26,8 +26,6 @@ export interface FileCardImageViewProps {
26
26
  readonly onImageLoad?: (cardPreview: CardPreview) => void;
27
27
  readonly cardPreview: CardPreview;
28
28
  }
29
- export declare const fileCardImageViewSelector = "media-file-card-view";
30
- export declare const fileCardImageViewSelectedSelector = "media-file-card-view-selected";
31
29
  export declare class FileCardImageView extends Component<FileCardImageViewProps> {
32
30
  private wasThumbnailDisplayed;
33
31
  static defaultProps: Partial<FileCardImageViewProps>;
@@ -67,6 +67,6 @@ export interface CardState {
67
67
  export { CardLoading } from './utils/lightCards/cardLoading';
68
68
  export { CardError } from './utils/lightCards/cardError';
69
69
  export { defaultImageCardDimensions } from './utils/cardDimensions';
70
- export { fileCardImageViewSelector, fileCardImageViewSelectedSelector, } from './files/cardImageView';
70
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector, } from './files/cardImageView/classnames';
71
71
  export { inlinePlayerClassName } from './root/inlinePlayer';
72
72
  export { newFileExperienceClassName } from './root/card/cardConstants';
@@ -1,9 +1,9 @@
1
- import { FileAttributes, MediaFeatureFlags, PerformanceAttributes } from '@atlaskit/media-common';
1
+ import { FileAttributes, PerformanceAttributes } from '@atlaskit/media-common';
2
2
  import { CreateUIAnalyticsEvent } from '@atlaskit/analytics-next';
3
3
  import { SSRStatus } from '../../utils/analytics';
4
4
  import { CardStatus } from '../..';
5
5
  import { MediaCardError } from './../../errors';
6
- export declare const relevantFeatureFlagNames: Array<keyof MediaFeatureFlags>;
6
+ export declare const getRelevantFeatureFlagNames: () => ("newCardExperience" | "captions" | "mediaInline" | "folderUploads" | "timestampOnVideo" | "observedWidth")[];
7
7
  export declare const fireOperationalEvent: (createAnalyticsEvent: CreateUIAnalyticsEvent, status: CardStatus, fileAttributes: FileAttributes, performanceAttributes: PerformanceAttributes, ssrReliability: SSRStatus, error?: MediaCardError | undefined) => void;
8
8
  export declare const fireCommencedEvent: (createAnalyticsEvent: CreateUIAnalyticsEvent, fileAttributes: FileAttributes, performanceAttributes: PerformanceAttributes) => void;
9
9
  export declare const fireCopiedEvent: (createAnalyticsEvent: CreateUIAnalyticsEvent, fileId: string, cardRef: HTMLDivElement) => void;
@@ -5,6 +5,7 @@ import { WrappedComponentProps } from 'react-intl-next';
5
5
  import { CardAction, CardProps, CardState } from '../..';
6
6
  export declare type CardBaseProps = CardProps & WithAnalyticsEventsProps & Partial<WrappedComponentProps>;
7
7
  export declare class CardBase extends Component<CardBaseProps, CardState> {
8
+ private internalOccurrenceKey;
8
9
  private hasBeenMounted;
9
10
  private viewportPreAnchorRef;
10
11
  private viewportPostAnchorRef;
@@ -0,0 +1 @@
1
+ export declare const generateUniqueId: () => string;
@@ -0,0 +1,6 @@
1
+ import { CardStatus } from '../../src';
2
+ import { FileAttributes } from '@atlaskit/media-common';
3
+ import { SSRStatus } from './analytics';
4
+ import { MediaCardError } from '../errors';
5
+ export declare const startUfoExperience: (id: string) => void;
6
+ export declare const completeUfoExperience: (id: string, status: CardStatus, fileAttributes: FileAttributes, ssrReliability: SSRStatus, error?: MediaCardError | undefined) => void;
@@ -16,7 +16,7 @@ import FabricAnalyticsListeners, {
16
16
  import AnnotateIcon from '@atlaskit/icon/glyph/media-services/annotate';
17
17
  import { SelectableCard } from './selectableCard';
18
18
  import { Card, CardAppearance, CardEvent, CardAction } from '../src';
19
- import { relevantFeatureFlagNames } from '../src/root/card/cardAnalytics';
19
+ import { getRelevantFeatureFlagNames } from '../src/root/card/cardAnalytics';
20
20
  import { MediaCardError } from '../src/errors';
21
21
  import DevelopmentUseMessage from './developmentUseMessage';
22
22
 
@@ -134,7 +134,7 @@ export const MainWrapper: React.FC<MainWrapperProps> = ({
134
134
  }) => (
135
135
  <>
136
136
  {developmentOnly && <DevelopmentUseMessage />}
137
- <FeatureFlagsWrapper filterFlags={relevantFeatureFlagNames}>
137
+ <FeatureFlagsWrapper filterFlags={getRelevantFeatureFlagNames()}>
138
138
  {children}
139
139
  </FeatureFlagsWrapper>
140
140
  </>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "73.4.2",
3
+ "version": "73.5.0",
4
4
  "description": "Includes all media card related components, CardView, CardViewSmall, Card...",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -17,7 +17,8 @@
17
17
  "af:exports": {
18
18
  "./types": "./src/types.ts",
19
19
  ".": "./src/index.ts",
20
- "./in-product": "./src/in-product.ts"
20
+ "./in-product": "./src/in-product.ts",
21
+ "./classnames": "./src/classnames.ts"
21
22
  },
22
23
  "atlassian": {
23
24
  "team": "Media Experience",
@@ -34,12 +35,13 @@
34
35
  "@atlaskit/icon": "^21.10.0",
35
36
  "@atlaskit/in-product-testing": "^0.1.0",
36
37
  "@atlaskit/media-client": "^15.0.0",
37
- "@atlaskit/media-common": "^2.11.0",
38
- "@atlaskit/media-ui": "^21.0.0",
38
+ "@atlaskit/media-common": "^2.12.0",
39
+ "@atlaskit/media-ui": "^21.1.0",
39
40
  "@atlaskit/media-viewer": "^46.2.0",
40
41
  "@atlaskit/spinner": "^15.1.0",
41
42
  "@atlaskit/theme": "^12.1.0",
42
43
  "@atlaskit/tooltip": "^17.5.0",
44
+ "@atlaskit/ufo": "^0.1.0",
43
45
  "@babel/runtime": "^7.0.0",
44
46
  "classnames": "^2.2.5",
45
47
  "eventemitter2": "^4.1.0",
@@ -61,7 +63,7 @@
61
63
  "@atlaskit/docs": "*",
62
64
  "@atlaskit/inline-message": "^11.2.0",
63
65
  "@atlaskit/media-core": "^32.3.0",
64
- "@atlaskit/media-test-helpers": "^29.3.0",
66
+ "@atlaskit/media-test-helpers": "^29.4.0",
65
67
  "@atlaskit/radio": "^5.3.2",
66
68
  "@atlaskit/range": "^6.0.0",
67
69
  "@atlaskit/select": "^15.2.1",
@@ -80,7 +82,7 @@
80
82
  "react": "^16.8.0",
81
83
  "react-dom": "^16.8.0",
82
84
  "react-intl-next": "npm:react-intl@^5.18.1",
83
- "typescript": "3.9.6",
85
+ "typescript": "3.9.10",
84
86
  "uuid": "^3.1.0",
85
87
  "wait-for-expect": "^1.2.0"
86
88
  },