@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.
- package/CHANGELOG.md +26 -0
- package/dist/cjs/errors.js +4 -0
- package/dist/cjs/root/card/cardAnalytics.js +6 -2
- package/dist/cjs/root/card/getCardPreview/index.js +47 -20
- package/dist/cjs/root/card/imageRefetchingAnalytics.js +45 -0
- package/dist/cjs/root/card/index.js +35 -29
- package/dist/cjs/root/inlinePlayerLazy.js +48 -0
- package/dist/cjs/utils/analytics.js +29 -2
- package/dist/cjs/utils/document.js +9 -1
- package/dist/cjs/utils/ufoExperiences.js +7 -3
- package/dist/cjs/utils/viewportDetector.js +11 -36
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/errors.js +4 -0
- package/dist/es2019/root/card/cardAnalytics.js +3 -2
- package/dist/es2019/root/card/getCardPreview/index.js +27 -2
- package/dist/es2019/root/card/imageRefetchingAnalytics.js +30 -0
- package/dist/es2019/root/card/index.js +32 -33
- package/dist/es2019/root/inlinePlayerLazy.js +11 -0
- package/dist/es2019/utils/analytics.js +18 -1
- package/dist/es2019/utils/document.js +11 -1
- package/dist/es2019/utils/ufoExperiences.js +4 -3
- package/dist/es2019/utils/viewportDetector.js +9 -36
- package/dist/es2019/version.json +1 -1
- package/dist/esm/errors.js +4 -0
- package/dist/esm/root/card/cardAnalytics.js +5 -2
- package/dist/esm/root/card/getCardPreview/index.js +47 -20
- package/dist/esm/root/card/imageRefetchingAnalytics.js +32 -0
- package/dist/esm/root/card/index.js +37 -33
- package/dist/esm/root/inlinePlayerLazy.js +29 -0
- package/dist/esm/utils/analytics.js +22 -1
- package/dist/esm/utils/document.js +9 -1
- package/dist/esm/utils/ufoExperiences.js +6 -3
- package/dist/esm/utils/viewportDetector.js +9 -36
- package/dist/esm/version.json +1 -1
- package/dist/types/errors.d.ts +5 -1
- package/dist/types/root/card/cardAnalytics.d.ts +1 -1
- package/dist/types/root/card/getCardPreview/index.d.ts +4 -1
- package/dist/types/root/card/imageRefetchingAnalytics.d.ts +10 -0
- package/dist/types/root/card/index.d.ts +2 -4
- package/dist/types/root/inlinePlayerLazy.d.ts +2 -0
- package/dist/types/utils/analytics.d.ts +17 -1
- package/dist/types/utils/document.d.ts +1 -1
- package/dist/types/utils/ufoExperiences.d.ts +1 -1
- package/dist/types/utils/viewportDetector.d.ts +0 -10
- 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 =
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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,
|
|
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
|
};
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/errors.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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 {
|
|
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.
|
|
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
|
-
|
|
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;
|
|
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 =
|
|
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
|
|
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
|
-
},
|
|
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,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.
|
|
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
|
-
|
|
48
|
+
failUfoExperience(id, {
|
|
48
49
|
fileAttributes,
|
|
49
50
|
...extractErrorInfo(error),
|
|
50
51
|
request: getRenderErrorRequestMetadata(error),
|
|
@@ -1,27 +1,6 @@
|
|
|
1
|
-
import React, { useEffect
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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,
|
|
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
|
};
|
package/dist/es2019/version.json
CHANGED
package/dist/esm/errors.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
20
|
+
fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error, ssrReliability));
|
|
18
21
|
break;
|
|
19
22
|
}
|
|
20
23
|
};
|