@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,299 @@
|
|
|
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.ExternalImageCard = void 0;
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
var _mediaClient = require("@atlaskit/media-client");
|
|
12
|
+
var _mediaCommon = require("@atlaskit/media-common");
|
|
13
|
+
var _mediaViewer = require("@atlaskit/media-viewer");
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
16
|
+
var _errors = require("../../errors");
|
|
17
|
+
var _document = _interopRequireDefault(require("../../utils/document"));
|
|
18
|
+
var _generateUniqueId = require("../../utils/generateUniqueId");
|
|
19
|
+
var _getMediaCardCursor = require("../../utils/getMediaCardCursor");
|
|
20
|
+
var _ufoExperiences = require("../../utils/ufoExperiences");
|
|
21
|
+
var _useCurrentValueRef = require("../../utils/useCurrentValueRef");
|
|
22
|
+
var _usePrevious = require("../../utils/usePrevious");
|
|
23
|
+
var _cardAnalytics = require("../cardAnalytics");
|
|
24
|
+
var _cardViewV = require("./cardViewV2");
|
|
25
|
+
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); }
|
|
26
|
+
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; }
|
|
27
|
+
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; }
|
|
28
|
+
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; }
|
|
29
|
+
var ExternalImageCard = exports.ExternalImageCard = function ExternalImageCard(_ref) {
|
|
30
|
+
var mediaClient = _ref.mediaClient,
|
|
31
|
+
_ref$appearance = _ref.appearance,
|
|
32
|
+
appearance = _ref$appearance === void 0 ? 'auto' : _ref$appearance,
|
|
33
|
+
_ref$resizeMode = _ref.resizeMode,
|
|
34
|
+
resizeMode = _ref$resizeMode === void 0 ? 'crop' : _ref$resizeMode,
|
|
35
|
+
_ref$disableOverlay = _ref.disableOverlay,
|
|
36
|
+
disableOverlay = _ref$disableOverlay === void 0 ? false : _ref$disableOverlay,
|
|
37
|
+
_ref$featureFlags = _ref.featureFlags,
|
|
38
|
+
featureFlags = _ref$featureFlags === void 0 ? {} : _ref$featureFlags,
|
|
39
|
+
identifier = _ref.identifier,
|
|
40
|
+
dimensions = _ref.dimensions,
|
|
41
|
+
contextId = _ref.contextId,
|
|
42
|
+
alt = _ref.alt,
|
|
43
|
+
actions = _ref.actions,
|
|
44
|
+
shouldOpenMediaViewer = _ref.shouldOpenMediaViewer,
|
|
45
|
+
selectable = _ref.selectable,
|
|
46
|
+
selected = _ref.selected,
|
|
47
|
+
testId = _ref.testId,
|
|
48
|
+
titleBoxBgColor = _ref.titleBoxBgColor,
|
|
49
|
+
titleBoxIcon = _ref.titleBoxIcon,
|
|
50
|
+
shouldHideTooltip = _ref.shouldHideTooltip,
|
|
51
|
+
mediaViewerItems = _ref.mediaViewerItems,
|
|
52
|
+
_onClick = _ref.onClick,
|
|
53
|
+
_onMouseEnter = _ref.onMouseEnter,
|
|
54
|
+
createAnalyticsEvent = _ref.createAnalyticsEvent;
|
|
55
|
+
var internalOccurrenceKey = (0, _react.useMemo)(function () {
|
|
56
|
+
return (0, _generateUniqueId.generateUniqueId)();
|
|
57
|
+
}, []);
|
|
58
|
+
var timeElapsedTillCommenced = (0, _react.useMemo)(function () {
|
|
59
|
+
return performance.now();
|
|
60
|
+
}, []);
|
|
61
|
+
|
|
62
|
+
// Generate unique traceId for file
|
|
63
|
+
var traceContext = (0, _react.useMemo)(function () {
|
|
64
|
+
return {
|
|
65
|
+
traceId: (0, _mediaCommon.getRandomHex)(8)
|
|
66
|
+
};
|
|
67
|
+
}, []);
|
|
68
|
+
var _useState = (0, _react.useState)(null),
|
|
69
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
70
|
+
cardElement = _useState2[0],
|
|
71
|
+
setCardElement = _useState2[1];
|
|
72
|
+
var fileStateFlagsRef = (0, _react.useRef)({
|
|
73
|
+
wasStatusUploading: false,
|
|
74
|
+
wasStatusProcessing: false
|
|
75
|
+
});
|
|
76
|
+
var fireCommencedEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
77
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireCommencedEvent)(createAnalyticsEvent, fileAttributes, {
|
|
78
|
+
overall: {
|
|
79
|
+
durationSincePageStart: timeElapsedTillCommenced
|
|
80
|
+
}
|
|
81
|
+
}, traceContext);
|
|
82
|
+
(0, _ufoExperiences.startUfoExperience)(internalOccurrenceKey);
|
|
83
|
+
});
|
|
84
|
+
var _useState3 = (0, _react.useState)('loading-preview'),
|
|
85
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
86
|
+
status = _useState4[0],
|
|
87
|
+
setStatus = _useState4[1];
|
|
88
|
+
(0, _react.useEffect)(function () {
|
|
89
|
+
fireCommencedEventRef.current();
|
|
90
|
+
setStatus('loading-preview');
|
|
91
|
+
}, [fireCommencedEventRef, identifier]);
|
|
92
|
+
var cardPreview = (0, _react.useMemo)(function () {
|
|
93
|
+
return {
|
|
94
|
+
dataURI: identifier.dataURI,
|
|
95
|
+
orientation: 1,
|
|
96
|
+
source: 'external'
|
|
97
|
+
};
|
|
98
|
+
}, [identifier.dataURI]);
|
|
99
|
+
var metadata = {
|
|
100
|
+
id: identifier.mediaItemType,
|
|
101
|
+
name: identifier.name || identifier.dataURI,
|
|
102
|
+
mediaType: 'image'
|
|
103
|
+
};
|
|
104
|
+
var fileAttributes = {
|
|
105
|
+
fileMediatype: 'image',
|
|
106
|
+
fileId: metadata.id
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// for analytics
|
|
110
|
+
var ssrReliability = {
|
|
111
|
+
server: {
|
|
112
|
+
status: 'unknown'
|
|
113
|
+
},
|
|
114
|
+
client: {
|
|
115
|
+
status: 'unknown'
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
var _useState5 = (0, _react.useState)(false),
|
|
119
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
120
|
+
previewDidRender = _useState6[0],
|
|
121
|
+
setPreviewDidRender = _useState6[1];
|
|
122
|
+
var _useState7 = (0, _react.useState)(),
|
|
123
|
+
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
124
|
+
error = _useState8[0],
|
|
125
|
+
setError = _useState8[1];
|
|
126
|
+
var _useState9 = (0, _react.useState)(null),
|
|
127
|
+
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
128
|
+
mediaViewerSelectedItem = _useState10[0],
|
|
129
|
+
setMediaViewerSelectedItem = _useState10[1];
|
|
130
|
+
|
|
131
|
+
//----------------------------------------------------------------//
|
|
132
|
+
//---------------------- Analytics ------------------------------//
|
|
133
|
+
//----------------------------------------------------------------//
|
|
134
|
+
|
|
135
|
+
var fireOperationalEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
136
|
+
var timeElapsedTillEvent = performance.now();
|
|
137
|
+
var durationSinceCommenced = timeElapsedTillEvent - timeElapsedTillCommenced;
|
|
138
|
+
var performanceAttributes = {
|
|
139
|
+
overall: {
|
|
140
|
+
durationSincePageStart: timeElapsedTillEvent,
|
|
141
|
+
durationSinceCommenced: durationSinceCommenced
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliability, error, traceContext, undefined);
|
|
145
|
+
(0, _ufoExperiences.completeUfoExperience)(internalOccurrenceKey, status, fileAttributes, fileStateFlagsRef.current, ssrReliability, error);
|
|
146
|
+
});
|
|
147
|
+
var fireScreenEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
148
|
+
createAnalyticsEvent && (0, _cardAnalytics.fireScreenEvent)(createAnalyticsEvent, fileAttributes);
|
|
149
|
+
});
|
|
150
|
+
var fireAbortedEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
|
|
151
|
+
// UFO won't abort if it's already in a final state (succeeded, failed, aborted, etc)
|
|
152
|
+
(0, _ufoExperiences.abortUfoExperience)(internalOccurrenceKey, {
|
|
153
|
+
fileAttributes: fileAttributes,
|
|
154
|
+
fileStateFlags: fileStateFlagsRef === null || fileStateFlagsRef === void 0 ? void 0 : fileStateFlagsRef.current,
|
|
155
|
+
ssrReliability: ssrReliability
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
//----------------------------------------------------------------//
|
|
160
|
+
//------------------------ useEffects ----------------------------//
|
|
161
|
+
//----------------------------------------------------------------//
|
|
162
|
+
|
|
163
|
+
(0, _react.useEffect)(function () {
|
|
164
|
+
var _getDocument;
|
|
165
|
+
var fireCopiedCardEvent = function fireCopiedCardEvent() {
|
|
166
|
+
cardElement && createAnalyticsEvent && (0, _cardAnalytics.fireCopiedEvent)(createAnalyticsEvent, metadata.id, cardElement);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// we add a listener for each of the cards on the page
|
|
170
|
+
// and then check if the triggered listener is from the card
|
|
171
|
+
// that contains a div in current window.getSelection()
|
|
172
|
+
// won't work in IE11
|
|
173
|
+
(_getDocument = (0, _document.default)()) === null || _getDocument === void 0 || _getDocument.addEventListener('copy', fireCopiedCardEvent);
|
|
174
|
+
return function () {
|
|
175
|
+
var _getDocument2;
|
|
176
|
+
(_getDocument2 = (0, _document.default)()) === null || _getDocument2 === void 0 || _getDocument2.removeEventListener('copy', fireCopiedCardEvent);
|
|
177
|
+
};
|
|
178
|
+
}, [cardElement, createAnalyticsEvent, metadata.id]);
|
|
179
|
+
var prevStatus = (0, _usePrevious.usePrevious)(status);
|
|
180
|
+
(0, _react.useEffect)(function () {
|
|
181
|
+
if (prevStatus !== undefined && status !== prevStatus) {
|
|
182
|
+
fireOperationalEventRef.current();
|
|
183
|
+
}
|
|
184
|
+
}, [fireOperationalEventRef, prevStatus, status]);
|
|
185
|
+
(0, _react.useEffect)(function () {
|
|
186
|
+
if (previewDidRender && status === 'loading-preview') {
|
|
187
|
+
setStatus('complete');
|
|
188
|
+
}
|
|
189
|
+
}, [previewDidRender, status]);
|
|
190
|
+
(0, _react.useEffect)(function () {
|
|
191
|
+
if (prevStatus !== undefined && status !== prevStatus) {
|
|
192
|
+
if (status === 'complete') {
|
|
193
|
+
fireScreenEventRef.current();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}, [fireScreenEventRef, prevStatus, status]);
|
|
197
|
+
(0, _react.useEffect)(function () {
|
|
198
|
+
return function () {
|
|
199
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
200
|
+
fireAbortedEventRef.current();
|
|
201
|
+
};
|
|
202
|
+
}, [fireAbortedEventRef]);
|
|
203
|
+
|
|
204
|
+
//----------------------------------------------------------------//
|
|
205
|
+
//---------------------- Render Functions ------------------------//
|
|
206
|
+
//----------------------------------------------------------------//
|
|
207
|
+
|
|
208
|
+
var renderMediaViewer = function renderMediaViewer() {
|
|
209
|
+
if (!mediaViewerSelectedItem) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
return /*#__PURE__*/_reactDom.default.createPortal( /*#__PURE__*/_react.default.createElement(_mediaViewer.MediaViewer, {
|
|
213
|
+
collectionName: '',
|
|
214
|
+
items: mediaViewerItems || [],
|
|
215
|
+
mediaClientConfig: mediaClient.config,
|
|
216
|
+
selectedItem: mediaViewerSelectedItem,
|
|
217
|
+
onClose: function onClose() {
|
|
218
|
+
setMediaViewerSelectedItem(null);
|
|
219
|
+
},
|
|
220
|
+
contextId: contextId,
|
|
221
|
+
featureFlags: featureFlags
|
|
222
|
+
}), document.body);
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
//----------------------------------------------------------------//
|
|
226
|
+
//-------------------------- RENDER ------------------------------//
|
|
227
|
+
//----------------------------------------------------------------//
|
|
228
|
+
|
|
229
|
+
var mediaCardCursor = (0, _getMediaCardCursor.getMediaCardCursor)(false, !!shouldOpenMediaViewer, status === 'error', !!cardPreview, metadata.mediaType);
|
|
230
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_cardViewV.CardViewV2, {
|
|
231
|
+
status: status,
|
|
232
|
+
error: error,
|
|
233
|
+
mediaItemType: identifier.mediaItemType,
|
|
234
|
+
metadata: metadata,
|
|
235
|
+
cardPreview: cardPreview,
|
|
236
|
+
alt: alt,
|
|
237
|
+
appearance: appearance,
|
|
238
|
+
resizeMode: resizeMode,
|
|
239
|
+
dimensions: dimensions,
|
|
240
|
+
actions: actions,
|
|
241
|
+
selectable: selectable,
|
|
242
|
+
selected: selected,
|
|
243
|
+
onClick: function onClick(event, analyticsEvent) {
|
|
244
|
+
if (_onClick) {
|
|
245
|
+
var cardEvent = {
|
|
246
|
+
event: event,
|
|
247
|
+
mediaItemDetails: metadata
|
|
248
|
+
};
|
|
249
|
+
_onClick(cardEvent, analyticsEvent);
|
|
250
|
+
}
|
|
251
|
+
if (shouldOpenMediaViewer) {
|
|
252
|
+
setMediaViewerSelectedItem({
|
|
253
|
+
mediaItemType: 'external-image',
|
|
254
|
+
dataURI: identifier.dataURI,
|
|
255
|
+
name: identifier.name
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
onMouseEnter: function onMouseEnter(event) {
|
|
260
|
+
_onMouseEnter === null || _onMouseEnter === void 0 || _onMouseEnter({
|
|
261
|
+
event: event,
|
|
262
|
+
mediaItemDetails: metadata
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
disableOverlay: disableOverlay,
|
|
266
|
+
onDisplayImage: function onDisplayImage() {
|
|
267
|
+
var payloadPart = {
|
|
268
|
+
fileId: identifier.dataURI,
|
|
269
|
+
isUserCollection: false
|
|
270
|
+
};
|
|
271
|
+
_mediaClient.globalMediaEventEmitter.emit('media-viewed', _objectSpread({
|
|
272
|
+
viewingLevel: 'minimal'
|
|
273
|
+
}, payloadPart));
|
|
274
|
+
},
|
|
275
|
+
innerRef: setCardElement,
|
|
276
|
+
testId: testId,
|
|
277
|
+
featureFlags: featureFlags,
|
|
278
|
+
titleBoxBgColor: titleBoxBgColor,
|
|
279
|
+
titleBoxIcon: titleBoxIcon,
|
|
280
|
+
onImageError: function onImageError(newCardPreview) {
|
|
281
|
+
// If the dataURI has been replaced, we can dismiss this error
|
|
282
|
+
if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
var error = new _errors.ImageLoadError(newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.source);
|
|
286
|
+
setStatus('error');
|
|
287
|
+
setError(error);
|
|
288
|
+
},
|
|
289
|
+
onImageLoad: function onImageLoad(newCardPreview) {
|
|
290
|
+
// If the dataURI has been replaced, we can dismiss this callback
|
|
291
|
+
if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
setPreviewDidRender(true);
|
|
295
|
+
},
|
|
296
|
+
mediaCardCursor: mediaCardCursor,
|
|
297
|
+
shouldHideTooltip: shouldHideTooltip
|
|
298
|
+
}), mediaViewerSelectedItem ? renderMediaViewer() : null);
|
|
299
|
+
};
|