@atlaskit/media-card 74.0.0 → 74.1.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cjs/errors.js +4 -0
  3. package/dist/cjs/root/card/cardAnalytics.js +6 -2
  4. package/dist/cjs/root/card/getCardPreview/index.js +47 -20
  5. package/dist/cjs/root/card/imageRefetchingAnalytics.js +45 -0
  6. package/dist/cjs/root/card/index.js +35 -29
  7. package/dist/cjs/root/inlinePlayerLazy.js +48 -0
  8. package/dist/cjs/utils/analytics.js +29 -2
  9. package/dist/cjs/utils/document.js +9 -1
  10. package/dist/cjs/utils/ufoExperiences.js +7 -3
  11. package/dist/cjs/utils/viewportDetector.js +11 -36
  12. package/dist/cjs/version.json +1 -1
  13. package/dist/es2019/errors.js +4 -0
  14. package/dist/es2019/root/card/cardAnalytics.js +3 -2
  15. package/dist/es2019/root/card/getCardPreview/index.js +27 -2
  16. package/dist/es2019/root/card/imageRefetchingAnalytics.js +30 -0
  17. package/dist/es2019/root/card/index.js +32 -33
  18. package/dist/es2019/root/inlinePlayerLazy.js +11 -0
  19. package/dist/es2019/utils/analytics.js +18 -1
  20. package/dist/es2019/utils/document.js +11 -1
  21. package/dist/es2019/utils/ufoExperiences.js +4 -3
  22. package/dist/es2019/utils/viewportDetector.js +9 -36
  23. package/dist/es2019/version.json +1 -1
  24. package/dist/esm/errors.js +4 -0
  25. package/dist/esm/root/card/cardAnalytics.js +5 -2
  26. package/dist/esm/root/card/getCardPreview/index.js +47 -20
  27. package/dist/esm/root/card/imageRefetchingAnalytics.js +32 -0
  28. package/dist/esm/root/card/index.js +37 -33
  29. package/dist/esm/root/inlinePlayerLazy.js +29 -0
  30. package/dist/esm/utils/analytics.js +22 -1
  31. package/dist/esm/utils/document.js +9 -1
  32. package/dist/esm/utils/ufoExperiences.js +6 -3
  33. package/dist/esm/utils/viewportDetector.js +9 -36
  34. package/dist/esm/version.json +1 -1
  35. package/dist/types/errors.d.ts +5 -1
  36. package/dist/types/root/card/cardAnalytics.d.ts +1 -1
  37. package/dist/types/root/card/getCardPreview/index.d.ts +4 -1
  38. package/dist/types/root/card/imageRefetchingAnalytics.d.ts +10 -0
  39. package/dist/types/root/card/index.d.ts +2 -4
  40. package/dist/types/root/inlinePlayerLazy.d.ts +2 -0
  41. package/dist/types/utils/analytics.d.ts +17 -1
  42. package/dist/types/utils/document.d.ts +1 -1
  43. package/dist/types/utils/ufoExperiences.d.ts +1 -1
  44. package/dist/types/utils/viewportDetector.d.ts +0 -10
  45. package/package.json +11 -10
@@ -1,14 +1,18 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  var _typeof = require("@babel/runtime/helpers/typeof");
4
6
 
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
- exports.ViewportDetector = exports.ViewportAnchor = exports.ABS_VIEWPORT_ANCHOR_OFFSET_TOP = void 0;
10
+ exports.ViewportDetector = void 0;
9
11
 
10
12
  var _react = _interopRequireWildcard(require("react"));
11
13
 
14
+ var _document = _interopRequireDefault(require("./document"));
15
+
12
16
  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); }
13
17
 
14
18
  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; }
@@ -19,31 +23,8 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
19
23
 
20
24
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
21
25
 
22
- /**
23
- * As IntersectionObserver::rootMargin doesn't work within IFrames, we use an empty div + dynamic offsetTop to eagerly detect cards entering viewport.
24
- * Using this approach, we can lazy load cards ABS_VIEWPORT_ANCHOR_OFFSET_TOP px before they enter viewport.
25
- */
26
26
  var ABS_VIEWPORT_ANCHOR_OFFSET_TOP = 900; //px
