@atlaskit/media-viewer 48.2.14 → 48.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/analytics/events/screen/passwordPdf.js +14 -0
  3. package/dist/cjs/analytics/events/screen/pdfPasswordInput.js +14 -0
  4. package/dist/cjs/analytics/index.js +1 -1
  5. package/dist/cjs/analytics/ufoExperiences.js +1 -1
  6. package/dist/cjs/domain/outcome.js +5 -22
  7. package/dist/cjs/item-viewer.js +23 -17
  8. package/dist/cjs/media-viewer.js +2 -1
  9. package/dist/cjs/navigation.js +4 -2
  10. package/dist/cjs/v2/item-viewer-v2.js +10 -10
  11. package/dist/cjs/viewers/doc/index.js +50 -67
  12. package/dist/cjs/viewers/doc/pdfPasswordInput.js +100 -0
  13. package/dist/cjs/viewers/doc/pdfRenderer.js +114 -21
  14. package/dist/cjs/viewers/image/index.js +17 -17
  15. package/dist/es2019/analytics/events/screen/passwordPdf.js +6 -0
  16. package/dist/es2019/analytics/events/screen/pdfPasswordInput.js +6 -0
  17. package/dist/es2019/analytics/index.js +1 -1
  18. package/dist/es2019/analytics/ufoExperiences.js +1 -1
  19. package/dist/es2019/domain/outcome.js +5 -18
  20. package/dist/es2019/item-viewer.js +14 -9
  21. package/dist/es2019/media-viewer.js +2 -1
  22. package/dist/es2019/navigation.js +4 -2
  23. package/dist/es2019/v2/item-viewer-v2.js +10 -10
  24. package/dist/es2019/viewers/doc/index.js +20 -17
  25. package/dist/es2019/viewers/doc/pdfPasswordInput.js +85 -0
  26. package/dist/es2019/viewers/doc/pdfRenderer.js +98 -75
  27. package/dist/es2019/viewers/image/index.js +4 -4
  28. package/dist/esm/analytics/events/screen/passwordPdf.js +8 -0
  29. package/dist/esm/analytics/events/screen/pdfPasswordInput.js +8 -0
  30. package/dist/esm/analytics/index.js +1 -1
  31. package/dist/esm/analytics/ufoExperiences.js +1 -1
  32. package/dist/esm/domain/outcome.js +5 -22
  33. package/dist/esm/item-viewer.js +23 -17
  34. package/dist/esm/media-viewer.js +2 -1
  35. package/dist/esm/navigation.js +4 -2
  36. package/dist/esm/v2/item-viewer-v2.js +10 -10
  37. package/dist/esm/viewers/doc/index.js +50 -62
  38. package/dist/esm/viewers/doc/pdfPasswordInput.js +90 -0
  39. package/dist/esm/viewers/doc/pdfRenderer.js +115 -22
  40. package/dist/esm/viewers/image/index.js +18 -18
  41. package/dist/types/analytics/events/index.d.ts +3 -1
  42. package/dist/types/analytics/events/screen/passwordPdf.d.ts +3 -0
  43. package/dist/types/analytics/events/screen/pdfPasswordInput.d.ts +3 -0
  44. package/dist/types/domain/outcome.d.ts +5 -6
  45. package/dist/types/viewers/doc/index.d.ts +0 -3
  46. package/dist/types/viewers/doc/pdfPasswordInput.d.ts +11 -0
  47. package/dist/types/viewers/doc/pdfRenderer.d.ts +4 -3
  48. package/dist/types-ts4.5/analytics/events/index.d.ts +3 -1
  49. package/dist/types-ts4.5/analytics/events/screen/passwordPdf.d.ts +3 -0
  50. package/dist/types-ts4.5/analytics/events/screen/pdfPasswordInput.d.ts +3 -0
  51. package/dist/types-ts4.5/domain/outcome.d.ts +5 -6
  52. package/dist/types-ts4.5/viewers/doc/index.d.ts +0 -3
  53. package/dist/types-ts4.5/viewers/doc/pdfPasswordInput.d.ts +11 -0
  54. package/dist/types-ts4.5/viewers/doc/pdfRenderer.d.ts +4 -3
  55. package/package.json +16 -7
@@ -11,10 +11,11 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
13
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
15
  var _react = _interopRequireWildcard(require("react"));
16
16
  var _pdf_viewer = require("pdfjs-dist/legacy/web/pdf_viewer");
17
17
  var _pdf = require("pdfjs-dist/legacy/build/pdf");
18
+ var _analyticsNext = require("@atlaskit/analytics-next");
18
19
  var _cmaps = require("./cmaps");
