@atlaskit/media-card 77.2.3 → 77.4.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.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/card/card.js +1 -1
- package/dist/cjs/card/getCardPreview/cache.js +1 -1
- package/dist/cjs/card/media-card-analytics-error-boundary.js +1 -1
- package/dist/cjs/card/ui/imageRenderer/imageRenderer.js +6 -3
- package/dist/cjs/card/v2/cardV2.js +18 -1037
- package/dist/cjs/card/v2/externalImageCard.js +299 -0
- package/dist/cjs/card/v2/fileCard.js +1001 -0
- package/dist/cjs/errors.js +33 -55
- package/dist/cjs/inline/loader.js +1 -1
- package/dist/cjs/utils/ufoExperiences.js +1 -1
- package/dist/cjs/utils/useCurrentValueRef.js +12 -0
- package/dist/cjs/utils/usePrevious.js +14 -0
- package/dist/es2019/card/card.js +1 -1
- package/dist/es2019/card/getCardPreview/cache.js +2 -0
- package/dist/es2019/card/media-card-analytics-error-boundary.js +1 -1
- package/dist/es2019/card/ui/imageRenderer/imageRenderer.js +6 -3
- package/dist/es2019/card/v2/cardV2.js +17 -1021
- package/dist/es2019/card/v2/externalImageCard.js +261 -0
- package/dist/es2019/card/v2/fileCard.js +881 -0
- package/dist/es2019/errors.js +1 -17
- package/dist/es2019/inline/loader.js +1 -1
- package/dist/es2019/utils/ufoExperiences.js +1 -1
- package/dist/es2019/utils/useCurrentValueRef.js +6 -0
- package/dist/es2019/utils/usePrevious.js +8 -0
- package/dist/esm/card/card.js +1 -1
- package/dist/esm/card/getCardPreview/cache.js +2 -0
- package/dist/esm/card/media-card-analytics-error-boundary.js +1 -1
- package/dist/esm/card/ui/imageRenderer/imageRenderer.js +6 -3
- package/dist/esm/card/v2/cardV2.js +19 -1036
- package/dist/esm/card/v2/externalImageCard.js +289 -0
- package/dist/esm/card/v2/fileCard.js +991 -0
- package/dist/esm/errors.js +31 -55
- package/dist/esm/inline/loader.js +1 -1
- package/dist/esm/utils/ufoExperiences.js +1 -1
- package/dist/esm/utils/useCurrentValueRef.js +6 -0
- package/dist/esm/utils/usePrevious.js +8 -0
- package/dist/types/card/v2/cardV2.d.ts +4 -60
- package/dist/types/card/v2/externalImageCard.d.ts +14 -0
- package/dist/types/card/v2/fileCard.d.ts +19 -0
- package/dist/types/errors.d.ts +1 -7
- package/dist/types/utils/useCurrentValueRef.d.ts +2 -0
- package/dist/types/utils/usePrevious.d.ts +1 -0
- package/dist/types-ts4.5/card/v2/cardV2.d.ts +4 -60
- package/dist/types-ts4.5/card/v2/externalImageCard.d.ts +14 -0
- package/dist/types-ts4.5/card/v2/fileCard.d.ts +19 -0
- package/dist/types-ts4.5/errors.d.ts +1 -7
- package/dist/types-ts4.5/utils/useCurrentValueRef.d.ts +2 -0
- package/dist/types-ts4.5/utils/usePrevious.d.ts +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,1001 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.FileCard = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
14
|
+
var _download = _interopRequireDefault(require("@atlaskit/icon/glyph/download"));
|
|
15
|
+
var _mediaClient = require("@atlaskit/media-client");
|
|
16
|
+
var _mediaClientReact = require("@atlaskit/media-client-react");
|
|
17
|
+
var _mediaCommon = require("@atlaskit/media-common");
|
|
18
|
+
var _mediaUi = require("@atlaskit/media-ui");
|
|
19
|
+
var _mediaViewer = require("@atlaskit/media-viewer");
|
|
20
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
21
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
22
|
+
var _errors = require("../../errors");
|
|
23
|
+
var _analytics = require("../../utils/analytics");
|
|
24
|
+
var _dimensionComparer = require("../../utils/dimensionComparer");
|
|
25
|
+
var _document = _interopRequireDefault(require("../../utils/document"));
|
|
26
|
+
var _generateUniqueId = require("../../utils/generateUniqueId");
|
|
27
|
+
var _getDataURIDimension = require("../../utils/getDataURIDimension");
|
|
28
|
+
var _getMediaCardCursor = require("../../utils/getMediaCardCursor");
|
|
29
|
+
var _globalScope = require("../../utils/globalScope");
|
|
30
|
+
var _metadata = require("../../utils/metadata");
|
|
31
|
+
var _ufoExperiences = require("../../utils/ufoExperiences");
|
|
32
|
+
var _useCurrentValueRef = require("../../utils/useCurrentValueRef");
|
|
33
|
+
var _usePrevious = require("../../utils/usePrevious");
|
|
34
|
+
var _videoIsPlayable = require("../../utils/videoIsPlayable");
|
|
35
|
+
var _videoSnapshot = require("../../utils/videoSnapshot");
|
|
36
|
+
var _viewportDetector = require("../../utils/viewportDetector");
|
|
37
|
+
var _cardAnalytics = require("../cardAnalytics");
|
|
38
|
+
var _getCardPreview = require("../getCardPreview");
|
|
39
|
+
var _cache = _interopRequireDefault(require("../getCardPreview/cache"));
|
|
40
|
+
var _cardViewV = require("./cardViewV2");
|
|
41
|
+
var _inlinePlayerLazyV = require("./inlinePlayerLazyV2");
|
|
42
|
+
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); }
|
|
43
|
+
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; }
|
|
44
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
45
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
46
|
+
var FileCard = exports.FileCard = function FileCard(_ref) {
|
|
47
|
+
var _ssrReliabilityRef$cu;
|
|
48
|
+
var _ref$appearance = _ref.appearance,
|
|
49
|
+
appearance = _ref$appearance === void 0 ? 'auto' : _ref$appearance,
|
|
50
|
+
_ref$resizeMode = _ref.resizeMode,
|
|
51
|
+
resizeMode = _ref$resizeMode === void 0 ? 'crop' : _ref$resizeMode,
|
|
52
|
+
_ref$isLazy = _ref.isLazy,
|
|
53
|
+
isLazy = _ref$isLazy === void 0 ? true : _ref$isLazy,
|
|
54
|
+
_ref$disableOverlay = _ref.disableOverlay,
|
|
55
|
+
disableOverlay = _ref$disableOverlay === void 0 ? false : _ref$disableOverlay,
|
|
56
|
+
_ref$featureFlags = _ref.featureFlags,
|
|
57
|
+
featureFlags = _ref$featureFlags === void 0 ? {} : _ref$featureFlags,
|
|
58
|
+
identifier = _ref.identifier,
|
|
59
|
+
ssr = _ref.ssr,
|
|
60
|
+
mediaClient = _ref.mediaClient,
|
|
61
|
+
dimensions = _ref.dimensions,
|
|
62
|
+
originalDimensions = _ref.originalDimensions,
|
|
63
|
+
contextId = _ref.contextId,
|
|
64
|
+
alt = _ref.alt,
|
|
65
|
+
actions = _ref.actions,
|
|
66
|
+
shouldEnableDownloadButton = _ref.shouldEnableDownloadButton,
|
|
67
|
+
useInlinePlayer = _ref.useInlinePlayer,
|
|
68
|
+
shouldOpenMediaViewer = _ref.shouldOpenMediaViewer,
|
|
69
|
+
onFullscreenChange = _ref.onFullscreenChange,
|
|
70
|
+
selectable = _ref.selectable,
|
|
71
|
+
selected = _ref.selected,
|
|
72
|
+
testId = _ref.testId,
|
|
73
|
+
titleBoxBgColor = _ref.titleBoxBgColor,
|
|
74
|
+
titleBoxIcon = _ref.titleBoxIcon,
|
|
75
|
+
shouldHideTooltip = _ref.shouldHideTooltip,
|
|
76
|
+
mediaViewerItems = _ref.mediaViewerItems,
|
|
77
|
+
onClick = _ref.onClick,
|
|
78
|
+
onMouseEnter = _ref.onMouseEnter,
|
|
79
|
+
createAnalyticsEvent = _ref.createAnalyticsEvent;
|
|
80
|
+
//----------------------------------------------------------------//
|
|
81
|
+
//---------------- State Initializer Functions -------------------//
|
|
82
|
+
//----------------------------------------------------------------//
|
|
83
|
+
|
|
84
|
+
var _useFileState = (0, _mediaClientReact.useFileState)(identifier.id, {
|
|
85
|
+
collectionName: identifier.collectionName,
|
|
86
|
+
occurrenceKey: identifier.occurrenceKey
|
|
87
|
+
}),
|
|
88
|
+
fileState = _useFileState.fileState;
|
|
89
|
+
var prevFileState = (0, _usePrevious.usePrevious)(fileState);
|
|
90
|
+
var fileStateValue = (0, _react.useMemo)(function () {
|
|
91
|
+
if (fileState && (fileState === null || fileState === void 0 ? void 0 : fileState.status) !== 'error') {
|
|
92
|
+
return fileState;
|
|
93
|
+
}
|
|
94
|
+
return prevFileState;
|
|
95
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
+
}, [fileState]);
|
|
97
|
+
var ssrDataRef = (0, _react.useRef)();
|
|
98
|
+
var ssrReliabilityRef = (0, _react.useRef)({
|
|
99
|
+
server: {
|
|
100
|
+
status: 'unknown'
|
|
101
|
+
},
|
|
102
|
+
client: {
|
|
103
|
+
status: 'unknown'
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
var _useState = (0, _react.useState)(null),
|
|
107
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
108
|
+
cardElement = _useState2[0],
|
|
109
|
+
setCardElement = _useState2[1];
|
|
110
|
+
var imageURLParams = (0, _react.useMemo)(function () {
|
|
111
|
+
return _objectSpread(_objectSpread({
|
|
112
|
+
collection: identifier.collectionName,
|
|
113
|
+
mode: resizeMode === 'stretchy-fit' ? 'full-fit' : resizeMode
|
|
114
|
+
}, (0, _getDataURIDimension.getRequestedDimensions)({
|
|
115
|
+
dimensions: dimensions,
|
|
116
|
+
element: cardElement
|
|
117
|
+
})), {}, {
|
|
118
|
+
allowAnimated: true
|
|
119
|
+
});
|
|
120
|
+
}, [cardElement, dimensions, identifier.collectionName, resizeMode]);
|
|
121
|
+
var mediaBlobUrlAttrs = (0, _react.useMemo)(function () {
|
|
122
|
+
var id = identifier.id,
|
|
123
|
+
collection = identifier.collectionName;
|
|
124
|
+
var _getFileDetails = (0, _metadata.getFileDetails)(identifier, fileStateValue),
|
|
125
|
+
mimeType = _getFileDetails.mimeType,
|
|
126
|
+
name = _getFileDetails.name,
|
|
127
|
+
size = _getFileDetails.size;
|
|
128
|
+
return contextId ? _objectSpread(_objectSpread({
|
|
129
|
+
id: id,
|
|
130
|
+
collection: collection,
|
|
131
|
+
contextId: contextId,
|
|
132
|
+
mimeType: mimeType,
|
|
133
|
+
name: name,
|
|
134
|
+
size: size
|
|
135
|
+
}, originalDimensions || (0, _getDataURIDimension.getRequestedDimensions)({
|
|
136
|
+
dimensions: dimensions,
|
|
137
|
+
element: cardElement
|
|
138
|
+
})), {}, {
|
|
139
|
+
alt: alt
|
|
140
|
+
}) : undefined;
|
|
141
|
+
}, [alt, cardElement, contextId, dimensions, fileStateValue, identifier, originalDimensions]);
|
|
142
|
+
var getSSRPreview = function getSSRPreview(ssr, identifier, mediaClient) {
|
|
143
|
+
var _ssrDataRef$current, _ssrDataRef$current2;
|
|
144
|
+
ssrDataRef.current = (0, _globalScope.getSSRData)(identifier);
|
|
145
|
+
if ((_ssrDataRef$current = ssrDataRef.current) !== null && _ssrDataRef$current !== void 0 && _ssrDataRef$current.error) {
|
|
146
|
+
ssrReliabilityRef.current.server = _objectSpread({
|
|
147
|
+
status: 'fail'
|
|
148
|
+
}, ssrDataRef.current.error);
|
|
149
|
+
}
|
|
150
|
+
if (!((_ssrDataRef$current2 = ssrDataRef.current) !== null && _ssrDataRef$current2 !== void 0 && _ssrDataRef$current2.dataURI)) {
|
|
151
|
+
try {
|
|
152
|
+
return (0, _getCardPreview.getSSRCardPreview)(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
|
|
153
|
+
} catch (e) {
|
|
154
|
+
ssrReliabilityRef.current[ssr] = _objectSpread({
|
|
155
|
+
status: 'fail'
|
|
156
|
+
}, (0, _analytics.extractErrorInfo)(e));
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
return {
|
|
160
|
+
dataURI: ssrDataRef.current.dataURI,
|
|
161
|
+
source: 'ssr-data'
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
var cardPreviewInitializer = function cardPreviewInitializer() {
|
|
166
|
+
var cardPreview;
|
|
167
|
+
var id = identifier.id;
|
|
168
|
+
var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
|
|
169
|
+
cardPreview = (0, _getCardPreview.getCardPreviewFromCache)(id, fileImageMode);
|
|
170
|
+
if (!cardPreview && ssr) {
|
|
171
|
+
cardPreview = getSSRPreview(ssr, identifier, mediaClient);
|
|
172
|
+
}
|
|
173
|
+
return cardPreview;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
//----------------------------------------------------------------//
|
|
177
|
+
//------------ State, Refs & Initial Values ----------------------//
|
|
178
|
+
//----------------------------------------------------------------//
|
|
179
|
+
|
|
180
|
+
var internalOccurrenceKey = (0, _react.useMemo)(function () {
|
|
181
|
+
return (0, _generateUniqueId.generateUniqueId)();
|
|
182
|
+
}, []);
|
|
183
|
+
var timeElapsedTillCommenced = (0, _react.useMemo)(function () {
|
|
184
|
+
return performance.now();
|
|
185
|
+
}, []);
|
|
186
|
+
var fileStateFlagsRef = (0, _react.useRef)({
|
|
187
|
+
wasStatusUploading: false,
|
|
188
|
+
wasStatusProcessing: false
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Generate unique traceId for file
|
|
192
|
+
var traceContext = (0, _react.useMemo)(function () {
|
|
193
|
+
return {
|
|
194
|
+
traceId: (0, _mediaCommon.getRandomHex)(8)
|
|
195
|
+
};
|
|
196
|
+
}, []);
|
|
197
|
+
var _useState3 = (0, _react.useState)('loading'),
|
|
198
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
199
|
+
status = _useState4[0],
|
|
200
|
+
setStatus = _useState4[1];
|
|
201
|
+
(0, _react.useEffect)(function () {
|
|
202
|
+
setStatus('loading');
|
|
203
|
+
}, [identifier]);
|
|
204
|
+
var _useState5 = (0, _react.useState)(cardPreviewInitializer),
|
|
205
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
206
|
+
cardPreview = _useState6[0],
|
|
207
|
+
setCardPreview = _useState6[1];
|
|
208
|
+
|
|
209
|
+
// If cardPreview is available from local cache or external, `isCardVisible`
|
|
210
|
+
// should be true to avoid flickers during re-mount of the component
|
|
211
|
+
// should not be visible for SSR preview, otherwise we'll fire the metadata fetch from
|
|
212
|
+
// outside the viewport
|
|
213
|
+
var _useState7 = (0, _react.useState)(function () {
|
|
214
|
+
return !isLazy || !!cardPreview && !(0, _getCardPreview.isSSRPreview)(cardPreview);
|
|
215
|
+
}),
|
|
216
|
+
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
217
|
+
isCardVisible = _useState8[0],
|
|
218
|
+
setIsCardVisible = _useState8[1];
|
|
219
|
+
var _useState9 = (0, _react.useState)(false),
|
|
220
|
+
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
221
|
+
isPlayingFile = _useState10[0],
|
|
222
|
+
setIsPlayingFile = _useState10[1];
|
|
223
|
+
var _useState11 = (0, _react.useState)(false),
|
|
224
|
+
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
|
|
225
|
+
shouldAutoplay = _useState12[0],
|
|
226
|
+
setShouldAutoplay = _useState12[1];
|
|
227
|
+
var _useState13 = (0, _react.useState)(false),
|
|
228
|
+
_useState14 = (0, _slicedToArray2.default)(_useState13, 2),
|
|
229
|
+
isBannedLocalPreview = _useState14[0],
|
|
230
|
+
setIsBannedLocalPreview = _useState14[1];
|
|
231
|
+
var _useState15 = (0, _react.useState)(false),
|
|
232
|
+
_useState16 = (0, _slicedToArray2.default)(_useState15, 2),
|
|
233
|
+
previewDidRender = _useState16[0],
|
|
234
|
+
setPreviewDidRender = _useState16[1];
|
|
235
|
+
var _useState17 = (0, _react.useState)(),
|
|
236
|
+
_useState18 = (0, _slicedToArray2.default)(_useState17, 2),
|
|
237
|
+
error = _useState18[0],
|
|
238
|
+
setError = _useState18[1];
|
|
239
|
+
var wasResolvedUpfrontPreviewRef = (0, _react.useRef)(false);
|
|
240
|
+
var _useState19 = (0, _react.useState)(null),
|
|
241
|
+
_useState20 = (0, _slicedToArray2.default)(_useState19, 2),
|
|
242
|
+
mediaViewerSelectedItem = _useState20[0],
|
|
243
|
+
setMediaViewerSelectedItem = _useState20[1];
|
|
244
|
+
var uploadProgressRef = (0, _react.useRef)();
|
|
245
|
+
var metadata = (0, _react.useMemo)(function () {
|
|
246
|
+
var getProcessingStatusFromFileState = function getProcessingStatusFromFileState(status) {
|
|
247
|
+
switch (status) {
|
|
248
|
+
case 'processed':
|
|
249
|
+
return 'succeeded';
|
|
250
|
+
case 'processing':
|
|
251
|
+
return 'running';
|
|
252
|
+
case 'failed-processing':
|
|
253
|
+
return 'failed';
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
if (fileStateValue && (fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status) !== 'error') {
|
|
257
|
+
return {
|
|
258
|
+
id: fileStateValue.id,
|
|
259
|
+
name: fileStateValue.name,
|
|
260
|
+
size: fileStateValue.size,
|
|
261
|
+
mimeType: fileStateValue.mimeType,
|
|
262
|
+
createdAt: fileStateValue.createdAt,
|
|
263
|
+
mediaType: fileStateValue.mediaType,
|
|
264
|
+
processingStatus: getProcessingStatusFromFileState(fileStateValue.status)
|
|
265
|
+
};
|
|
266
|
+
} else {
|
|
267
|
+
return {
|
|
268
|
+
id: identifier.id
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}, [fileStateValue, identifier.id]);
|
|
272
|
+
var fileAttributes = (0, _react.useMemo)(function () {
|
|
273
|
+
return {
|
|
274
|
+
fileMediatype: metadata.mediaType,
|
|
275
|
+
fileMimetype: metadata.mimeType,
|
|
276
|
+
fileId: metadata.id,
|
|
277
|
+
fileSize: metadata.size,
|
|
278
|
+
fileStatus: fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status
|
|
279
|
+
};
|
|
280
|
+
}, [fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status, metadata.id, metadata.mediaType, metadata.mimeType, metadata.size]);
|
|
281
|
+
var computedActions = (0, _react.useMemo)(function () {
|
|
282
|
+
if (status === 'failed-processing' || shouldEnableDownloadButton) {
|
|
283
|
+
var downloadAction = {
|
|
284
|
+
label: 'Download',
|
|
285
|
+
icon: /*#__PURE__*/_react.default.createElement(_download.default, {
|
|
286
|
+
label: "Download"
|
|
287
|
+
}),
|
|
288
|
+
handler: function handler() {
|
|
289
|
+
return mediaClient.file.downloadBinary(identifier.id, metadata.name, identifier.collectionName);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
return [downloadAction].concat((0, _toConsumableArray2.default)(actions !== null && actions !== void 0 ? actions : []));
|
|
293
|
+
} else {
|
|
294
|
+
return actions;
|
|
295
|
+
}
|
|
296
|
+
}, [actions, identifier.collectionName, identifier.id, mediaClient.file, metadata.name, shouldEnableDownloadButton, status]);
|
|
297
|
+
|
|
298
|
+
//----------------------------------------------------------------//
|
|
299
|
+
//---------------------- Analytics ------------------------------//
|
|
300
|
+
//----------------------------------------------------------------//
|
|
301
|
+
|
|
302
|
+
var fireOperationalEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
303
|
+
var timeElapsedTillEvent = performance.now();
|
|
304
|
+
var durationSinceCommenced = timeElapsedTillEvent - timeElapsedTillCommenced;
|
|
305
|
+
var performanceAttributes = {
|
|
306
|
+
overall: {
|
|
307
|
+
durationSincePageStart: timeElapsedTillEvent,
|
|
308
|
+
durationSinceCommenced: durationSinceCommenced
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliabilityRef.current, error, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
|
|
312
|
+
(0, _ufoExperiences.completeUfoExperience)(internalOccurrenceKey, status, fileAttributes, fileStateFlagsRef.current, ssrReliabilityRef.current, error);
|
|
313
|
+
});
|
|
314
|
+
var fireNonCriticalErrorEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function (error) {
|
|
315
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireNonCriticalErrorEvent)(createAnalyticsEvent, status, fileAttributes, ssrReliabilityRef.current, error, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
|
|
316
|
+
});
|
|
317
|
+
var fireScreenEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
318
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireScreenEvent)(createAnalyticsEvent, fileAttributes);
|
|
319
|
+
});
|
|
320
|
+
var fireCommencedEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
321
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireCommencedEvent)(createAnalyticsEvent, fileAttributes, {
|
|
322
|
+
overall: {
|
|
323
|
+
durationSincePageStart: timeElapsedTillCommenced
|
|
324
|
+
}
|
|
325
|
+
}, traceContext);
|
|
326
|
+
(0, _ufoExperiences.startUfoExperience)(internalOccurrenceKey);
|
|
327
|
+
});
|
|
328
|
+
var fireAbortedEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
329
|
+
// UFO won't abort if it's already in a final state (succeeded, failed, aborted, etc)
|
|
330
|
+
(0, _ufoExperiences.abortUfoExperience)(internalOccurrenceKey, {
|
|
331
|
+
fileAttributes: fileAttributes,
|
|
332
|
+
fileStateFlags: fileStateFlagsRef === null || fileStateFlagsRef === void 0 ? void 0 : fileStateFlagsRef.current,
|
|
333
|
+
ssrReliability: ssrReliabilityRef === null || ssrReliabilityRef === void 0 ? void 0 : ssrReliabilityRef.current
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
//----------------------------------------------------------------//
|
|
338
|
+
//---------------------- Callbacks & Handlers -------------------//
|
|
339
|
+
//----------------------------------------------------------------//
|
|
340
|
+
|
|
341
|
+
var onImageError = function onImageError(newCardPreview) {
|
|
342
|
+
if (newCardPreview) {
|
|
343
|
+
var failedSSRObject = _objectSpread({
|
|
344
|
+
status: 'fail'
|
|
345
|
+
}, (0, _analytics.extractErrorInfo)(new _errors.ImageLoadError(newCardPreview.source)));
|
|
346
|
+
if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview)) {
|
|
347
|
+
ssrReliabilityRef.current.client = failedSSRObject;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/*
|
|
351
|
+
If the cardPreview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview)) {
|
|
355
|
+
ssrReliabilityRef.current.server = failedSSRObject;
|
|
356
|
+
ssrReliabilityRef.current.client = failedSSRObject;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// If the dataURI has been replaced, we can dismiss this error
|
|
361
|
+
if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
var error = new _errors.ImageLoadError(newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.source);
|
|
365
|
+
var isLocal = newCardPreview && (0, _getCardPreview.isLocalPreview)(newCardPreview);
|
|
366
|
+
var isSSR = newCardPreview && ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) || (0, _getCardPreview.isSSRDataPreview)(newCardPreview));
|
|
367
|
+
if (isLocal || isSSR) {
|
|
368
|
+
if (isLocal) {
|
|
369
|
+
setIsBannedLocalPreview(true);
|
|
370
|
+
fireNonCriticalErrorEventRef.current && fireNonCriticalErrorEventRef.current(error);
|
|
371
|
+
}
|
|
372
|
+
var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
|
|
373
|
+
(0, _mediaClient.isFileIdentifier)(identifier) && (0, _getCardPreview.removeCardPreviewFromCache)(identifier.id, fileImageMode);
|
|
374
|
+
setCardPreview(undefined);
|
|
375
|
+
} else {
|
|
376
|
+
if (!['complete', 'error', 'failed-processing'].includes(status)) {
|
|
377
|
+
setStatus('error');
|
|
378
|
+
setError(error);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
var onImageLoad = function onImageLoad(newCardPreview) {
|
|
383
|
+
if (newCardPreview) {
|
|
384
|
+
if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
|
|
385
|
+
ssrReliabilityRef.current.client = {
|
|
386
|
+
status: 'success'
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/*
|
|
391
|
+
If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
|
|
392
|
+
*/
|
|
393
|
+
|
|
394
|
+
if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview) && ssrReliabilityRef.current.server.status === 'unknown') {
|
|
395
|
+
ssrReliabilityRef.current.server = {
|
|
396
|
+
status: 'success'
|
|
397
|
+
};
|
|
398
|
+
ssrReliabilityRef.current.client = {
|
|
399
|
+
status: 'success'
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// If the dataURI has been replaced, we can dismiss this callback
|
|
405
|
+
if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
setPreviewDidRender(true);
|
|
409
|
+
};
|
|
410
|
+
var onCardClick = function onCardClick(event, analyticsEvent) {
|
|
411
|
+
if (onClick) {
|
|
412
|
+
var cardEvent = {
|
|
413
|
+
event: event,
|
|
414
|
+
mediaItemDetails: metadata
|
|
415
|
+
};
|
|
416
|
+
onClick(cardEvent, analyticsEvent);
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
var onCardViewClick = function onCardViewClick(event, analyticsEvent) {
|
|
420
|
+
onCardClick(event, analyticsEvent);
|
|
421
|
+
if (!metadata) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
var isVideo = metadata && metadata.mediaType === 'video';
|
|
425
|
+
if (useInlinePlayer && isVideo && !!cardPreview) {
|
|
426
|
+
setIsPlayingFile(true);
|
|
427
|
+
setShouldAutoplay(true);
|
|
428
|
+
} else if (shouldOpenMediaViewer) {
|
|
429
|
+
setMediaViewerSelectedItem({
|
|
430
|
+
id: identifier.id,
|
|
431
|
+
mediaItemType: 'file',
|
|
432
|
+
collectionName: identifier.collectionName,
|
|
433
|
+
occurrenceKey: identifier.occurrenceKey
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
//----------------------------------------------------------------//
|
|
439
|
+
//---------------------- Helper Functions -----------------------//
|
|
440
|
+
//----------------------------------------------------------------//
|
|
441
|
+
|
|
442
|
+
var fetchRemotePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)(function (identifier) {
|
|
443
|
+
return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, mediaBlobUrlAttrs);
|
|
444
|
+
});
|
|
445
|
+
var resolvePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)( /*#__PURE__*/function () {
|
|
446
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(identifier, fileState) {
|
|
447
|
+
var filePreview, isRemotePreviewReady, mode, cachedPreview, dimensionsAreBigger, localPreview, value, resolvedFilePreview, _value, type, mediaType, orientation, _dataURI, _dataURI2, preview, source, dataURI, remotePreview, wrappedError;
|
|
448
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
449
|
+
while (1) switch (_context.prev = _context.next) {
|
|
450
|
+
case 0:
|
|
451
|
+
filePreview = isBannedLocalPreview ? undefined : fileState.status !== 'error' && 'mimeType' in fileState && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType) ? fileState.preview : undefined;
|
|
452
|
+
isRemotePreviewReady = (0, _mediaClient.isImageRepresentationReady)(fileState);
|
|
453
|
+
_context.prev = 2;
|
|
454
|
+
mode = imageURLParams.mode;
|
|
455
|
+
cachedPreview = _cache.default.get(identifier.id, mode);
|
|
456
|
+
dimensionsAreBigger = (0, _dimensionComparer.isBigger)(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions);
|
|
457
|
+
if (!(cachedPreview && !dimensionsAreBigger)) {
|
|
458
|
+
_context.next = 8;
|
|
459
|
+
break;
|
|
460
|
+
}
|
|
461
|
+
return _context.abrupt("return", cachedPreview);
|
|
462
|
+
case 8:
|
|
463
|
+
_context.prev = 8;
|
|
464
|
+
if (!filePreview) {
|
|
465
|
+
_context.next = 74;
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
_context.prev = 10;
|
|
469
|
+
_context.next = 13;
|
|
470
|
+
return filePreview;
|
|
471
|
+
case 13:
|
|
472
|
+
resolvedFilePreview = _context.sent;
|
|
473
|
+
value = resolvedFilePreview.value;
|
|
474
|
+
_context.next = 20;
|
|
475
|
+
break;
|
|
476
|
+
case 17:
|
|
477
|
+
_context.prev = 17;
|
|
478
|
+
_context.t0 = _context["catch"](10);
|
|
479
|
+
throw new _errors.LocalPreviewError('local-preview-rejected', _context.t0 instanceof Error ? _context.t0 : undefined);
|
|
480
|
+
case 20:
|
|
481
|
+
if (!(typeof value === 'string')) {
|
|
482
|
+
_context.next = 24;
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
localPreview = {
|
|
486
|
+
dataURI: value,
|
|
487
|
+
orientation: 1,
|
|
488
|
+
source: 'local'
|
|
489
|
+
};
|
|
490
|
+
_context.next = 57;
|
|
491
|
+
break;
|
|
492
|
+
case 24:
|
|
493
|
+
if (!(value instanceof Blob)) {
|
|
494
|
+
_context.next = 56;
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
_value = value, type = _value.type;
|
|
498
|
+
mediaType = (0, _mediaCommon.getMediaTypeFromMimeType)(type);
|
|
499
|
+
_context.t1 = mediaType;
|
|
500
|
+
_context.next = _context.t1 === 'image' ? 30 : _context.t1 === 'video' ? 42 : 53;
|
|
501
|
+
break;
|
|
502
|
+
case 30:
|
|
503
|
+
_context.prev = 30;
|
|
504
|
+
_context.next = 33;
|
|
505
|
+
return (0, _mediaUi.getOrientation)(value);
|
|
506
|
+
case 33:
|
|
507
|
+
orientation = _context.sent;
|
|
508
|
+
_dataURI = URL.createObjectURL(value);
|
|
509
|
+
localPreview = {
|
|
510
|
+
dataURI: _dataURI,
|
|
511
|
+
orientation: orientation,
|
|
512
|
+
source: 'local'
|
|
513
|
+
};
|
|
514
|
+
_context.next = 41;
|
|
515
|
+
break;
|
|
516
|
+
case 38:
|
|
517
|
+
_context.prev = 38;
|
|
518
|
+
_context.t2 = _context["catch"](30);
|
|
519
|
+
throw new _errors.LocalPreviewError('local-preview-image', _context.t2 instanceof Error ? _context.t2 : undefined);
|
|
520
|
+
case 41:
|
|
521
|
+
return _context.abrupt("break", 54);
|
|
522
|
+
case 42:
|
|
523
|
+
_context.prev = 42;
|
|
524
|
+
_context.next = 45;
|
|
525
|
+
return (0, _videoSnapshot.takeSnapshot)(value);
|
|
526
|
+
case 45:
|
|
527
|
+
_dataURI2 = _context.sent;
|
|
528
|
+
localPreview = {
|
|
529
|
+
dataURI: _dataURI2,
|
|
530
|
+
orientation: 1,
|
|
531
|
+
source: 'local'
|
|
532
|
+
};
|
|
533
|
+
_context.next = 52;
|
|
534
|
+
break;
|
|
535
|
+
case 49:
|
|
536
|
+
_context.prev = 49;
|
|
537
|
+
_context.t3 = _context["catch"](42);
|
|
538
|
+
throw new _errors.LocalPreviewError('local-preview-video', _context.t3 instanceof Error ? _context.t3 : undefined);
|
|
539
|
+
case 52:
|
|
540
|
+
return _context.abrupt("break", 54);
|
|
541
|
+
case 53:
|
|
542
|
+
throw new _errors.LocalPreviewError('local-preview-unsupported');
|
|
543
|
+
case 54:
|
|
544
|
+
_context.next = 57;
|
|
545
|
+
break;
|
|
546
|
+
case 56:
|
|
547
|
+
throw new _errors.LocalPreviewError('local-preview-unsupported');
|
|
548
|
+
case 57:
|
|
549
|
+
preview = _objectSpread(_objectSpread({}, localPreview), {}, {
|
|
550
|
+
dimensions: dimensions
|
|
551
|
+
});
|
|
552
|
+
_context.t4 = preview.source;
|
|
553
|
+
_context.next = _context.t4 === 'local' ? 61 : _context.t4 === 'remote' ? 63 : _context.t4 === 'ssr-server' ? 65 : _context.t4 === 'ssr-client' ? 67 : 69;
|
|
554
|
+
break;
|
|
555
|
+
case 61:
|
|
556
|
+
source = 'cache-local';
|
|
557
|
+
return _context.abrupt("break", 70);
|
|
558
|
+
case 63:
|
|
559
|
+
source = 'cache-remote';
|
|
560
|
+
return _context.abrupt("break", 70);
|
|
561
|
+
case 65:
|
|
562
|
+
source = 'cache-ssr-server';
|
|
563
|
+
return _context.abrupt("break", 70);
|
|
564
|
+
case 67:
|
|
565
|
+
source = 'cache-ssr-client';
|
|
566
|
+
return _context.abrupt("break", 70);
|
|
567
|
+
case 69:
|
|
568
|
+
source = preview.source;
|
|
569
|
+
case 70:
|
|
570
|
+
// We want to embed some meta context into dataURI for Copy/Paste to work.
|
|
571
|
+
dataURI = mediaBlobUrlAttrs ? (0, _mediaClient.addFileAttrsToUrl)(preview.dataURI, mediaBlobUrlAttrs) : preview.dataURI; // We store new cardPreview into cache
|
|
572
|
+
_cache.default.set(identifier.id, mode, _objectSpread(_objectSpread({}, preview), {}, {
|
|
573
|
+
source: source,
|
|
574
|
+
dataURI: dataURI
|
|
575
|
+
}));
|
|
576
|
+
setCardPreview(_objectSpread(_objectSpread({}, preview), {}, {
|
|
577
|
+
dataURI: dataURI
|
|
578
|
+
}));
|
|
579
|
+
return _context.abrupt("return");
|
|
580
|
+
case 74:
|
|
581
|
+
_context.next = 81;
|
|
582
|
+
break;
|
|
583
|
+
case 76:
|
|
584
|
+
_context.prev = 76;
|
|
585
|
+
_context.t5 = _context["catch"](8);
|
|
586
|
+
/**
|
|
587
|
+
* We report the error if:
|
|
588
|
+
* - local preview is supported and fails
|
|
589
|
+
* - local preview is unsupported and remote preview is NOT READY
|
|
590
|
+
* i.e. the function was called for "no reason".
|
|
591
|
+
* We DON'T report the error if:
|
|
592
|
+
* - local preview is unsupported and remote preview IS READY
|
|
593
|
+
* i.e. local preview is available and not supported,
|
|
594
|
+
* but we are after the remote preview instead.
|
|
595
|
+
*/
|
|
596
|
+
if (!(0, _errors.isUnsupportedLocalPreviewError)(_context.t5) || (0, _errors.isUnsupportedLocalPreviewError)(_context.t5) && !isRemotePreviewReady) {
|
|
597
|
+
fireNonCriticalErrorEventRef.current && fireNonCriticalErrorEventRef.current(_context.t5);
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* No matter the reason why the local preview failed, we break the process
|
|
601
|
+
* if there is no remote preview available
|
|
602
|
+
*/
|
|
603
|
+
if (isRemotePreviewReady) {
|
|
604
|
+
_context.next = 81;
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
throw _context.t5;
|
|
608
|
+
case 81:
|
|
609
|
+
if (isRemotePreviewReady) {
|
|
610
|
+
_context.next = 83;
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
throw new _errors.MediaCardError('remote-preview-not-ready');
|
|
614
|
+
case 83:
|
|
615
|
+
_context.next = 85;
|
|
616
|
+
return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
|
|
617
|
+
case 85:
|
|
618
|
+
remotePreview = _context.sent;
|
|
619
|
+
setCardPreview(remotePreview);
|
|
620
|
+
return _context.abrupt("return");
|
|
621
|
+
case 90:
|
|
622
|
+
_context.prev = 90;
|
|
623
|
+
_context.t6 = _context["catch"](2);
|
|
624
|
+
wrappedError = (0, _errors.ensureMediaCardError)('preview-fetch', _context.t6); // If remote preview fails, we set status 'error'
|
|
625
|
+
// If local preview fails (i.e, no remote preview available),
|
|
626
|
+
// we can stay in the same status until there is a remote preview available
|
|
627
|
+
// If it's any other error we set status 'error'
|
|
628
|
+
if ((0, _errors.isLocalPreviewError)(wrappedError)) {
|
|
629
|
+
// This error should already been logged inside the getCardPreview. No need to log it here.
|
|
630
|
+
setIsBannedLocalPreview(true);
|
|
631
|
+
} else {
|
|
632
|
+
if (!['complete', 'error', 'failed-processing'].includes(status)) {
|
|
633
|
+
setStatus('error');
|
|
634
|
+
setError(wrappedError);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
case 94:
|
|
638
|
+
case "end":
|
|
639
|
+
return _context.stop();
|
|
640
|
+
}
|
|
641
|
+
}, _callee, null, [[2, 90], [8, 76], [10, 17], [30, 38], [42, 49]]);
|
|
642
|
+
}));
|
|
643
|
+
return function (_x, _x2) {
|
|
644
|
+
return _ref2.apply(this, arguments);
|
|
645
|
+
};
|
|
646
|
+
}());
|
|
647
|
+
|
|
648
|
+
//----------------------------------------------------------------//
|
|
649
|
+
//------------ resolveUpfrontPreview useEffect -------------------//
|
|
650
|
+
//----------------------------------------------------------------//
|
|
651
|
+
var prevCardPreview = (0, _usePrevious.usePrevious)(cardPreview);
|
|
652
|
+
var dimensionsRef = (0, _useCurrentValueRef.useCurrentValueRef)(dimensions);
|
|
653
|
+
(0, _react.useEffect)(function () {
|
|
654
|
+
var resolveUpfrontPreview = /*#__PURE__*/function () {
|
|
655
|
+
var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(identifier) {
|
|
656
|
+
var requestedDimensions, newCardPreview, areValidRequestedDimensions;
|
|
657
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
658
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
659
|
+
case 0:
|
|
660
|
+
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
661
|
+
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
662
|
+
wasResolvedUpfrontPreviewRef.current = true;
|
|
663
|
+
_context2.prev = 1;
|
|
664
|
+
requestedDimensions = _objectSpread({}, dimensions);
|
|
665
|
+
_context2.next = 5;
|
|
666
|
+
return fetchRemotePreviewRef.current(identifier);
|
|
667
|
+
case 5:
|
|
668
|
+
newCardPreview = _context2.sent;
|
|
669
|
+
areValidRequestedDimensions = !(0, _dimensionComparer.isBigger)(requestedDimensions, dimensionsRef.current); // If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
|
|
670
|
+
// the fetched preview is no longer valid, and thus, we dismiss it
|
|
671
|
+
if (areValidRequestedDimensions) {
|
|
672
|
+
setCardPreview(newCardPreview);
|
|
673
|
+
}
|
|
674
|
+
_context2.next = 12;
|
|
675
|
+
break;
|
|
676
|
+
case 10:
|
|
677
|
+
_context2.prev = 10;
|
|
678
|
+
_context2.t0 = _context2["catch"](1);
|
|
679
|
+
case 12:
|
|
680
|
+
case "end":
|
|
681
|
+
return _context2.stop();
|
|
682
|
+
}
|
|
683
|
+
}, _callee2, null, [[1, 10]]);
|
|
684
|
+
}));
|
|
685
|
+
return function resolveUpfrontPreview(_x3) {
|
|
686
|
+
return _ref3.apply(this, arguments);
|
|
687
|
+
};
|
|
688
|
+
}();
|
|
689
|
+
var hadSSRCardPreview = ssr === 'client' && !!prevCardPreview && (0, _getCardPreview.isSSRClientPreview)(prevCardPreview);
|
|
690
|
+
if ((isCardVisible || hadSSRCardPreview) && !cardPreview && !wasResolvedUpfrontPreviewRef.current) {
|
|
691
|
+
resolveUpfrontPreview(identifier);
|
|
692
|
+
}
|
|
693
|
+
}, [cardPreview, dimensions, dimensionsRef, fetchRemotePreviewRef, identifier, isCardVisible, prevCardPreview, ssr]);
|
|
694
|
+
|
|
695
|
+
//----------------------------------------------------------------//
|
|
696
|
+
//------------------------ handle fireCopiedEvent --------------//
|
|
697
|
+
//----------------------------------------------------------------//
|
|
698
|
+
|
|
699
|
+
(0, _react.useEffect)(function () {
|
|
700
|
+
var _getDocument;
|
|
701
|
+
var fireCopiedCardEvent = function fireCopiedCardEvent() {
|
|
702
|
+
cardElement && createAnalyticsEvent && (0, _cardAnalytics.fireCopiedEvent)(createAnalyticsEvent, metadata.id, cardElement);
|
|
703
|
+
};
|
|
704
|
+
|
|
705
|
+
// we add a listener for each of the cards on the page
|
|
706
|
+
// and then check if the triggered listener is from the card
|
|
707
|
+
// that contains a div in current window.getSelection()
|
|
708
|
+
// won't work in IE11
|
|
709
|
+
(_getDocument = (0, _document.default)()) === null || _getDocument === void 0 || _getDocument.addEventListener('copy', fireCopiedCardEvent);
|
|
710
|
+
return function () {
|
|
711
|
+
var _getDocument2;
|
|
712
|
+
(_getDocument2 = (0, _document.default)()) === null || _getDocument2 === void 0 || _getDocument2.removeEventListener('copy', fireCopiedCardEvent);
|
|
713
|
+
};
|
|
714
|
+
}, [cardElement, createAnalyticsEvent, metadata.id]);
|
|
715
|
+
|
|
716
|
+
//----------------------------------------------------------------//
|
|
717
|
+
//----------------- update status flags --------------------------//
|
|
718
|
+
//----------------------------------------------------------------//
|
|
719
|
+
|
|
720
|
+
(0, _react.useEffect)(function () {
|
|
721
|
+
if ((fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status) === 'processing') {
|
|
722
|
+
fileStateFlagsRef.current.wasStatusProcessing = true;
|
|
723
|
+
} else if ((fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status) === 'uploading') {
|
|
724
|
+
fileStateFlagsRef.current.wasStatusUploading = true;
|
|
725
|
+
}
|
|
726
|
+
}, [fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status]);
|
|
727
|
+
|
|
728
|
+
//----------------------------------------------------------------//
|
|
729
|
+
//---------------- fetch and resolve card preview ----------------//
|
|
730
|
+
//----------------------------------------------------------------//
|
|
731
|
+
|
|
732
|
+
var prevDimensions = (0, _usePrevious.usePrevious)(dimensions);
|
|
733
|
+
var prevIsCardVisible = (0, _usePrevious.usePrevious)(isCardVisible);
|
|
734
|
+
var prevStatus = (0, _usePrevious.usePrevious)(status);
|
|
735
|
+
(0, _react.useEffect)(function () {
|
|
736
|
+
if (prevStatus !== undefined && status !== prevStatus) {
|
|
737
|
+
fireOperationalEventRef.current();
|
|
738
|
+
}
|
|
739
|
+
}, [fireOperationalEventRef, prevStatus, status]);
|
|
740
|
+
(0, _react.useEffect)(function () {
|
|
741
|
+
var _ssrDataRef$current3;
|
|
742
|
+
/**
|
|
743
|
+
* Variable turnedVisible should only be true when media card
|
|
744
|
+
* was invisible in the previous state and is visible in the current one
|
|
745
|
+
*
|
|
746
|
+
* prevIsCardVisible | isCardVisible | turnedVisible
|
|
747
|
+
* ----------------------------------------------------
|
|
748
|
+
* false | false | false
|
|
749
|
+
* false | true | true
|
|
750
|
+
* true | true | false
|
|
751
|
+
* true | false | false (unreachable case)
|
|
752
|
+
* ----------------------------------------------------
|
|
753
|
+
*/
|
|
754
|
+
|
|
755
|
+
var turnedVisible = !prevIsCardVisible && isCardVisible;
|
|
756
|
+
if (turnedVisible) {
|
|
757
|
+
fireCommencedEventRef.current();
|
|
758
|
+
}
|
|
759
|
+
if (cardPreview && turnedVisible && (0, _getCardPreview.isSSRDataPreview)(cardPreview) && (0, _dimensionComparer.isBigger)((_ssrDataRef$current3 = ssrDataRef.current) === null || _ssrDataRef$current3 === void 0 ? void 0 : _ssrDataRef$current3.dimensions, dimensions)) {
|
|
760
|
+
// If dimensions from Server have changed and are bigger,
|
|
761
|
+
// we need to refetch
|
|
762
|
+
// refetchSRRPreview
|
|
763
|
+
fetchRemotePreviewRef.current(identifier).then(setCardPreview).catch(function (e) {
|
|
764
|
+
var wrappedError = (0, _errors.ensureMediaCardError)('remote-preview-fetch-ssr', e, true);
|
|
765
|
+
fireNonCriticalErrorEventRef.current(wrappedError);
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
if (fileStateValue && (0, _getCardPreview.shouldResolvePreview)({
|
|
769
|
+
status: status,
|
|
770
|
+
fileState: fileStateValue,
|
|
771
|
+
prevDimensions: prevDimensions,
|
|
772
|
+
dimensions: dimensions,
|
|
773
|
+
hasCardPreview: !!cardPreview,
|
|
774
|
+
isBannedLocalPreview: isBannedLocalPreview,
|
|
775
|
+
wasResolvedUpfrontPreview: wasResolvedUpfrontPreviewRef.current
|
|
776
|
+
})) {
|
|
777
|
+
resolvePreviewRef.current(identifier, fileStateValue);
|
|
778
|
+
}
|
|
779
|
+
if (turnedVisible && ssr && !!cardPreview && (0, _getCardPreview.isSSRClientPreview)(cardPreview)) {
|
|
780
|
+
// Since the SSR preview brings the token in the query params,
|
|
781
|
+
// We need to fetch the remote preview to be able to cache it,
|
|
782
|
+
fetchRemotePreviewRef.current(identifier).catch(function () {
|
|
783
|
+
// No need to log this error.
|
|
784
|
+
// If preview fails, it will be refetched later
|
|
785
|
+
//TODO: test this catch
|
|
786
|
+
// https://product-fabric.atlassian.net/browse/MEX-1071
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
}, [cardPreview, dimensions, fetchRemotePreviewRef, fileStateValue, fireCommencedEventRef, fireNonCriticalErrorEventRef, identifier, isBannedLocalPreview, isCardVisible, prevDimensions, prevIsCardVisible, resolvePreviewRef, ssr, status]);
|
|
790
|
+
|
|
791
|
+
//----------------------------------------------------------------//
|
|
792
|
+
//----------------- set complete status --------------------------//
|
|
793
|
+
//----------------------------------------------------------------//
|
|
794
|
+
|
|
795
|
+
(0, _react.useEffect)(function () {
|
|
796
|
+
if (previewDidRender &&
|
|
797
|
+
// We should't complete if status is uploading
|
|
798
|
+
['loading-preview', 'processing'].includes(status)) {
|
|
799
|
+
setStatus('complete');
|
|
800
|
+
// TODO MEX-788: add test for "do not remove the card preview when unsubscribing".
|
|
801
|
+
setIsBannedLocalPreview(false);
|
|
802
|
+
}
|
|
803
|
+
}, [previewDidRender, status]);
|
|
804
|
+
|
|
805
|
+
//----------------------------------------------------------------//
|
|
806
|
+
//----------------- set isPlayingFile state ----------------------//
|
|
807
|
+
//----------------------------------------------------------------//
|
|
808
|
+
|
|
809
|
+
(0, _react.useEffect)(function () {
|
|
810
|
+
var isVideo = fileAttributes.fileMediatype === 'video';
|
|
811
|
+
var _getFileDetails2 = (0, _metadata.getFileDetails)(identifier, fileStateValue),
|
|
812
|
+
mimeType = _getFileDetails2.mimeType;
|
|
813
|
+
var isVideoPlayable = (0, _videoIsPlayable.videoIsPlayable)(isBannedLocalPreview, fileStateValue, mimeType);
|
|
814
|
+
if (isVideo && !isPlayingFile && disableOverlay && useInlinePlayer && isVideoPlayable) {
|
|
815
|
+
setIsPlayingFile(true);
|
|
816
|
+
}
|
|
817
|
+
}, [disableOverlay, fileAttributes.fileMediatype, fileStateValue, identifier, isBannedLocalPreview, isPlayingFile, useInlinePlayer]);
|
|
818
|
+
|
|
819
|
+
//----------------------------------------------------------------//
|
|
820
|
+
//----------------- fireScreenEvent ------------------------------//
|
|
821
|
+
//----------------------------------------------------------------//
|
|
822
|
+
|
|
823
|
+
(0, _react.useEffect)(function () {
|
|
824
|
+
if (prevStatus !== undefined && status !== prevStatus) {
|
|
825
|
+
if (status === 'complete' || fileAttributes.fileMediatype === 'video' && !!cardPreview && status === 'processing') {
|
|
826
|
+
fireScreenEventRef.current();
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}, [status, prevStatus, fileAttributes, cardPreview, fireScreenEventRef]);
|
|
830
|
+
|
|
831
|
+
//----------------------------------------------------------------//
|
|
832
|
+
//----------------- abort UFO experience -------------------------//
|
|
833
|
+
//----------------------------------------------------------------//
|
|
834
|
+
|
|
835
|
+
(0, _react.useEffect)(function () {
|
|
836
|
+
return function () {
|
|
837
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
838
|
+
fireAbortedEventRef.current();
|
|
839
|
+
};
|
|
840
|
+
}, [fireAbortedEventRef]);
|
|
841
|
+
|
|
842
|
+
//----------------------------------------------------------------//
|
|
843
|
+
//------------------ Subscribe to file state ---------------------//
|
|
844
|
+
//----------------------------------------------------------------//
|
|
845
|
+
|
|
846
|
+
var updateFileStateRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
847
|
+
if (fileState) {
|
|
848
|
+
// do not update the card status if the status is final
|
|
849
|
+
if (['complete', 'error', 'failed-processing'].includes(status)) {
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
if (fileState.status !== 'error') {
|
|
853
|
+
var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
|
|
854
|
+
var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
|
|
855
|
+
var isPreviewableFileState = !!fileState.preview;
|
|
856
|
+
var isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
|
|
857
|
+
var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType);
|
|
858
|
+
var hasRemotePreview = (0, _mediaClient.isImageRepresentationReady)(fileState);
|
|
859
|
+
var hasPreview = hasLocalPreview || hasRemotePreview;
|
|
860
|
+
var newStatus;
|
|
861
|
+
switch (fileState.status) {
|
|
862
|
+
case 'uploading':
|
|
863
|
+
case 'failed-processing':
|
|
864
|
+
case 'processing':
|
|
865
|
+
newStatus = fileState.status;
|
|
866
|
+
break;
|
|
867
|
+
case 'processed':
|
|
868
|
+
if (!isPreviewable || !hasPreview) {
|
|
869
|
+
newStatus = 'complete';
|
|
870
|
+
break;
|
|
871
|
+
}
|
|
872
|
+
newStatus = 'loading-preview';
|
|
873
|
+
break;
|
|
874
|
+
default:
|
|
875
|
+
newStatus = 'loading';
|
|
876
|
+
}
|
|
877
|
+
var newProgress = newStatus === 'uploading' && fileState.status === 'uploading' ? fileState.progress : 1;
|
|
878
|
+
setStatus(newStatus);
|
|
879
|
+
uploadProgressRef.current = newProgress;
|
|
880
|
+
} else {
|
|
881
|
+
var e = new _mediaClientReact.MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
|
|
882
|
+
var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
|
|
883
|
+
setError(new _errors.MediaCardError(errorReason, e));
|
|
884
|
+
setStatus('error');
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
});
|
|
888
|
+
(0, _react.useEffect)(function () {
|
|
889
|
+
updateFileStateRef.current();
|
|
890
|
+
}, [fileState, updateFileStateRef]);
|
|
891
|
+
|
|
892
|
+
//----------------------------------------------------------------//
|
|
893
|
+
//---------------------- Render Card Function --------------------//
|
|
894
|
+
//----------------------------------------------------------------//
|
|
895
|
+
|
|
896
|
+
var renderCard = function renderCard() {
|
|
897
|
+
var withCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
898
|
+
var cardStatusOverride = arguments.length > 1 ? arguments[1] : undefined;
|
|
899
|
+
var izLazyOverride = arguments.length > 2 ? arguments[2] : undefined;
|
|
900
|
+
var mediaItemType = identifier.mediaItemType;
|
|
901
|
+
var isLazyWithOverride = izLazyOverride === undefined ? isLazy : izLazyOverride;
|
|
902
|
+
|
|
903
|
+
// Card can be artificially turned visible before entering the viewport
|
|
904
|
+
// For example, when we have the image in cache
|
|
905
|
+
var nativeLazyLoad = isLazyWithOverride && !isCardVisible;
|
|
906
|
+
// Force Media Image to always display img for SSR
|
|
907
|
+
var forceSyncDisplay = !!ssr;
|
|
908
|
+
var mediaCardCursor = (0, _getMediaCardCursor.getMediaCardCursor)(!!useInlinePlayer, !!shouldOpenMediaViewer, status === 'error' || status === 'failed-processing', !!cardPreview, metadata.mediaType);
|
|
909
|
+
var card = /*#__PURE__*/_react.default.createElement(_cardViewV.CardViewV2, {
|
|
910
|
+
status: cardStatusOverride || status,
|
|
911
|
+
error: error,
|
|
912
|
+
mediaItemType: mediaItemType,
|
|
913
|
+
metadata: metadata,
|
|
914
|
+
cardPreview: cardPreview,
|
|
915
|
+
alt: alt,
|
|
916
|
+
appearance: appearance,
|
|
917
|
+
resizeMode: resizeMode,
|
|
918
|
+
dimensions: dimensions,
|
|
919
|
+
actions: computedActions,
|
|
920
|
+
selectable: selectable,
|
|
921
|
+
selected: selected,
|
|
922
|
+
onClick: withCallbacks ? onCardViewClick : undefined,
|
|
923
|
+
onMouseEnter: withCallbacks ? function (event) {
|
|
924
|
+
onMouseEnter === null || onMouseEnter === void 0 || onMouseEnter({
|
|
925
|
+
event: event,
|
|
926
|
+
mediaItemDetails: metadata
|
|
927
|
+
});
|
|
928
|
+
} : undefined,
|
|
929
|
+
disableOverlay: disableOverlay,
|
|
930
|
+
progress: uploadProgressRef.current,
|
|
931
|
+
onDisplayImage: withCallbacks ? function () {
|
|
932
|
+
var payloadPart = {
|
|
933
|
+
fileId: identifier.id,
|
|
934
|
+
isUserCollection: identifier.collectionName === _mediaClient.RECENTS_COLLECTION
|
|
935
|
+
};
|
|
936
|
+
_mediaClient.globalMediaEventEmitter.emit('media-viewed', _objectSpread({
|
|
937
|
+
viewingLevel: 'minimal'
|
|
938
|
+
}, payloadPart));
|
|
939
|
+
} : undefined,
|
|
940
|
+
innerRef: setCardElement,
|
|
941
|
+
testId: testId,
|
|
942
|
+
featureFlags: featureFlags,
|
|
943
|
+
titleBoxBgColor: titleBoxBgColor,
|
|
944
|
+
titleBoxIcon: titleBoxIcon,
|
|
945
|
+
onImageError: withCallbacks ? onImageError : undefined,
|
|
946
|
+
onImageLoad: withCallbacks ? onImageLoad : undefined,
|
|
947
|
+
nativeLazyLoad: nativeLazyLoad,
|
|
948
|
+
forceSyncDisplay: forceSyncDisplay,
|
|
949
|
+
mediaCardCursor: mediaCardCursor,
|
|
950
|
+
shouldHideTooltip: shouldHideTooltip
|
|
951
|
+
});
|
|
952
|
+
return isLazyWithOverride ? /*#__PURE__*/_react.default.createElement(_viewportDetector.ViewportDetector, {
|
|
953
|
+
cardEl: cardElement,
|
|
954
|
+
onVisible: function onVisible() {
|
|
955
|
+
setIsCardVisible(true);
|
|
956
|
+
}
|
|
957
|
+
}, card) : card;
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
//----------------------------------------------------------------//
|
|
961
|
+
//-------------------------- RENDER ------------------------------//
|
|
962
|
+
//----------------------------------------------------------------//
|
|
963
|
+
|
|
964
|
+
var inlinePlayerFallback = renderCard(false, 'loading', false);
|
|
965
|
+
var collectionName = identifier.collectionName || '';
|
|
966
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPlayingFile ? /*#__PURE__*/_react.default.createElement(_react.Suspense, {
|
|
967
|
+
fallback: inlinePlayerFallback
|
|
968
|
+
}, /*#__PURE__*/_react.default.createElement(_inlinePlayerLazyV.InlinePlayerLazyV2, {
|
|
969
|
+
dimensions: dimensions,
|
|
970
|
+
originalDimensions: originalDimensions,
|
|
971
|
+
identifier: identifier,
|
|
972
|
+
autoplay: !!shouldAutoplay,
|
|
973
|
+
onFullscreenChange: onFullscreenChange,
|
|
974
|
+
onError: function onError() {
|
|
975
|
+
setIsPlayingFile(false);
|
|
976
|
+
},
|
|
977
|
+
onClick: onCardClick,
|
|
978
|
+
selected: selected,
|
|
979
|
+
ref: setCardElement,
|
|
980
|
+
testId: testId,
|
|
981
|
+
cardPreview: cardPreview
|
|
982
|
+
})) : renderCard(), mediaViewerSelectedItem ? /*#__PURE__*/_reactDom.default.createPortal( /*#__PURE__*/_react.default.createElement(_mediaViewer.MediaViewer, {
|
|
983
|
+
collectionName: collectionName,
|
|
984
|
+
items: mediaViewerItems || [],
|
|
985
|
+
mediaClientConfig: mediaClient.config,
|
|
986
|
+
selectedItem: mediaViewerSelectedItem,
|
|
987
|
+
onClose: function onClose() {
|
|
988
|
+
setMediaViewerSelectedItem(null);
|
|
989
|
+
},
|
|
990
|
+
contextId: contextId,
|
|
991
|
+
featureFlags: featureFlags
|
|
992
|
+
}), document.body) : null, ssr === 'server' && /*#__PURE__*/_react.default.createElement(_globalScope.StoreSSRDataScript, {
|
|
993
|
+
identifier: identifier,
|
|
994
|
+
dataURI: cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI,
|
|
995
|
+
dimensions: (0, _getDataURIDimension.getRequestedDimensions)({
|
|
996
|
+
dimensions: dimensions,
|
|
997
|
+
element: cardElement
|
|
998
|
+
}),
|
|
999
|
+
error: ((_ssrReliabilityRef$cu = ssrReliabilityRef.current.server) === null || _ssrReliabilityRef$cu === void 0 ? void 0 : _ssrReliabilityRef$cu.status) === 'fail' ? ssrReliabilityRef.current.server : undefined
|
|
1000
|
+
}));
|
|
1001
|
+
};
|