27
27
 
28
- exports.ABS_VIEWPORT_ANCHOR_OFFSET_TOP = ABS_VIEWPORT_ANCHOR_OFFSET_TOP;
29
- var ViewportAnchor = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
30
- if (typeof IntersectionObserver === 'undefined') {
31
- return null;
32
- }
33
-
34
- return /*#__PURE__*/_react.default.createElement("div", {
35
- ref: ref,
36
- className: "media-card-viewport-anchor",
37
- style: {
38
- position: 'absolute',
39
- top: "".concat(props.offsetTop, "px"),
40
- maxHeight: 0,
41
- pointerEvents: 'none'
42
- }
43
- });
44
- });
45
- exports.ViewportAnchor = ViewportAnchor;
46
-
47
28
  var createIntersectionObserverCallback = function createIntersectionObserverCallback(onVisible) {
48
29
  return function (entries, observer) {
49
30
  var _iterator = _createForOfIteratorHelper(entries),
@@ -70,26 +51,22 @@ var createIntersectionObserverCallback = function createIntersectionObserverCall
70
51
  var ViewportObserver = function ViewportObserver(_ref) {
71
52
  var onVisible = _ref.onVisible,
72
53
  cardEl = _ref.cardEl,
73
- children = _ref.children,
74
- preAnchorRef = _ref.preAnchorRef,
75
- postAnchorRef = _ref.postAnchorRef;
54
+ children = _ref.children;
76
55
  (0, _react.useEffect)(function () {
77
- // IntersectionObserver uses root and target elements to detect intersections, defaulting root to the viewport
78
- var intersectionObserver = new IntersectionObserver(createIntersectionObserverCallback(onVisible));
79
- (preAnchorRef === null || preAnchorRef === void 0 ? void 0 : preAnchorRef.current) && intersectionObserver.observe(preAnchorRef.current);
80
- (postAnchorRef === null || postAnchorRef === void 0 ? void 0 : postAnchorRef.current) && intersectionObserver.observe(postAnchorRef.current);
56
+ var intersectionObserver = new IntersectionObserver(createIntersectionObserverCallback(onVisible), {
57
+ root: (0, _document.default)(),
58
+ rootMargin: "".concat(ABS_VIEWPORT_ANCHOR_OFFSET_TOP, "px")
59
+ });
81
60
  cardEl && intersectionObserver.observe(cardEl);
82
61
  return function () {
83
62
  intersectionObserver.disconnect();
84
63
  };
85
- }, [cardEl, preAnchorRef, postAnchorRef, onVisible]);
64
+ }, [cardEl, onVisible]);
86
65
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
87
66
  };
88
67
 
89
68
  var ViewportDetector = function ViewportDetector(_ref2) {
90
69
  var cardEl = _ref2.cardEl,
91
- preAnchorRef = _ref2.preAnchorRef,
92
- postAnchorRef = _ref2.postAnchorRef,
93
70
  onVisible = _ref2.onVisible,
94
71
  children = _ref2.children;
95
72
 
@@ -99,8 +76,6 @@ var ViewportDetector = function ViewportDetector(_ref2) {
99
76
 
100
77
  return /*#__PURE__*/_react.default.createElement(ViewportObserver, {
101
78
  cardEl: cardEl,
102
- preAnchorRef: preAnchorRef,
103
- postAnchorRef: postAnchorRef,
104
79
  onVisible: onVisible
105
80
  }, children);
106
81
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "74.0.0",
3
+ "version": "74.1.2",
4
4
  "sideEffects": false
5
5
  }
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Primary reason is logged through Data Portal.
3
+ * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
4
+ */
1
5
  export class MediaCardError extends Error {
2
6
  constructor(primaryReason, secondaryError) {
3
7
  super(primaryReason); // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget
@@ -1,5 +1,6 @@
1
1
  import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload, getCopiedFilePayload, getRenderCommencedEventPayload, getRenderPreviewableCardPayload } from '../../utils/analytics';
2
- export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error) => {
2
+ import { MediaCardError } from './../../errors';
3
+ export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error = new MediaCardError('missing-error-data')) => {
3
4
  const fireEvent = payload => fireMediaCardEvent(payload, createAnalyticsEvent);
4
5
 
5
6
  switch (status) {
@@ -12,7 +13,7 @@ export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttribute
12
13
  break;
13
14
 
14
15
  case 'error':
15
- error && fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error, ssrReliability));
16
+ fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error, ssrReliability));
16
17
  break;