19
20
  var _react2 = require("@emotion/react");
20
21
  var _zoomControls = require("../../zoomControls");
@@ -27,7 +28,10 @@ var _zoomLevel = require("../../domain/zoomLevel");
27
28
  var _processError = require("./processError");
28
29
  var _pdfJs = require("./pdfJs");
29
30
  var _extractCompressedBase = require("./extractCompressedBase64");
30
- var _templateObject;
31
+ var _pdfPasswordInput = require("./pdfPasswordInput");
32
+ var _analytics = require("../../analytics");
33
+ var _pdfPasswordInput2 = require("../../analytics/events/screen/pdfPasswordInput");
34
+ var _passwordPdf = require("../../analytics/events/screen/passwordPdf");
31
35
  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); }
32
36
  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; }
33
37
  var pdfViewerClassName = exports.pdfViewerClassName = 'pdfViewer';
@@ -35,9 +39,58 @@ var pdfViewerClassName = exports.pdfViewerClassName = 'pdfViewer';
35
39
  // Styles are partially copied from https://github.com/mozilla/pdfjs-dist/blob/v2.9.359/web/pdf_viewer.css
36
40
  /* eslint-disable @atlaskit/design-system/ensure-design-token-usage */
37
41
  /* eslint-disable @atlaskit/design-system/ensure-design-token-usage/preview */
