@atlaskit/media-card 74.0.0 → 74.1.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 (41) hide show
  1. package/CHANGELOG.md +13 -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 +13 -16
  7. package/dist/cjs/utils/analytics.js +29 -2
  8. package/dist/cjs/utils/document.js +9 -1
  9. package/dist/cjs/utils/ufoExperiences.js +7 -3
  10. package/dist/cjs/utils/viewportDetector.js +11 -36
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/errors.js +4 -0
  13. package/dist/es2019/root/card/cardAnalytics.js +3 -2
  14. package/dist/es2019/root/card/getCardPreview/index.js +27 -2
  15. package/dist/es2019/root/card/imageRefetchingAnalytics.js +30 -0
  16. package/dist/es2019/root/card/index.js +15 -20
  17. package/dist/es2019/utils/analytics.js +18 -1
  18. package/dist/es2019/utils/document.js +11 -1
  19. package/dist/es2019/utils/ufoExperiences.js +4 -3
  20. package/dist/es2019/utils/viewportDetector.js +9 -36
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/errors.js +4 -0
  23. package/dist/esm/root/card/cardAnalytics.js +5 -2
  24. package/dist/esm/root/card/getCardPreview/index.js +47 -20
  25. package/dist/esm/root/card/imageRefetchingAnalytics.js +32 -0
  26. package/dist/esm/root/card/index.js +15 -20
  27. package/dist/esm/utils/analytics.js +22 -1
  28. package/dist/esm/utils/document.js +9 -1
  29. package/dist/esm/utils/ufoExperiences.js +6 -3
  30. package/dist/esm/utils/viewportDetector.js +9 -36
  31. package/dist/esm/version.json +1 -1
  32. package/dist/types/errors.d.ts +5 -1
  33. package/dist/types/root/card/cardAnalytics.d.ts +1 -1
  34. package/dist/types/root/card/getCardPreview/index.d.ts +4 -1
  35. package/dist/types/root/card/imageRefetchingAnalytics.d.ts +10 -0
  36. package/dist/types/root/card/index.d.ts +0 -2
  37. package/dist/types/utils/analytics.d.ts +17 -1
  38. package/dist/types/utils/document.d.ts +1 -1
  39. package/dist/types/utils/ufoExperiences.d.ts +1 -1
  40. package/dist/types/utils/viewportDetector.d.ts +0 -10
  41. package/package.json +6 -5
@@ -1,5 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React, { Component, createRef } from 'react';
2
+ import React, { Component } 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,7 +8,7 @@ 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';
@@ -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.0";
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
 
@@ -553,16 +552,8 @@ export class CardBase extends Component {
553
552
  });
554
553
  return isLazy ? /*#__PURE__*/React.createElement(ViewportDetector, {
555
554
  cardEl: cardRef,
556
- preAnchorRef: this.viewportPreAnchorRef,
557
- postAnchorRef: this.viewportPostAnchorRef,
558
555
  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;
556
+ }, card) : card;
566
557
  });
567
558
 