17
18
  }
18
19
  };
@@ -5,6 +5,8 @@ import { getCardPreviewFromFilePreview, getCardPreviewFromBackend } from './help
5
5
  import { MediaCardError, SsrPreviewError, isUnsupportedLocalPreviewError } from '../../../errors';
6
6
  import { isBigger } from '../../../utils/dimensionComparer';
7
7
  import { extractFilePreviewStatus, isPreviewableStatus } from './filePreviewStatus';
8
+ import { fireImageFetchingOperationalEvent, calculatePercentageDifference } from '../imageRefetchingAnalytics';
9
+ import { getMediaFeatureFlag } from '@atlaskit/media-common';
8
10
  export { getCardPreviewFromFilePreview, getCardPreviewFromBackend, isSupportedLocalPreview } from './helpers';
9
11
  export { extractFilePreviewStatus } from './filePreviewStatus';
10
12
  export const getCardPreviewFromCache = cardPreviewCache.get;
@@ -71,13 +73,24 @@ export const getCardPreview = async ({
71
73
  onLocalPreviewError,
72
74
  isRemotePreviewReady,
73
75
  imageUrlParams,
74
- mediaBlobUrlAttrs
76
+ mediaBlobUrlAttrs,
77
+ createAnalyticsEvent,
78
+ featureFlags
75
79
  }) => {
76
80
  const mode = imageUrlParams.mode;
77
81
  const cachedPreview = cardPreviewCache.get(id, mode);
78
82
  const dimensionsAreBigger = isBigger(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions);
79
83
 
80
84
  if (cachedPreview && !dimensionsAreBigger) {
85
+ if (getMediaFeatureFlag('memoryCacheLogging', featureFlags)) {
86
+ createAnalyticsEvent && fireImageFetchingOperationalEvent(createAnalyticsEvent, 'cache-hit', {
87
+ fileId: id,
88
+ prevDimensions: cachedPreview.dimensions,
89
+ currentDimensions: dimensions,
90
+ source: cachedPreview.source
91
+ });
92
+ }
93
+
81
94
  return cachedPreview;
82
95
  }
83
96
 
@@ -123,7 +136,19 @@ export const getCardPreview = async ({
123
136
  throw new MediaCardError('remote-preview-not-ready');
124
137
  }
125
138
 
126
- return fetchAndCacheRemotePreview(mediaClient, id, dimensions, imageUrlParams, mediaBlobUrlAttrs);
139
+ const remotePreview = await fetchAndCacheRemotePreview(mediaClient, id, dimensions, imageUrlParams, mediaBlobUrlAttrs);
140
+
141
+ if (getMediaFeatureFlag('memoryCacheLogging', featureFlags)) {
142
+ createAnalyticsEvent && fireImageFetchingOperationalEvent(createAnalyticsEvent, 'remote-success', {
143
+ fileId: id,
144
+ prevDimensions: cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions,
145
+ currentDimensions: dimensions,
146
+ dimensionsPercentageDiff: calculatePercentageDifference(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions),
147
+ source: remotePreview.source
148
+ });
149
+ }
150
+
151
+ return remotePreview;
127
152
  };
128
153
  export const shouldResolvePreview = ({
129
154
  status,
@@ -0,0 +1,30 @@
1
+ import { fireMediaCardEvent, getCacheHitEventPayload, getRemoteSuccessEventPayload } from '../../utils/analytics';
2
+ export const fireImageFetchingOperationalEvent = (createAnalyticsEvent, action, cardPreviewAttributes) => {
3
+ const fireEvent = payload => fireMediaCardEvent(payload, createAnalyticsEvent);
4
+
5
+ switch (action) {
6
+ case 'cache-hit':
7
+ fireEvent(getCacheHitEventPayload(cardPreviewAttributes));
8
+ break;
9
+
10
+ case 'remote-success':
11
+ fireEvent(getRemoteSuccessEventPayload(cardPreviewAttributes));
12
+ break;
13
+ }
14
+ };
15
+ export const calculatePercentageDifference = (prevDimensions, currentDimensions) => {
16
+ if (!prevDimensions) {
17
+ return undefined;
18
+ }
19
+
20
+ const prevWidth = parseInt(`${prevDimensions === null || prevDimensions === void 0 ? void 0 : prevDimensions.width}`, 10);
21
+ const currWidth = parseInt(`${currentDimensions === null || currentDimensions === void 0 ? void 0 : currentDimensions.width}`, 10);
22
+ const prevHeight = parseInt(`${prevDimensions === null || prevDimensions === void 0 ? void 0 : prevDimensions.height}`, 10);
23
+ const currHeight = parseInt(`${currentDimensions === null || currentDimensions === void 0 ? void 0 : currentDimensions.height}`, 10);
24
+ const percentageDiffInWidth = ((currWidth - prevWidth) / prevWidth * 100).toFixed(2);
25
+ const percentageDiffInHeight = ((currHeight - prevHeight) / prevHeight * 100).toFixed(2);
26
+ return {
27
+ width: percentageDiffInWidth,
28
+ height: percentageDiffInHeight
29
+ };
30
+ };
@@ -1,5 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React, { Component, createRef } from 'react';
2
+ import React, { Component, Suspense } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
5
5
  import { withMediaAnalyticsContext } from '@atlaskit/media-common';
@@ -8,11 +8,11 @@ import { globalMediaEventEmitter, isDifferentIdentifier, isFileIdentifier, RECEN
8
8
  import { MediaViewer } from '@atlaskit/media-viewer';
9
9
  import { injectIntl, IntlProvider } from 'react-intl-next';
10
10
  import { CardView } from '../cardView';
11
- import { ABS_VIEWPORT_ANCHOR_OFFSET_TOP, ViewportDetector, ViewportAnchor } from '../../utils/viewportDetector';
11
+ import { ViewportDetector } from '../../utils/viewportDetector';
12
12
  import { getRequestedDimensions } from '../../utils/getDataURIDimension';
13
13
  import { getCardPreview, getCardPreviewFromCache, removeCardPreviewFromCache, getFilePreviewFromFileState, shouldResolvePreview, getSSRCardPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, fetchAndCacheRemotePreview } from './getCardPreview';
14
14
  import { getFileDetails } from '../../utils/metadata';
15
- import { InlinePlayer } from '../inlinePlayer';
15
+ import { InlinePlayerLazy } from '../inlinePlayerLazy';
16
16
  import { getFileAttributes, extractErrorInfo, LOGGED_FEATURE_FLAGS } from '../../utils/analytics';
17
17
  import { isLocalPreviewError, MediaCardError, ensureMediaCardError, ImageLoadError } from '../../errors';
18
18
  import { fireOperationalEvent, fireCommencedEvent, fireCopiedEvent, fireScreenEvent } from './cardAnalytics';
@@ -25,7 +25,7 @@ import { getMediaCardCursor } from '../../utils/getMediaCardCursor';
25
25
  import { completeUfoExperience, startUfoExperience } from '../../utils/ufoExperiences';
26
26
  import { generateUniqueId } from '../../utils/generateUniqueId';
27
27
  const packageName = "@atlaskit/media-card";
28
- const packageVersion = "74.0.0";
28
+ const packageVersion = "74.1.2";
29
29
  export class CardBase extends Component {
30
30
  // An internalOccurrenceKey is a randomly generated value to differentiate various instances
31
31
  // of Cards regardless of whether it shares the same file (either internal or external)
@@ -43,10 +43,6 @@ export class CardBase extends Component {
43
43
  wasStatusProcessing: false
44
44
  });
45
45
 
46
- _defineProperty(this, "viewportPreAnchorRef", /*#__PURE__*/createRef());
47
-
48
- _defineProperty(this, "viewportPostAnchorRef", /*#__PURE__*/createRef());
49
-
50
46
  _defineProperty(this, "ssrReliability", {
51
47
  server: {
52
48
  status: 'unknown'
@@ -103,7 +99,8 @@ export class CardBase extends Component {
103
99
  } = identifier;
104
100
  const {
105
101
  dimensions = {},
106
- mediaClient
102
+ mediaClient,
103
+ createAnalyticsEvent
107
104
  } = this.props;
108
105
  return {
109
106
  mediaClient,
@@ -113,7 +110,9 @@ export class CardBase extends Component {
113
110
  filePreview: isBannedLocalPreview ? undefined : getFilePreviewFromFileState(fileState),
114
111
  isRemotePreviewReady: isImageRepresentationReady(fileState),
115
112
  imageUrlParams: this.getImageURLParams(identifier),
116
- mediaBlobUrlAttrs: this.getMediaBlobUrlAttrs(identifier, fileState)
113
+ mediaBlobUrlAttrs: this.getMediaBlobUrlAttrs(identifier, fileState),
114
+ createAnalyticsEvent,
115
+ featureFlags: this.props.featureFlags
117
116
  };
118
117
  });
119
118
 
@@ -400,7 +399,10 @@ export class CardBase extends Component {
400
399
  shouldAutoplay,
401
400
  cardPreview
402
401
  } = this.state;
403
- return /*#__PURE__*/React.createElement(InlinePlayer, {
402
+ const card = this.renderCard(false, 'loading', false);
403
+ return /*#__PURE__*/React.createElement(Suspense, {
404
+ fallback: card
405
+ }, /*#__PURE__*/React.createElement(InlinePlayerLazy, {
404
406
  mediaClient: mediaClient,
405
407
  dimensions: dimensions,
406
408
  originalDimensions: originalDimensions,
@@ -413,7 +415,7 @@ export class CardBase extends Component {
413
415
  ref: this.setRef,
414
416
  testId: testId,
415
417
  cardPreview: cardPreview
416
- });
418
+ }));
417
419
  });
418
420
 
419
421
  _defineProperty(this, "onMediaViewerClose", () => {
@@ -477,7 +479,7 @@ export class CardBase extends Component {
477
479
  }), document.body);
478
480
  });
479
481
 
480
- _defineProperty(this, "renderCard", () => {
482
+ _defineProperty(this, "renderCard", (withCallbacks = true, cardStatusOverride, izLazyOverride) => {
481
483
  const {
482
484
  identifier,
483
485
  isLazy,
@@ -515,15 +517,16 @@ export class CardBase extends Component {
515
517
  onDisplayImage,
516
518
  actions,
517
519
  onMouseEnter
518
- } = this; // Card can be artificially turned visible before entering the viewport
520
+ } = this;
521
+ const isLazyWithOverride = izLazyOverride === undefined ? isLazy : izLazyOverride; // Card can be artificially turned visible before entering the viewport
519
522
  // For example, when we have the image in cache
520
523
 
521
- const nativeLazyLoad = isLazy && !isCardVisible; // Force Media Image to always display img for SSR
524
+ const nativeLazyLoad = isLazyWithOverride && !isCardVisible; // Force Media Image to always display img for SSR
522
525
 
523
526
  const forceSyncDisplay = !!ssr;
524
527
  const mediaCardCursor = getMediaCardCursor(!!useInlinePlayer, !!shouldOpenMediaViewer, status === 'error' || status === 'failed-processing', !!this.state.cardPreview, metadata.mediaType);
525
528
  const card = /*#__PURE__*/React.createElement(CardView, {
526
- status: status,
529
+ status: cardStatusOverride || status,
527
530
  error: error,
528
531
  mediaItemType: mediaItemType,
529
532
  metadata: metadata,
@@ -535,34 +538,26 @@ export class CardBase extends Component {
535
538
  actions: actions,
536
539
  selectable: selectable,
537
540
  selected: selected,
538
- onClick: onCardViewClick,
539
- onMouseEnter: onMouseEnter,
541
+ onClick: withCallbacks ? onCardViewClick : undefined,
542
+ onMouseEnter: withCallbacks ? onMouseEnter : undefined,
540
543
  disableOverlay: disableOverlay,
541
544
  progress: progress,
542
- onDisplayImage: onDisplayImage,
545
+ onDisplayImage: withCallbacks ? onDisplayImage : undefined,
543
546
  innerRef: this.setRef,
544
547
  testId: testId,
545
548
  featureFlags: featureFlags,
546
549
  titleBoxBgColor: titleBoxBgColor,
547
550
  titleBoxIcon: titleBoxIcon,
548
- onImageError: this.onImageError,
549
- onImageLoad: this.onImageLoad,
551
+ onImageError: withCallbacks ? this.onImageError : undefined,
552
+ onImageLoad: withCallbacks ? this.onImageLoad : undefined,
550
553
  nativeLazyLoad: nativeLazyLoad,
551
554
  forceSyncDisplay: forceSyncDisplay,
552
555
  mediaCardCursor: mediaCardCursor
553
556
  });
554
- return isLazy ? /*#__PURE__*/React.createElement(ViewportDetector, {
557
+ return isLazyWithOverride ? /*#__PURE__*/React.createElement(ViewportDetector, {
555
558
  cardEl: cardRef,
556
- preAnchorRef: this.viewportPreAnchorRef,
557
- postAnchorRef: this.viewportPostAnchorRef,
558
559
  onVisible: this.onCardInViewport
559
- }, /*#__PURE__*/React.createElement(ViewportAnchor, {
560
- ref: this.viewportPreAnchorRef,
561
- offsetTop: -ABS_VIEWPORT_ANCHOR_OFFSET_TOP
562
- }), card, /*#__PURE__*/React.createElement(ViewportAnchor, {
563
- ref: this.viewportPostAnchorRef,
564
- offsetTop: ABS_VIEWPORT_ANCHOR_OFFSET_TOP
565
- })) : card;
560
+ }, card) : card;
566
561
  });
567
562
 
568
563
  _defineProperty(this, "storeSSRData", () => {
@@ -706,6 +701,8 @@ export class CardBase extends Component {
706
701
  }
707
702
 
708
703
  componentDidMount() {
704
+ var _getDocument;
705
+
709
706
  this.hasBeenMounted = true;
710
707
  const {
711
708
  isCardVisible,
@@ -741,7 +738,7 @@ export class CardBase extends Component {
741
738
  // won't work in IE11
742
739
 
743
740
 
744
- getDocument().addEventListener('copy', this.fireCopiedEvent);
741
+ (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : _getDocument.addEventListener('copy', this.fireCopiedEvent);
745
742
  }
746
743
 
747
744
  componentDidUpdate(prevProps, prevState) {
@@ -842,9 +839,11 @@ export class CardBase extends Component {
842
839
  }
843
840
 
844
841
  componentWillUnmount() {
842
+ var _getDocument2;
843
+
845
844
  this.hasBeenMounted = false;
846
845
  this.unsubscribe();
847
- getDocument().removeEventListener('copy', this.fireCopiedEvent);
846
+ (_getDocument2 = getDocument()) === null || _getDocument2 === void 0 ? void 0 : _getDocument2.removeEventListener('copy', this.fireCopiedEvent);
848
847
  }
849
848
 
850
849
  updateStateForIdentifier(identifier) {
@@ -0,0 +1,11 @@
1
+ import { lazy } from 'react';
2
+ export const InlinePlayerLazy = /*#__PURE__*/lazy(async () => {
3
+ const {
4
+ InlinePlayer
5
+ } = await import(
6
+ /* webpackChunkName: "@atlaskit-internal_media-card-inlineplayer" */
7
+ './inlinePlayer');
8
+ return {
9
+ default: InlinePlayer
10
+ };
11
+ });
@@ -9,7 +9,8 @@ const relevantFlags = {
9
9
  observedWidth: true,
10
10
  mediaInline: false,
11
11
  folderUploads: false,
12
- mediaUploadApiV2: true
12
+ mediaUploadApiV2: true,
13
+ memoryCacheLogging: true
13
14
  };
14
15
  export const LOGGED_FEATURE_FLAGS = filterFeatureFlagNames(relevantFlags);
15
16
  export const LOGGED_FEATURE_FLAG_KEYS = filterFeatureFlagKeysAllProducts(relevantFlags);
@@ -52,6 +53,22 @@ export const getRenderSucceededEventPayload = (fileAttributes, performanceAttrib
52
53
  ssrReliability
53
54
  }
54
55
  });
56
+ export const getCacheHitEventPayload = cardPreviewAttributes => ({
57
+ eventType: 'operational',
58
+ action: 'cache-hit',
59
+ actionSubject: 'mediaCardCache',
60
+ attributes: {
61
+ cardPreviewAttributes
62
+ }
63
+ });
64
+ export const getRemoteSuccessEventPayload = cardPreviewAttributes => ({
65
+ eventType: 'operational',
66
+ action: 'Remote-success',
67
+ actionSubject: 'mediaCardCache',
68
+ attributes: {
69
+ cardPreviewAttributes
70
+ }
71
+ });
55
72
  export const getRenderFailedExternalUriPayload = (fileAttributes, performanceAttributes) => ({
56
73
  eventType: 'operational',
57
74
  action: 'failed',
@@ -1 +1,11 @@
1
- export default (() => document);
1
+ export default (() => {
2
+ if (typeof window === 'undefined') {
3
+ return;
4
+ }
5
+
6
+ if (typeof window.document === 'undefined') {
7
+ return;
8
+ }
9
+
10
+ return window.document;
11
+ });
@@ -1,8 +1,9 @@
1
1
  import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
2
  import { extractErrorInfo, getRenderErrorRequestMetadata, LOGGED_FEATURE_FLAG_KEYS } from './analytics';
3
+ import { MediaCardError } from '../errors';
3
4
  import { getMediaEnvironment, getMediaRegion } from '@atlaskit/media-client';
4
5
  const packageName = "@atlaskit/media-card";
5
- const packageVersion = "74.0.0";
6
+ const packageVersion = "74.1.2";
6
7
  let concurrentExperience;
7
8
 
8
9
  const getExperience = id => {
@@ -24,7 +25,7 @@ const getExperience = id => {
24
25
  export const startUfoExperience = id => {
25
26
  getExperience(id).start();
26
27
  };
27
- export const completeUfoExperience = (id, status, fileAttributes, fileStateFlags, ssrReliability, error) => {
28
+ export const completeUfoExperience = (id, status, fileAttributes, fileStateFlags, ssrReliability, error = new MediaCardError('missing-error-data')) => {
28
29
  switch (status) {
29
30
  case 'complete':
30
31
  succeedUfoExperience(id, {
@@ -44,7 +45,7 @@ export const completeUfoExperience = (id, status, fileAttributes, fileStateFlags
44
45
  break;
45
46
 
46
47
  case 'error':
47
- error && failUfoExperience(id, {
48
+ failUfoExperience(id, {
48
49
  fileAttributes,
49
50
  ...extractErrorInfo(error),
50
51
  request: getRenderErrorRequestMetadata(error),
@@ -1,27 +1,6 @@
1
- import React, { useEffect, forwardRef } from 'react';
2
- /**
3
- * As IntersectionObserver::rootMargin doesn't work within IFrames, we use an empty div + dynamic offsetTop to eagerly detect cards entering viewport.
4
- * Using this approach, we can lazy load cards ABS_VIEWPORT_ANCHOR_OFFSET_TOP px before they enter viewport.
5
- */
6
-
7
- export const ABS_VIEWPORT_ANCHOR_OFFSET_TOP = 900; //px
8
-
9
- export const ViewportAnchor = /*#__PURE__*/forwardRef((props, ref) => {
10
- if (typeof IntersectionObserver === 'undefined') {
11
- return null;
12
- }
13
-
14
- return /*#__PURE__*/React.createElement("div", {
15
- ref: ref,
16
- className: "media-card-viewport-anchor",
17
- style: {
18
- position: 'absolute',
19
- top: `${props.offsetTop}px`,
20
- maxHeight: 0,
21
- pointerEvents: 'none'
22
- }
23
- });
24
- });
1
+ import React, { useEffect } from 'react';
2
+ import getDocument from './document';
3
+ const ABS_VIEWPORT_ANCHOR_OFFSET_TOP = 900; //px
25
4
 
26
5
  const createIntersectionObserverCallback = onVisible => (entries, observer) => {
27
6
  for (let entry of entries) {
@@ -36,27 +15,23 @@ const createIntersectionObserverCallback = onVisible => (entries, observer) => {
36
15
  const ViewportObserver = ({
37
16
  onVisible,
38
17
  cardEl,
39
- children,
40
- preAnchorRef,
41
- postAnchorRef
18
+ children
42
19
  }) => {
43
20
  useEffect(() => {
44
- // IntersectionObserver uses root and target elements to detect intersections, defaulting root to the viewport
45
- const intersectionObserver = new IntersectionObserver(createIntersectionObserverCallback(onVisible));
46
- (preAnchorRef === null || preAnchorRef === void 0 ? void 0 : preAnchorRef.current) && intersectionObserver.observe(preAnchorRef.current);
47
- (postAnchorRef === null || postAnchorRef === void 0 ? void 0 : postAnchorRef.current) && intersectionObserver.observe(postAnchorRef.current);
21
+ const intersectionObserver = new IntersectionObserver(createIntersectionObserverCallback(onVisible), {
22
+ root: getDocument(),
23
+ rootMargin: `${ABS_VIEWPORT_ANCHOR_OFFSET_TOP}px`
24
+ });
48
25
  cardEl && intersectionObserver.observe(cardEl);
49
26
  return () => {
50
27
  intersectionObserver.disconnect();
51
28
  };
52
- }, [cardEl, preAnchorRef, postAnchorRef, onVisible]);
29
+ }, [cardEl, onVisible]);
53
30
  return /*#__PURE__*/React.createElement(React.Fragment, null, children);
54
31
  };
55
32
 
56
33
  export const ViewportDetector = ({
57
34
  cardEl,
58
- preAnchorRef,
59
- postAnchorRef,
60
35
  onVisible,
61
36
  children
62
37
  }) => {
@@ -66,8 +41,6 @@ export const ViewportDetector = ({
66
41
 
67
42
  return /*#__PURE__*/React.createElement(ViewportObserver, {
68
43
  cardEl: cardEl,
69
- preAnchorRef: preAnchorRef,
70
- postAnchorRef: postAnchorRef,
71
44
  onVisible: onVisible
72
45
  }, children);
73
46
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "74.0.0",
3
+ "version": "74.1.2",
4
4
  "sideEffects": false
5
5
  }
@@ -10,6 +10,10 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
10
10
 
11
11
  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; } }
12
12
 
13
+ /**
14
+ * Primary reason is logged through Data Portal.
15
+ * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
16
+ */
13
17
  export var MediaCardError = /*#__PURE__*/function (_Error) {
14
18
  _inherits(MediaCardError, _Error);
15
19
 
@@ -1,5 +1,8 @@
1
1
  import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload, getCopiedFilePayload, getRenderCommencedEventPayload, getRenderPreviewableCardPayload } from '../../utils/analytics';
2
- export var fireOperationalEvent = function fireOperationalEvent(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error) {
2
+ import { MediaCardError } from './../../errors';
3
+ export var fireOperationalEvent = function fireOperationalEvent(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability) {
4
+ var error = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : new MediaCardError('missing-error-data');
5
+
3
6
  var fireEvent = function fireEvent(payload) {
4
7
  return fireMediaCardEvent(payload, createAnalyticsEvent);
5
8
  };
@@ -14,7 +17,7 @@ export var fireOperationalEvent = function fireOperationalEvent(createAnalyticsE
14
17
  break;
15
18
 
16
19
  case 'error':
17
- error && fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error, ssrReliability));
20
+ fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error, ssrReliability));
18
21
  break;
19
22
  }
20
23
  };