38
- var globalStyles = (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n .", " {\n margin-top: ", ";\n margin-bottom: ", ";\n\n .page {\n margin: 1px auto ", " auto;\n border: 9px solid transparent;\n position: relative;\n }\n\n .canvasWrapper {\n overflow: hidden;\n }\n\n .textLayer {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n opacity: 0.2;\n line-height: 1;\n }\n\n .textLayer span,\n .textLayer br {\n color: transparent;\n position: absolute;\n white-space: pre;\n cursor: text;\n transform-origin: 0% 0%;\n }\n\n .textLayer ::-moz-selection {\n background: rgba(0, 0, 255, 1);\n }\n\n .textLayer ::selection {\n background: rgba(0, 0, 255, 1);\n }\n\n .annotationLayer section {\n position: absolute;\n text-align: initial;\n }\n\n .annotationLayer .linkAnnotation > a,\n .annotationLayer .buttonWidgetAnnotation.pushButton > a {\n position: absolute;\n font-size: 1em;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .annotationLayer .linkAnnotation > a:hover,\n .annotationLayer .buttonWidgetAnnotation.pushButton > a:hover {\n opacity: 0.2;\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 2px 10px rgba(255, 255, 0, 1);\n }\n }\n"])), pdfViewerClassName, "var(--ds-space-800, 64px)", "var(--ds-space-800, 64px)", "var(--ds-space-negative-100, -8px)");
39
- /* eslint-enable @atlaskit/design-system/ensure-design-token-usage/preview */
40
- /* eslint-disable @atlaskit/design-system/ensure-design-token-usage */
42
+ var globalStyles = (0, _react2.css)((0, _defineProperty2.default)({}, ".".concat(pdfViewerClassName), {
43
+ marginTop: "var(--ds-space-800, 64px)",
44
+ marginBottom: "var(--ds-space-800, 64px)",
45
+ '.page': {
46
+ margin: "1px auto ".concat("var(--ds-space-negative-100, -8px)", " auto"),
47
+ border: '9px solid transparent',
48
+ position: 'relative'
49
+ },
50
+ '.canvasWrapper': {
51
+ overflow: 'hidden'
52
+ },
53
+ '.textLayer': {
54
+ position: 'absolute',
55
+ left: 0,
56
+ top: 0,
57
+ right: 0,
58
+ bottom: 0,
59
+ overflow: 'hidden',
60
+ opacity: 0.2,
61
+ lineHeight: 1
62
+ },
63
+ '.textLayer span, .textLayer br': {
64
+ color: 'transparent',
65
+ position: 'absolute',
66
+ whiteSpace: 'pre',
67
+ cursor: 'text',
68
+ transformOrigin: '0% 0%'
69
+ },
70
+ '.textLayer ::-moz-selection': {
71
+ background: 'rgba(0, 0, 255, 1)'
72
+ },
73
+ '.textLayer ::selection': {
74
+ background: 'rgba(0, 0, 255, 1)'
75
+ },
76
+ '.annotationLayer section': {
77
+ position: 'absolute',
78
+ textAlign: 'initial'
79
+ },
80
+ '.annotationLayer .linkAnnotation > a, .annotationLayer .buttonWidgetAnnotation.pushButton > a': {
81
+ position: 'absolute',
82
+ fontSize: '1em',
83
+ top: 0,
84
+ left: 0,
85
+ width: '100%',
86
+ height: '100%'
87
+ },
88
+ '.annotationLayer .linkAnnotation > a:hover, .annotationLayer .buttonWidgetAnnotation.pushButton > a:hover': {
89
+ opacity: 0.2,
90
+ background: 'rgba(255, 255, 0, 1)',
91
+ boxShadow: '0 2px 10px rgba(255, 255, 0, 1)'
92
+ }
93
+ }));
41
94
  var CmapFacotry = /*#__PURE__*/function () {
42
95
  function CmapFacotry() {
43
96
  (0, _classCallCheck2.default)(this, CmapFacotry);
@@ -79,13 +132,14 @@ var CmapFacotry = /*#__PURE__*/function () {
79
132
  return CmapFacotry;
80
133
  }();
81
134
  var defaultWorkerUrl = '';
82
- var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
135
+ var PDFRendererBase = function PDFRendererBase(_ref2) {
83
136
  var src = _ref2.src,
84
137
  onClose = _ref2.onClose,
85
138
  onSuccess = _ref2.onSuccess,
86
139
  onError = _ref2.onError,
87
140
  workerUrl = _ref2.workerUrl,
88
- item = _ref2.item;
141
+ item = _ref2.item,
142
+ createAnalyticsEvent = _ref2.createAnalyticsEvent;
89
143
  var _useState = (0, _react.useState)(new _zoomLevel.ZoomLevel(1)),
90
144
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
91
145
  zoomLevel = _useState2[0],
@@ -94,18 +148,28 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
94
148
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
95
149
  docOutcome = _useState4[0],
96
150
  setDocOutcome = _useState4[1];
151
+ var isPasswordPdfRef = (0, _react.useRef)(false);
152
+ var _useState5 = (0, _react.useState)(false),
153
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
154
+ passwordProtected = _useState6[0],
155
+ setPasswordProtected = _useState6[1];
156
+ var _useState7 = (0, _react.useState)(false),
157
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
158
+ hasPasswordError = _useState8[0],
159
+ setHasPasswordError = _useState8[1];
97
160
  var pdfWrapperRef = (0, _react.useRef)();
98
161
  var docRef = (0, _react.useRef)();
99
162
  var pdfViewerRef = (0, _react.useRef)();
100
163
  var onSuccessRef = (0, _react.useRef)(onSuccess);
101
164
  onSuccessRef.current = onSuccess;
165
+ var updatePasswordRef = (0, _react.useRef)(undefined);
102
166
  var onErrorRef = (0, _react.useRef)(onError);
103
167
  onErrorRef.current = onError;
104
168
  (0, _react.useEffect)(function () {
105
169
  var isSubscribed = true;
106
170
  var fetchDoc = /*#__PURE__*/function () {
107
171
  var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
108
- var blob, pdfError;
172
+ var blob, getDocumentTask, pdfError;
109
173
  return _regenerator.default.wrap(function _callee2$(_context2) {
110
174
  while (1) switch (_context2.prev = _context2.next) {
111
175
  case 0:
@@ -121,29 +185,39 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
121
185
  defaultWorkerUrl = URL.createObjectURL(blob);
122
186
  case 6:
123
187
  _pdf.GlobalWorkerOptions.workerSrc = workerUrl !== null && workerUrl !== void 0 ? workerUrl : defaultWorkerUrl;
124
- _context2.next = 9;
125
- return (0, _pdf.getDocument)({
188
+ getDocumentTask = (0, _pdf.getDocument)({
126
189
  url: src,
127
190
  CMapReaderFactory: CmapFacotry
128
- }).promise;
129
- case 9:
191
+ });
192
+ getDocumentTask.onPassword = function (updatePassword, e) {
193
+ updatePasswordRef.current = updatePassword;
194
+ if (e === _pdf.PasswordResponses.NEED_PASSWORD) {
195
+ isPasswordPdfRef.current = true;
196
+ setPasswordProtected(true);
197
+ } else {
198
+ setHasPasswordError(true);
199
+ }
200
+ };
201
+ _context2.next = 11;
202
+ return getDocumentTask.promise;
203
+ case 11:
130
204
  docRef.current = _context2.sent;
131
205
  isSubscribed && setDocOutcome(_domain.Outcome.successful(docRef.current));
132
- _context2.next = 18;
206
+ _context2.next = 20;
133
207
  break;
134
- case 13:
135
- _context2.prev = 13;
208
+ case 15:
209
+ _context2.prev = 15;
136
210
  _context2.t0 = _context2["catch"](0);
137
211
  pdfError = (0, _processError.processError)(_context2.t0);
138
212
  isSubscribed && setDocOutcome(_domain.Outcome.failed(pdfError));
139
213
  if (onErrorRef.current) {
140
214
  onErrorRef.current(pdfError);
141
215
  }
142
- case 18:
216
+ case 20:
143
217
  case "end":
144
218
  return _context2.stop();
145
219
  }
146
- }, _callee2, null, [[0, 13]]);
220
+ }, _callee2, null, [[0, 15]]);
147
221
  }));
148
222
  return function fetchDoc() {
149
223
  return _ref3.apply(this, arguments);
@@ -175,10 +249,13 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
175
249
  pdfViewerRef.current.setDocument(docRef.current);
176
250
  pdfLinkService.setDocument(docRef.current, null);
177
251
  pdfViewerRef.current.firstPagePromise.then(scaleToFit);
252
+ if (isPasswordPdfRef.current) {
253
+ (0, _analytics.fireAnalytics)((0, _passwordPdf.createPasswordPdfScreenEvent)(), createAnalyticsEvent);
254
+ }
178
255
  if (onSuccessRef.current) {
179
256
  onSuccessRef.current();
180
257
  }
181
- }, [docOutcome]);
258
+ }, [createAnalyticsEvent, docOutcome]);
182
259
  var savePdfElement = function savePdfElement(el) {
183
260
  pdfWrapperRef.current = el;
184
261
  };