568
559
  _defineProperty(this, "storeSSRData", () => {
@@ -706,6 +697,8 @@ export class CardBase extends Component {
706
697
  }
707
698
 
708
699
  componentDidMount() {
700
+ var _getDocument;
701
+
709
702
  this.hasBeenMounted = true;
710
703
  const {
711
704
  isCardVisible,
@@ -741,7 +734,7 @@ export class CardBase extends Component {
741
734
  // won't work in IE11
742
735
 
743
736
 
744
- getDocument().addEventListener('copy', this.fireCopiedEvent);
737
+ (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : _getDocument.addEventListener('copy', this.fireCopiedEvent);
745
738
  }
746
739
 
747
740
  componentDidUpdate(prevProps, prevState) {
@@ -842,9 +835,11 @@ export class CardBase extends Component {
842
835
  }
843
836
 
844
837
  componentWillUnmount() {
838
+ var _getDocument2;
839
+
845
840
  this.hasBeenMounted = false;
846
841
  this.unsubscribe();
847
- getDocument().removeEventListener('copy', this.fireCopiedEvent);
842
+ (_getDocument2 = getDocument()) === null || _getDocument2 === void 0 ? void 0 : _getDocument2.removeEventListener('copy', this.fireCopiedEvent);
848
843
  }
849
844
 
850
845
  updateStateForIdentifier(identifier) {
@@ -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.0";
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.0",
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
  };
@@ -13,6 +13,8 @@ import { getCardPreviewFromFilePreview, getCardPreviewFromBackend } from './help
13
13
  import { MediaCardError, SsrPreviewError, isUnsupportedLocalPreviewError } from '../../../errors';
14
14
  import { isBigger } from '../../../utils/dimensionComparer';
15
15
  import { extractFilePreviewStatus, isPreviewableStatus } from './filePreviewStatus';
16
+ import { fireImageFetchingOperationalEvent, calculatePercentageDifference } from '../imageRefetchingAnalytics';
17
+ import { getMediaFeatureFlag } from '@atlaskit/media-common';
16
18
  export { getCardPreviewFromFilePreview, getCardPreviewFromBackend, isSupportedLocalPreview } from './helpers';
17
19
  export { extractFilePreviewStatus } from './filePreviewStatus';
18
20
  export var getCardPreviewFromCache = cardPreviewCache.get;
@@ -75,48 +77,57 @@ var extendAndCachePreview = function extendAndCachePreview(id, mode, preview, me
75
77
 
76
78
  export var getCardPreview = /*#__PURE__*/function () {
77
79
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
78
- var mediaClient, id, _ref$dimensions, dimensions, filePreview, onLocalPreviewError, isRemotePreviewReady, imageUrlParams, mediaBlobUrlAttrs, mode, cachedPreview, dimensionsAreBigger, localPreview;
80
+ var mediaClient, id, _ref$dimensions, dimensions, filePreview, onLocalPreviewError, isRemotePreviewReady, imageUrlParams, mediaBlobUrlAttrs, createAnalyticsEvent, featureFlags, mode, cachedPreview, dimensionsAreBigger, localPreview, remotePreview;
79
81
 
80
82
  return _regeneratorRuntime.wrap(function _callee$(_context) {
81
83
  while (1) {
82
84
  switch (_context.prev = _context.next) {
83
85
  case 0:
84
- mediaClient = _ref.mediaClient, id = _ref.id, _ref$dimensions = _ref.dimensions, dimensions = _ref$dimensions === void 0 ? {} : _ref$dimensions, filePreview = _ref.filePreview, onLocalPreviewError = _ref.onLocalPreviewError, isRemotePreviewReady = _ref.isRemotePreviewReady, imageUrlParams = _ref.imageUrlParams, mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs;
86
+ mediaClient = _ref.mediaClient, id = _ref.id, _ref$dimensions = _ref.dimensions, dimensions = _ref$dimensions === void 0 ? {} : _ref$dimensions, filePreview = _ref.filePreview, onLocalPreviewError = _ref.onLocalPreviewError, isRemotePreviewReady = _ref.isRemotePreviewReady, imageUrlParams = _ref.imageUrlParams, mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs, createAnalyticsEvent = _ref.createAnalyticsEvent, featureFlags = _ref.featureFlags;
85
87
  mode = imageUrlParams.mode;
86
88
  cachedPreview = cardPreviewCache.get(id, mode);
87
89
  dimensionsAreBigger = isBigger(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions);
88
90
 
89
91
  if (!(cachedPreview && !dimensionsAreBigger)) {
90
- _context.next = 6;
92
+ _context.next = 7;
91
93
  break;
92
94
  }
93
95
 
96
+ if (getMediaFeatureFlag('memoryCacheLogging', featureFlags)) {
97
+ createAnalyticsEvent && fireImageFetchingOperationalEvent(createAnalyticsEvent, 'cache-hit', {
98
+ fileId: id,
99
+ prevDimensions: cachedPreview.dimensions,
100
+ currentDimensions: dimensions,
101
+ source: cachedPreview.source
102
+ });
103
+ }
104
+
94
105
  return _context.abrupt("return", cachedPreview);
95
106
 
96
- case 6:
97
- _context.prev = 6;
107
+ case 7:
108
+ _context.prev = 7;
98
109
 
99
110
  if (!filePreview) {
100
- _context.next = 12;
111
+ _context.next = 13;
101
112
  break;
102
113
  }
103
114
 
104
- _context.next = 10;
115
+ _context.next = 11;
105
116
  return getCardPreviewFromFilePreview(filePreview);
106
117
 
107
- case 10:
118
+ case 11:
108
119
  localPreview = _context.sent;
109
120
  return _context.abrupt("return", extendAndCachePreview(id, mode, _objectSpread(_objectSpread({}, localPreview), {}, {
110
121
  dimensions: dimensions
111
122
  }), mediaBlobUrlAttrs));
112
123
 
113
- case 12:
114
- _context.next = 19;
124
+ case 13:
125
+ _context.next = 20;
115
126
  break;
116
127
 
117
- case 14:
118
- _context.prev = 14;
119
- _context.t0 = _context["catch"](6);
128
+ case 15:
129
+ _context.prev = 15;
130
+ _context.t0 = _context["catch"](7);
120
131
 
121
132
  /**
122
133
  * We report the error if:
@@ -138,29 +149,45 @@ export var getCardPreview = /*#__PURE__*/function () {
138
149
 
139
150
 
140
151
  if (isRemotePreviewReady) {
141
- _context.next = 19;
152
+ _context.next = 20;
142
153
  break;
143
154
  }
144
155
 
145
156
  throw _context.t0;
146
157
 
147
- case 19:
158
+ case 20:
148
159
  if (isRemotePreviewReady) {
149
- _context.next = 21;
160
+ _context.next = 22;
150
161
  break;
151
162
  }
152
163
 
153
164
  throw new MediaCardError('remote-preview-not-ready');
154
165
 
155
- case 21:
156
- return _context.abrupt("return", fetchAndCacheRemotePreview(mediaClient, id, dimensions, imageUrlParams, mediaBlobUrlAttrs));
157
-
158
166
  case 22:
167
+ _context.next = 24;
168
+ return fetchAndCacheRemotePreview(mediaClient, id, dimensions, imageUrlParams, mediaBlobUrlAttrs);
169
+
170
+ case 24:
171
+ remotePreview = _context.sent;
172
+
173
+ if (getMediaFeatureFlag('memoryCacheLogging', featureFlags)) {
174
+ createAnalyticsEvent && fireImageFetchingOperationalEvent(createAnalyticsEvent, 'remote-success', {
175
+ fileId: id,
176
+ prevDimensions: cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions,
177
+ currentDimensions: dimensions,
178
+ dimensionsPercentageDiff: calculatePercentageDifference(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions),
179
+ source: remotePreview.source
180
+ });
181
+ }
182
+
183
+ return _context.abrupt("return", remotePreview);
184
+
185
+ case 27:
159
186
  case "end":
160
187
  return _context.stop();
161
188
  }
162
189
  }
163
- }, _callee, null, [[6, 14]]);
190
+ }, _callee, null, [[7, 15]]);
164
191
  }));
165
192
 
166
193
  return function getCardPreview(_x) {
@@ -0,0 +1,32 @@
1
+ import { fireMediaCardEvent, getCacheHitEventPayload, getRemoteSuccessEventPayload } from '../../utils/analytics';
2
+ export var fireImageFetchingOperationalEvent = function fireImageFetchingOperationalEvent(createAnalyticsEvent, action, cardPreviewAttributes) {
3
+ var fireEvent = function fireEvent(payload) {
4
+ return fireMediaCardEvent(payload, createAnalyticsEvent);
5
+ };
6
+
7
+ switch (action) {
8
+ case 'cache-hit':
9
+ fireEvent(getCacheHitEventPayload(cardPreviewAttributes));
10
+ break;
11
+
12
+ case 'remote-success':
13
+ fireEvent(getRemoteSuccessEventPayload(cardPreviewAttributes));
14
+ break;
15
+ }
16
+ };
17
+ export var calculatePercentageDifference = function calculatePercentageDifference(prevDimensions, currentDimensions) {
18
+ if (!prevDimensions) {
19
+ return undefined;
20
+ }
21
+
22
+ var prevWidth = parseInt("".concat(prevDimensions === null || prevDimensions === void 0 ? void 0 : prevDimensions.width), 10);
23
+ var currWidth = parseInt("".concat(currentDimensions === null || currentDimensions === void 0 ? void 0 : currentDimensions.width), 10);
24
+ var prevHeight = parseInt("".concat(prevDimensions === null || prevDimensions === void 0 ? void 0 : prevDimensions.height), 10);
25
+ var currHeight = parseInt("".concat(currentDimensions === null || currentDimensions === void 0 ? void 0 : currentDimensions.height), 10);
26
+ var percentageDiffInWidth = ((currWidth - prevWidth) / prevWidth * 100).toFixed(2);
27
+ var percentageDiffInHeight = ((currHeight - prevHeight) / prevHeight * 100).toFixed(2);
28
+ return {
29
+ width: percentageDiffInWidth,
30
+ height: percentageDiffInHeight
31
+ };
32
+ };
@@ -17,7 +17,7 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
17
17
 
18
18
  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; } }
19
19
 
20
- import React, { Component, createRef } from 'react';
20
+ import React, { Component } from 'react';
21
21
  import ReactDOM from 'react-dom';
22
22
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
23
23
  import { withMediaAnalyticsContext } from '@atlaskit/media-common';
@@ -26,7 +26,7 @@ import { globalMediaEventEmitter, isDifferentIdentifier, isFileIdentifier, RECEN
26
26
  import { MediaViewer } from '@atlaskit/media-viewer';
27
27
  import { injectIntl, IntlProvider } from 'react-intl-next';
28
28
  import { CardView } from '../cardView';
29
- import { ABS_VIEWPORT_ANCHOR_OFFSET_TOP, ViewportDetector, ViewportAnchor } from '../../utils/viewportDetector';
29
+ import { ViewportDetector } from '../../utils/viewportDetector';
30
30
  import { getRequestedDimensions } from '../../utils/getDataURIDimension';
31
31
  import { getCardPreview, getCardPreviewFromCache, removeCardPreviewFromCache, getFilePreviewFromFileState, shouldResolvePreview, getSSRCardPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, fetchAndCacheRemotePreview } from './getCardPreview';
32
32
  import { getFileDetails } from '../../utils/metadata';
@@ -43,7 +43,7 @@ import { getMediaCardCursor } from '../../utils/getMediaCardCursor';
43
43
  import { completeUfoExperience, startUfoExperience } from '../../utils/ufoExperiences';
44
44
  import { generateUniqueId } from '../../utils/generateUniqueId';
45
45
  var packageName = "@atlaskit/media-card";
46
- var packageVersion = "74.0.0";
46
+ var packageVersion = "74.1.0";
47
47
  export var CardBase = /*#__PURE__*/function (_Component) {
48
48
  _inherits(CardBase, _Component);
49
49
 
@@ -69,10 +69,6 @@ export var CardBase = /*#__PURE__*/function (_Component) {
69
69
  wasStatusProcessing: false
70
70
  });
71
71
 
72
- _defineProperty(_assertThisInitialized(_this), "viewportPreAnchorRef", /*#__PURE__*/createRef());
73
-
74
- _defineProperty(_assertThisInitialized(_this), "viewportPostAnchorRef", /*#__PURE__*/createRef());
75
-
76
72
  _defineProperty(_assertThisInitialized(_this), "ssrReliability", {
77
73
  server: {
78
74
  status: 'unknown'
@@ -125,7 +121,8 @@ export var CardBase = /*#__PURE__*/function (_Component) {
125
121
  var _this$props2 = _this.props,
126
122
  _this$props2$dimensio = _this$props2.dimensions,
127
123
  dimensions = _this$props2$dimensio === void 0 ? {} : _this$props2$dimensio,
128
- mediaClient = _this$props2.mediaClient;
124
+ mediaClient = _this$props2.mediaClient,
125
+ createAnalyticsEvent = _this$props2.createAnalyticsEvent;
129
126
  return {
130
127
  mediaClient: mediaClient,
131
128
  id: id,
@@ -134,7 +131,9 @@ export var CardBase = /*#__PURE__*/function (_Component) {
134
131
  filePreview: isBannedLocalPreview ? undefined : getFilePreviewFromFileState(fileState),
135
132
  isRemotePreviewReady: isImageRepresentationReady(fileState),
136
133
  imageUrlParams: _this.getImageURLParams(identifier),
137
- mediaBlobUrlAttrs: _this.getMediaBlobUrlAttrs(identifier, fileState)
134
+ mediaBlobUrlAttrs: _this.getMediaBlobUrlAttrs(identifier, fileState),
135
+ createAnalyticsEvent: createAnalyticsEvent,
136
+ featureFlags: _this.props.featureFlags
138
137
  };
139
138
  });
140
139
 
@@ -605,16 +604,8 @@ export var CardBase = /*#__PURE__*/function (_Component) {
605
604
  });
606
605
  return isLazy ? /*#__PURE__*/React.createElement(ViewportDetector, {
607
606
  cardEl: cardRef,
608
- preAnchorRef: _this.viewportPreAnchorRef,
609
- postAnchorRef: _this.viewportPostAnchorRef,
610
607
  onVisible: _this.onCardInViewport
611
- }, /*#__PURE__*/React.createElement(ViewportAnchor, {
612
- ref: _this.viewportPreAnchorRef,
613
- offsetTop: -ABS_VIEWPORT_ANCHOR_OFFSET_TOP
614
- }), card, /*#__PURE__*/React.createElement(ViewportAnchor, {
615
- ref: _this.viewportPostAnchorRef,
616
- offsetTop: ABS_VIEWPORT_ANCHOR_OFFSET_TOP
617
- })) : card;
608
+ }, card) : card;
618
609
  });
619
610
 
620
611
  _defineProperty(_assertThisInitialized(_this), "storeSSRData", function () {
@@ -748,6 +739,8 @@ export var CardBase = /*#__PURE__*/function (_Component) {
748
739
  _createClass(CardBase, [{
749
740
  key: "componentDidMount",
750
741
  value: function componentDidMount() {
742
+ var _getDocument;
743
+
751
744
  this.hasBeenMounted = true;
752
745
  var _this$state3 = this.state,
753
746
  isCardVisible = _this$state3.isCardVisible,
@@ -781,7 +774,7 @@ export var CardBase = /*#__PURE__*/function (_Component) {
781
774
  // won't work in IE11
782
775
 
783
776
 
784
- getDocument().addEventListener('copy', this.fireCopiedEvent);
777
+ (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : _getDocument.addEventListener('copy', this.fireCopiedEvent);
785
778
  }
786
779
  }, {
787
780
  key: "componentDidUpdate",
@@ -876,9 +869,11 @@ export var CardBase = /*#__PURE__*/function (_Component) {
876
869
  }, {
877
870
  key: "componentWillUnmount",
878
871
  value: function componentWillUnmount() {
872
+ var _getDocument2;
873
+
879
874
  this.hasBeenMounted = false;
880
875
  this.unsubscribe();
881
- getDocument().removeEventListener('copy', this.fireCopiedEvent);
876
+ (_getDocument2 = getDocument()) === null || _getDocument2 === void 0 ? void 0 : _getDocument2.removeEventListener('copy', this.fireCopiedEvent);
882
877
  }
883
878
  }, {
884
879
  key: "updateStateForIdentifier",
@@ -15,7 +15,8 @@ var relevantFlags = {
15
15
  observedWidth: true,
16
16
  mediaInline: false,
17
17
  folderUploads: false,
18
- mediaUploadApiV2: true
18
+ mediaUploadApiV2: true,
19
+ memoryCacheLogging: true
19
20
  };
20
21
  export var LOGGED_FEATURE_FLAGS = filterFeatureFlagNames(relevantFlags);
21
22
  export var LOGGED_FEATURE_FLAG_KEYS = filterFeatureFlagKeysAllProducts(relevantFlags);
@@ -64,6 +65,26 @@ export var getRenderSucceededEventPayload = function getRenderSucceededEventPayl
64
65
  }
65
66
  };
66
67
  };
68
+ export var getCacheHitEventPayload = function getCacheHitEventPayload(cardPreviewAttributes) {
69
+ return {
70
+ eventType: 'operational',
71
+ action: 'cache-hit',
72
+ actionSubject: 'mediaCardCache',
73
+ attributes: {
74
+ cardPreviewAttributes: cardPreviewAttributes
75
+ }
76
+ };
77
+ };
78
+ export var getRemoteSuccessEventPayload = function getRemoteSuccessEventPayload(cardPreviewAttributes) {
79
+ return {
80
+ eventType: 'operational',
81
+ action: 'Remote-success',
82
+ actionSubject: 'mediaCardCache',
83
+ attributes: {
84
+ cardPreviewAttributes: cardPreviewAttributes
85
+ }
86
+ };
87
+ };
67
88
  export var getRenderFailedExternalUriPayload = function getRenderFailedExternalUriPayload(fileAttributes, performanceAttributes) {
68
89
  return {
69
90
  eventType: 'operational',
@@ -1,3 +1,11 @@
1
1
  export default (function () {
2
- return document;
2
+ if (typeof window === 'undefined') {
3
+ return;
4
+ }
5
+
6
+ if (typeof window.document === 'undefined') {
7
+ return;
8
+ }
9
+
10
+ return window.document;
3
11
  });
@@ -6,9 +6,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
6
6
 
7
7
  import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
8
8
  import { extractErrorInfo, getRenderErrorRequestMetadata, LOGGED_FEATURE_FLAG_KEYS } from './analytics';
9
+ import { MediaCardError } from '../errors';
9
10
  import { getMediaEnvironment, getMediaRegion } from '@atlaskit/media-client';
10
11
  var packageName = "@atlaskit/media-card";
11
- var packageVersion = "74.0.0";
12
+ var packageVersion = "74.1.0";
12
13
  var concurrentExperience;
13
14
 
14
15
  var getExperience = function getExperience(id) {
@@ -30,7 +31,9 @@ var getExperience = function getExperience(id) {
30
31
  export var startUfoExperience = function startUfoExperience(id) {
31
32
  getExperience(id).start();
32
33
  };
33
- export var completeUfoExperience = function completeUfoExperience(id, status, fileAttributes, fileStateFlags, ssrReliability, error) {
34
+ export var completeUfoExperience = function completeUfoExperience(id, status, fileAttributes, fileStateFlags, ssrReliability) {
35
+ var error = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : new MediaCardError('missing-error-data');
36
+
34
37
  switch (status) {
35
38
  case 'complete':
36
39
  succeedUfoExperience(id, {
@@ -50,7 +53,7 @@ export var completeUfoExperience = function completeUfoExperience(id, status, fi
50
53
  break;
51
54
 
52
55
  case 'error':
53
- error && failUfoExperience(id, _objectSpread(_objectSpread({
56
+ failUfoExperience(id, _objectSpread(_objectSpread({
54
57
  fileAttributes: fileAttributes
55
58
  }, extractErrorInfo(error)), {}, {
56
59
  request: getRenderErrorRequestMetadata(error),