@@ -194,7 +271,18 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
194
271
  };
195
272
  return docOutcome.match({
196
273
  pending: function pending() {
197
- return /*#__PURE__*/_react.default.createElement(_loading.Spinner, null);
274
+ return passwordProtected ? /*#__PURE__*/_react.default.createElement(_pdfPasswordInput.PDFPasswordInput, {
275
+ onRender: function onRender() {
276
+ return (0, _analytics.fireAnalytics)((0, _pdfPasswordInput2.createPdfPasswordInputScreenEvent)(), createAnalyticsEvent);
277
+ },
278
+ onSubmit: function onSubmit(data) {
279
+ var _updatePasswordRef$cu;
280
+ // Reset hasPasswordError on each submission
281
+ hasPasswordError && setHasPasswordError(false);
282
+ (_updatePasswordRef$cu = updatePasswordRef.current) === null || _updatePasswordRef$cu === void 0 || _updatePasswordRef$cu.call(updatePasswordRef, data.password);
283
+ },
284
+ hasPasswordError: hasPasswordError
285
+ }) : /*#__PURE__*/_react.default.createElement(_loading.Spinner, null);
198
286
  },
199
287
  successful: function successful() {
200
288
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_react2.Global, {
@@ -202,7 +290,10 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
202
290
  }), /*#__PURE__*/_react.default.createElement(_styleWrappers.PDFWrapper, {
203
291
  "data-testid": "media-viewer-pdf-content",
204
292
  ref: savePdfElement
205
- }, /*#__PURE__*/_react.default.createElement("div", {
293
+ },
294
+ /*#__PURE__*/
295
+ // eslint-disable-next-line @atlaskit/design-system/prefer-primitives
296
+ _react.default.createElement("div", {
206
297
  className: pdfViewerClassName,
207
298
  onClick: (0, _closeOnDirectClick.closeOnDirectClick)(onClose)
208
299
  }), /*#__PURE__*/_react.default.createElement(_zoomControls.ZoomControls, {
@@ -219,4 +310,6 @@ var PDFRenderer = exports.PDFRenderer = function PDFRenderer(_ref2) {
219
310
  });
220
311
  }
221
312
  });
222
- };
313
+ };
314
+
315
+ var PDFRenderer = exports.PDFRenderer = (0, _analyticsNext.withAnalyticsEvents)()(PDFRendererBase);
@@ -62,7 +62,7 @@ var ImageViewer = exports.ImageViewer = /*#__PURE__*/function (_BaseViewer) {
62
62
  key: "init",
63
63
  value: function () {
64
64
  var _init = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
65
- var _this$props, fileState, mediaClient, collectionName, traceContext, orientation, objectUrl, originalBinaryImageUrl, isLocalFileReference, preview, _yield$preview, value, origin, item, controller, response, imgError;
65
+ var _this$props, fileState, mediaClient, collectionName, traceContext, controller, orientation, objectUrl, originalBinaryImageUrl, isLocalFileReference, preview, _yield$preview, value, origin, item, response, imgError;
66
66
  return _regenerator.default.wrap(function _callee$(_context) {
67
67
  while (1) switch (_context.prev = _context.next) {
68
68
  case 0:
@@ -73,50 +73,50 @@ var ImageViewer = exports.ImageViewer = /*#__PURE__*/function (_BaseViewer) {
73
73
  }
74
74
  return _context.abrupt("return");
75
75
  case 3:
76
- _context.prev = 3;
76
+ controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined;
77
+ _context.prev = 4;
77
78
  orientation = 1;
78
79
  isLocalFileReference = false;
79
80
  preview = fileState.preview;
80
81
  if (!preview) {
81
- _context.next = 24;
82
+ _context.next = 25;
82
83
  break;
83
84
  }
84
- _context.next = 10;
85
+ _context.next = 11;
85
86
  return preview;
86
- case 10:
87
+ case 11:
87
88
  _yield$preview = _context.sent;
88
89
  value = _yield$preview.value;
89
90
  origin = _yield$preview.origin;
90
91
  if (!(value instanceof Blob)) {
91
- _context.next = 21;
92
+ _context.next = 22;
92
93
  break;
93
94
  }
94
- _context.next = 16;
95
+ _context.next = 17;
95
96
  return (0, _mediaUi.getOrientation)(value);
96
- case 16:
97
+ case 17:
97
98
  orientation = _context.sent;
98
99
  objectUrl = URL.createObjectURL(value);
99
100
  isLocalFileReference = origin === 'local';
100
- _context.next = 22;
101
+ _context.next = 23;
101
102
  break;
102
- case 21:
103
- objectUrl = value;
104
103
  case 22:
104
+ objectUrl = value;
105
+ case 23:
105
106
  _context.next = 38;
106
107
  break;
107
- case 24:
108
+ case 25:
108
109
  if (!(0, _mediaClient.isImageRepresentationReady)(fileState)) {
109
110
  _context.next = 36;
110
111
  break;
111
112
  }
112
113
  item = processedFileStateToMediaItem(fileState);
113
- controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined;
114
114
  response = mediaClient.getImage(item.details.id, {
115
115
  collection: collectionName,
116
116
  mode: 'fit'
117
117
  }, controller, true, traceContext);
118
118
  this.cancelImageFetch = function () {
119
- return controller && controller.abort();
119
+ return controller === null || controller === void 0 ? void 0 : controller.abort();
120
120
  };
121
121
  _context.t0 = URL;
122
122
  _context.next = 32;
@@ -154,9 +154,9 @@ var ImageViewer = exports.ImageViewer = /*#__PURE__*/function (_BaseViewer) {
154
154
  break;
155
155
  case 45:
156
156
  _context.prev = 45;
157
- _context.t2 = _context["catch"](3);
157
+ _context.t2 = _context["catch"](4);
158
158
  // TODO : properly handle aborted requests (MS-2843)
159
- if (!(0, _mediaClient.isAbortedRequestError)(_context.t2)) {
159
+ if (!(controller !== null && controller !== void 0 && controller.signal.aborted)) {
160
160
  imgError = new _errors.MediaViewerError('imageviewer-fetch-url', _context.t2 instanceof Error ? _context.t2 : undefined);
161
161
  this.setState({
162
162
  content: _domain.Outcome.failed(imgError)
@@ -167,7 +167,7 @@ var ImageViewer = exports.ImageViewer = /*#__PURE__*/function (_BaseViewer) {
167
167
  case "end":
168
168
  return _context.stop();
169
169
  }
170
- }, _callee, this, [[3, 45]]);
170
+ }, _callee, this, [[4, 45]]);
171
171
  }));
172
172
  function init() {
173
173
  return _init.apply(this, arguments);
@@ -0,0 +1,6 @@
1
+ export const createPasswordPdfScreenEvent = () => ({
2
+ eventType: 'screen',
3
+ action: 'viewed',
4
+ actionSubject: 'mediaViewerPasswordPdfScreen',
5
+ name: 'mediaViewerPasswordPdfScreen'
6
+ });
@@ -0,0 +1,6 @@
1
+ export const createPdfPasswordInputScreenEvent = () => ({
2
+ eventType: 'screen',
3
+ action: 'viewed',
4
+ actionSubject: 'mediaViewerPdfPasswordInputScreen',
5
+ name: 'mediaViewerPdfPasswordInputScreen'
6
+ });
@@ -1,7 +1,7 @@
1
1
  import { ANALYTICS_MEDIA_CHANNEL } from '@atlaskit/media-common';
2
2
  const componentName = 'mediaViewer';
3
3
  const packageName = "@atlaskit/media-viewer";
4
- const packageVersion = "48.2.14";
4
+ const packageVersion = "48.3.0";
5
5
  export { packageName, packageVersion, componentName, componentName as component };
6
6
  export function getFileAttributes(fileState) {
7
7
  if (!fileState) {
@@ -2,7 +2,7 @@ import { UFOExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atl
2
2
  import { getMediaEnvironment, getMediaRegion } from '@atlaskit/media-client';
3
3
  import { getFeatureFlagKeysAllProducts } from '@atlaskit/media-common';
4
4
  const packageName = "@atlaskit/media-viewer";
5
- const packageVersion = "48.2.14";
5
+ const packageVersion = "48.3.0";
6
6
  let ufoExperience;
7
7
  const getExperience = () => {
8
8
  if (!ufoExperience) {
@@ -13,17 +13,18 @@ export class Outcome {
13
13
  status: 'PENDING'
14
14
  });
15
15
  }
16
- static failed(err) {
16
+ static failed(err, data) {
17
17
  return new Outcome({
18
18
  status: 'FAILED',
19
- err
19
+ err,
20
+ data
20
21
  });
21
22
  }
22
23
  get status() {
23
24
  return this.state.status;
24
25
  }
25
26
  get data() {
26
- if (this.state.status === 'SUCCESSFUL') {
27
+ if (this.state.status === 'SUCCESSFUL' || this.state.status === 'FAILED') {
27
28
  return this.state.data;
28
29
  } else {
29
30
  return;
@@ -62,21 +63,7 @@ export class Outcome {
62
63
  case 'PENDING':
63
64
  return pending();
64
65
  case 'FAILED':
65
- return failed(this.state.err);
66
- }
67
- }
68
- mapSuccessful(map) {
69
- if (this.state.status === 'SUCCESSFUL') {
70
- return Outcome.successful(map(this.state.data));
71
- } else {
72
- return new Outcome(this.state);
73
- }
74
- }
75
- mapFailed(map) {
76
- if (this.state.status === 'FAILED') {
77
- return Outcome.failed(map(this.state.err));
78
- } else {
79
- return new Outcome(this.state);
66
+ return failed(this.state.err, this.state.data);
80
67
  }
81
68
  }
82
69
  }
@@ -3,6 +3,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import React from 'react';
4
4
  import Loadable from 'react-loadable';
5
5
  import { isExternalImageIdentifier, isFileIdentifier } from '@atlaskit/media-client';
6
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
6
7
  import { FormattedMessage } from 'react-intl-next';
7
8
  import { messages } from '@atlaskit/media-ui';
8
9
  import { isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
@@ -78,9 +79,9 @@ export class ItemViewerBase extends React.Component {
78
79
  }
79
80
  });
80
81
  });
81
- _defineProperty(this, "onLoadFail", mediaViewerError => {
82
+ _defineProperty(this, "onLoadFail", (mediaViewerError, data) => {
82
83
  this.safeSetState({
83
- item: Outcome.failed(mediaViewerError)
84
+ item: Outcome.failed(mediaViewerError, data)
84
85
  });
85
86
  });
86
87
  _defineProperty(this, "onExternalImgSuccess", () => {
@@ -170,7 +171,9 @@ export class ItemViewerBase extends React.Component {
170
171
  case 'doc':
171
172
  return /*#__PURE__*/React.createElement(DocViewer, _extends({
172
173
  onSuccess: this.onSuccess,
173
- onError: this.onLoadFail
174
+ onError: err => {
175
+ this.onLoadFail(err, fileState);
176
+ }
174
177
  }, viewerProps));
175
178
  case 'archive':
176
179
  return /*#__PURE__*/React.createElement(ArchiveViewerLoader, _extends({
@@ -232,21 +235,23 @@ export class ItemViewerBase extends React.Component {
232
235
  });
233
236
  } else {
234
237
  // render a FileState fetched through media-client
235
- const fileState = fileItem;
236
- switch (fileState.status) {
238
+ switch (fileItem.status) {
237
239
  case 'processed':
238
240
  case 'uploading':
239
241
  case 'processing':
240
- return this.renderItem(fileState);
242
+ return this.renderItem(fileItem);
241
243
  case 'failed-processing':
242
- return this.renderError(new MediaViewerError('itemviewer-file-failed-processing-status'), fileState);
244
+ if (getBooleanFF('platform.corex.password-protected-pdf_ht8re') && fileItem.mediaType === 'doc' && fileItem.mimeType === 'application/pdf') {
245
+ return this.renderItem(fileItem);
246
+ }
247
+ return this.renderError(new MediaViewerError('itemviewer-file-failed-processing-status'), fileItem);
243
248
  case 'error':
244
- return this.renderError(new MediaViewerError('itemviewer-file-error-status'), fileState);
249
+ return this.renderError(new MediaViewerError('itemviewer-file-error-status'), fileItem);
245
250
  }
246
251
  }
247
252
  },
248
253
  pending: () => /*#__PURE__*/React.createElement(Spinner, null),
249
- failed: error => this.renderError(error, item.data)
254
+ failed: (error, data) => this.renderError(error, data)
250
255
  });
251
256
  }
252
257
  renderDownloadButton(fileState, error) {
@@ -103,7 +103,8 @@ export class MediaViewerComponent extends React.Component {
103
103
  className: mediaViewerPopupClass
104
104
  }, /*#__PURE__*/React.createElement(Shortcut, {
105
105
  code: 'Escape',
106
- handler: this.onShortcutClosed
106
+ handler: this.onShortcutClosed,
107
+ eventType: 'keyup'
107
108
  }), /*#__PURE__*/React.createElement(Content, {
108
109
  isSidebarVisible: isSidebarVisible,
109
110
  onClose: this.onContentClose
@@ -59,7 +59,8 @@ export class NavigationBase extends Component {
59
59
  className: hideControlsClassName
60
60
  }, /*#__PURE__*/React.createElement(Shortcut, {
61
61
  code: 'ArrowLeft',
62
- handler: prev('keyboard')
62
+ handler: prev('keyboard'),
63
+ eventType: 'keyup'
63
64
  }), /*#__PURE__*/React.createElement(Button, {
64
65
  testId: prevNavButtonId,
65
66
  onClick: prev('mouse'),
@@ -77,7 +78,8 @@ export class NavigationBase extends Component {
77
78
  className: hideControlsClassName
78
79
  }, /*#__PURE__*/React.createElement(Shortcut, {
79
80
  code: 'ArrowRight',
80
- handler: next('keyboard')
81
+ handler: next('keyboard'),
82
+ eventType: 'keyup'
81
83
  }), /*#__PURE__*/React.createElement(Button, {
82
84
  testId: nextNavButtonId,
83
85
  onClick: next('mouse'),
@@ -19,23 +19,23 @@ import { InteractiveImg } from '../viewers/image/interactive-img';
19
19
  import ArchiveViewerLoader from '../viewers/archiveSidebar/archiveViewerLoader';
20
20
  import { getRandomHex } from '@atlaskit/media-common';
21
21
  import { startMediaFileUfoExperience, succeedMediaFileUfoExperience } from '../analytics/ufoExperiences';
22
- const ImageViewer = Loadable({
22
+ const ImageViewerV2 = Loadable({
23
23
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_imageViewer" */'../viewers/image').then(mod => mod.ImageViewer),
24
24
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
25
25
  });
26
- const VideoViewer = Loadable({
26
+ const VideoViewerV2 = Loadable({
27
27
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_videoViewer" */'../viewers/video').then(mod => mod.VideoViewer),
28
28
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
29
29
  });
30
- const AudioViewer = Loadable({
30
+ const AudioViewerV2 = Loadable({
31
31
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_audioViewer" */'../viewers/audio').then(mod => mod.AudioViewer),
32
32
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
33
33
  });
34
- const DocViewer = Loadable({
34
+ const DocViewerV2 = Loadable({
35
35
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_docViewer" */'../viewers/doc').then(mod => mod.DocViewer),
36
36
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
37
37
  });
38
- const CodeViewer = Loadable({
38
+ const CodeViewerV2 = Loadable({
39
39
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_codeViewer" */'../viewers/codeViewer').then(mod => mod.CodeViewer),
40
40
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
41
41
  });
@@ -206,7 +206,7 @@ export const ItemViewerV2Base = ({
206
206
  if (fileItem.size > MAX_FILE_SIZE_SUPPORTED_BY_CODEVIEWER) {
207
207
  return renderError(new MediaViewerError('codeviewer-file-size-exceeds'), fileItem);
208
208
  }
209
- return /*#__PURE__*/React.createElement(CodeViewer, _extends({
209
+ return /*#__PURE__*/React.createElement(CodeViewerV2, _extends({
210
210
  onSuccess: onSuccess,
211
211
  onError: onLoadFail
212
212
  }, viewerProps));
@@ -216,26 +216,26 @@ export const ItemViewerV2Base = ({
216
216
  } = fileItem;
217
217
  switch (mediaType) {
218
218
  case 'image':
219
- return /*#__PURE__*/React.createElement(ImageViewer, _extends({
219
+ return /*#__PURE__*/React.createElement(ImageViewerV2, _extends({
220
220
  onLoad: onSuccess,
221
221
  onError: onLoadFail,
222
222
  contextId: contextId,
223
223
  traceContext: traceContext.current
224
224
  }, viewerProps));
225
225
  case 'audio':
226
- return /*#__PURE__*/React.createElement(AudioViewer, _extends({
226
+ return /*#__PURE__*/React.createElement(AudioViewerV2, _extends({
227
227
  showControls: showControls,
228
228
  onCanPlay: onSuccess,
229
229
  onError: onLoadFail
230
230
  }, viewerProps));
231
231
  case 'video':
232
- return /*#__PURE__*/React.createElement(VideoViewer, _extends({
232
+ return /*#__PURE__*/React.createElement(VideoViewerV2, _extends({
233
233
  showControls: showControls,
234
234
  onCanPlay: onSuccess,
235
235
  onError: onLoadFail
236
236
  }, viewerProps));
237
237
  case 'doc':
238
- return /*#__PURE__*/React.createElement(DocViewer, _extends({
238
+ return /*#__PURE__*/React.createElement(DocViewerV2, _extends({
239
239
  onSuccess: onSuccess,
240
240
  onError: onLoadFail
241
241
  }, viewerProps));
@@ -2,11 +2,9 @@ import React from 'react';
2
2
  import { isPreviewableFileState } from '@atlaskit/media-client';
3
3
  import { Outcome } from '../../domain';
4
4
  import { MediaViewerError } from '../../errors';
5
- import { Spinner } from '../../loading';
5
+ import { PDFRenderer } from './pdfRenderer';
6
6
  import { BaseViewer } from '../base-viewer';
7
7
  import { getObjectUrlFromFileState } from '../../utils/getObjectUrlFromFileState';
8
- const moduleLoader = () => import( /* webpackChunkName: "@atlaskit-internal_media-pdf-viewer" */'./pdfRenderer');
9
- const componentLoader = () => moduleLoader().then(module => module.PDFRenderer);
10
8
  export class DocViewer extends BaseViewer {
11
9
  get initialState() {
12
10
  return {
@@ -14,9 +12,6 @@ export class DocViewer extends BaseViewer {
14
12
  };
15
13
  }
16
14
  async init() {
17
- if (!DocViewer.PDFComponent) {
18
- await this.loadDocViewer();
19
- }
20
15
  const {
21
16
  item,
22
17
  mediaClient,
@@ -37,6 +32,24 @@ export class DocViewer extends BaseViewer {
37
32
  } else if (item.status === 'processed') {
38
33
  try {
39
34
  const src = await mediaClient.file.getArtifactURL(item.artifacts, 'document.pdf', collectionName);
35
+ this.onMediaDisplayed();
36
+ this.setState({
37
+ content: Outcome.successful(src)
38
+ });
39
+ } catch (error) {
40
+ const docError = new MediaViewerError('docviewer-fetch-url', error instanceof Error ? error : undefined);
41
+ this.setState({
42
+ content: Outcome.failed(docError)
43
+ });
44
+ if (onError) {
45
+ onError(docError);
46
+ }
47
+ }
48
+ } else if (item.status === 'failed-processing') {
49
+ try {
50
+ const src = await mediaClient.file.getFileBinaryURL(item.id, collectionName, 2940 // 2940 seconds ~= 50 mins
51
+ );
52
+
40
53
  this.onMediaDisplayed();
41
54
  this.setState({
42
55
  content: Outcome.successful(src)
@@ -52,10 +65,6 @@ export class DocViewer extends BaseViewer {
52
65
  }
53
66
  }
54
67
  }
55
- async loadDocViewer() {
56
- DocViewer.PDFComponent = await componentLoader();
57
- this.forceUpdate();
58
- }
59
68
  release() {
60
69
  const {
61
70
  content
@@ -72,13 +81,7 @@ export class DocViewer extends BaseViewer {
72
81
  onSuccess,
73
82
  onError
74
83
  } = this.props;
75
- const {
76
- PDFComponent
77
- } = DocViewer;
78
- if (!PDFComponent) {
79
- return /*#__PURE__*/React.createElement(Spinner, null);
80
- }
81
- return /*#__PURE__*/React.createElement(PDFComponent, {
84
+ return /*#__PURE__*/React.createElement(PDFRenderer, {
82
85
  item: item,
83
86
  src: content,
84
87
  onSuccess: onSuccess,