@atlaskit/editor-synced-block-provider 3.6.0 → 3.7.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 (53) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/clients/block-service/ari.js +12 -1
  3. package/dist/cjs/clients/block-service/blockService.js +35 -2
  4. package/dist/cjs/clients/confluence/sourceInfo.js +109 -52
  5. package/dist/cjs/providers/block-service/blockServiceAPI.js +195 -125
  6. package/dist/cjs/providers/syncBlockProvider.js +83 -14
  7. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +60 -17
  8. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +17 -0
  9. package/dist/cjs/store-manager/syncBlockStoreManager.js +121 -0
  10. package/dist/cjs/utils/errorHandling.js +4 -1
  11. package/dist/es2019/clients/block-service/ari.js +11 -0
  12. package/dist/es2019/clients/block-service/blockService.js +12 -1
  13. package/dist/es2019/clients/confluence/sourceInfo.js +64 -29
  14. package/dist/es2019/providers/block-service/blockServiceAPI.js +45 -2
  15. package/dist/es2019/providers/syncBlockProvider.js +37 -5
  16. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +61 -18
  17. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +16 -1
  18. package/dist/es2019/store-manager/syncBlockStoreManager.js +64 -0
  19. package/dist/es2019/utils/errorHandling.js +2 -1
  20. package/dist/esm/clients/block-service/ari.js +11 -0
  21. package/dist/esm/clients/block-service/blockService.js +34 -1
  22. package/dist/esm/clients/confluence/sourceInfo.js +109 -52
  23. package/dist/esm/providers/block-service/blockServiceAPI.js +195 -125
  24. package/dist/esm/providers/syncBlockProvider.js +81 -12
  25. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +60 -17
  26. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +18 -1
  27. package/dist/esm/store-manager/syncBlockStoreManager.js +121 -0
  28. package/dist/esm/utils/errorHandling.js +3 -0
  29. package/dist/types/clients/block-service/ari.d.ts +1 -0
  30. package/dist/types/clients/block-service/blockService.d.ts +15 -5
  31. package/dist/types/clients/confluence/sourceInfo.d.ts +2 -2
  32. package/dist/types/common/types.d.ts +25 -0
  33. package/dist/types/index.d.ts +2 -2
  34. package/dist/types/providers/block-service/blockServiceAPI.d.ts +3 -2
  35. package/dist/types/providers/syncBlockProvider.d.ts +3 -2
  36. package/dist/types/providers/types.d.ts +16 -3
  37. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +3 -2
  38. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +3 -2
  39. package/dist/types/store-manager/syncBlockStoreManager.d.ts +4 -0
  40. package/dist/types/utils/errorHandling.d.ts +1 -0
  41. package/dist/types-ts4.5/clients/block-service/ari.d.ts +1 -0
  42. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +15 -5
  43. package/dist/types-ts4.5/clients/confluence/sourceInfo.d.ts +2 -2
  44. package/dist/types-ts4.5/common/types.d.ts +25 -0
  45. package/dist/types-ts4.5/index.d.ts +2 -2
  46. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +3 -2
  47. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +3 -2
  48. package/dist/types-ts4.5/providers/types.d.ts +16 -3
  49. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +3 -2
  50. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +3 -2
  51. package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +4 -0
  52. package/dist/types-ts4.5/utils/errorHandling.d.ts +1 -0
  53. package/package.json +1 -1
@@ -16,10 +16,13 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
16
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
17
  var _react = require("react");
18
18
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
19
- var _ari = require("../clients/confluence/ari");
19
+ var _ari = require("../clients/block-service/ari");
20
+ var _ari2 = require("../clients/confluence/ari");
20
21
  var _sourceInfo = require("../clients/confluence/sourceInfo");
21
22
  var _types = require("../common/types");
22
23
  var _types2 = require("./types");
24
+ 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; }
25
+ 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; }
23
26
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
24
27
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
25
28
  var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
@@ -286,19 +289,77 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
286
289
  )
287
290
  }, {
288
291
  key: "fetchSyncBlockSourceInfo",
289
- value: function fetchSyncBlockSourceInfo(localId, sourceAri, sourceProduct, fireAnalyticsEvent) {
290
- if (!sourceAri || !sourceProduct) {
291
- return Promise.reject(new Error('Source ari or source product is undefined'));
292
- }
293
- switch (sourceProduct) {
294
- case 'confluence-page':
295
- return (0, _sourceInfo.fetchConfluencePageInfo)(sourceAri, localId, fireAnalyticsEvent);
296
- case 'jira-work-item':
297
- return Promise.reject(new Error('Jira work item source product not supported'));
298
- default:
299
- return Promise.reject(new Error("".concat(sourceProduct, " source product not supported")));
292
+ value: (function () {
293
+ var _fetchSyncBlockSourceInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(localId, sourceAri, sourceProduct, fireAnalyticsEvent) {
294
+ var hasAccess,
295
+ urlType,
296
+ ari,
297
+ product,
298
+ _this$writeProvider,
299
+ sourceInfo,
300
+ _this$writeProvider2,
301
+ _args4 = arguments;
302
+ return _regenerator.default.wrap(function _callee4$(_context4) {
303
+ while (1) switch (_context4.prev = _context4.next) {
304
+ case 0:
305
+ hasAccess = _args4.length > 4 && _args4[4] !== undefined ? _args4[4] : true;
306
+ urlType = _args4.length > 5 && _args4[5] !== undefined ? _args4[5] : 'edit';
307
+ ari = sourceAri, product = sourceProduct;
308
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
309
+ ari = sourceAri !== null && sourceAri !== void 0 ? sourceAri : (_this$writeProvider = this.writeProvider) === null || _this$writeProvider === void 0 ? void 0 : _this$writeProvider.parentAri;
310
+ product = sourceProduct !== null && sourceProduct !== void 0 ? sourceProduct : (0, _ari.getProductFromSourceAri)(ari);
311
+ }
312
+ if (!(!ari || !product)) {
313
+ _context4.next = 6;
314
+ break;
315
+ }
316
+ return _context4.abrupt("return", Promise.reject(new Error('Source ari or source product is undefined')));
317
+ case 6:
318
+ _context4.t0 = product;
319
+ _context4.next = _context4.t0 === 'confluence-page' ? 9 : _context4.t0 === 'jira-work-item' ? 19 : 22;
320
+ break;
321
+ case 9:
322
+ _context4.next = 11;
323
+ return (0, _sourceInfo.fetchConfluencePageInfo)(ari, hasAccess, urlType, localId, fireAnalyticsEvent);
324
+ case 11:
325
+ sourceInfo = _context4.sent;
326
+ if (!(0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
327
+ _context4.next = 18;
328
+ break;
329
+ }
330
+ if (sourceInfo) {
331
+ _context4.next = 15;
332
+ break;
333
+ }
334
+ return _context4.abrupt("return", Promise.resolve(undefined));
335
+ case 15:
336
+ return _context4.abrupt("return", _objectSpread(_objectSpread({}, sourceInfo), {}, {
337
+ onSamePage: ((_this$writeProvider2 = this.writeProvider) === null || _this$writeProvider2 === void 0 ? void 0 : _this$writeProvider2.parentAri) === ari,
338
+ productType: product
339
+ }));
340
+ case 18:
341
+ return _context4.abrupt("return", sourceInfo);
342
+ case 19:
343
+ if (!(0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
344
+ _context4.next = 21;
345
+ break;
346
+ }
347
+ return _context4.abrupt("return", Promise.resolve(undefined));
348
+ case 21:
349
+ return _context4.abrupt("return", Promise.reject(new Error('Jira work item source product not supported')));
350
+ case 22:
351
+ return _context4.abrupt("return", Promise.reject(new Error("".concat(product, " source product not supported"))));
352
+ case 23:
353
+ case "end":
354
+ return _context4.stop();
355
+ }
356
+ }, _callee4, this);
357
+ }));
358
+ function fetchSyncBlockSourceInfo(_x5, _x6, _x7, _x8) {
359
+ return _fetchSyncBlockSourceInfo.apply(this, arguments);
300
360
  }
301
- }
361
+ return fetchSyncBlockSourceInfo;
362
+ }())
302
363
  }, {
303
364
  key: "generateResourceId",
304
365
  value: function generateResourceId() {
@@ -346,7 +407,7 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
346
407
  switch (sourceProduct) {
347
408
  case 'confluence-page':
348
409
  return {
349
- contentId: (0, _ari.getPageIdAndTypeFromConfluencePageAri)({
410
+ contentId: (0, _ari2.getPageIdAndTypeFromConfluencePageAri)({
350
411
  ari: sourceAri
351
412
  }).id,
352
413
  contentProduct: sourceProduct
@@ -365,6 +426,14 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
365
426
  }
366
427
  return this.writeProvider.updateReferenceData(blocks, noContent);
367
428
  }
429
+ }, {
430
+ key: "fetchReferences",
431
+ value: function fetchReferences(resourceId, isSource) {
432
+ if (!this.fetchProvider) {
433
+ throw new Error('Fetch provider not set');
434
+ }
435
+ return this.fetchProvider.fetchReferences(isSource ? this.generateResourceIdForReference(resourceId) : resourceId);
436
+ }
368
437
  }]);
369
438
  }(_types2.SyncBlockDataProvider);
370
439
  var createSyncedBlockProvider = function createSyncedBlockProvider(_ref) {
@@ -47,6 +47,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
47
47
  this.titleSubscriptions = new Map();
48
48
  this.dataProvider = dataProvider;
49
49
  this.syncBlockFetchDataRequests = new Map();
50
+ this.syncBlockSourceInfoRequestsOld = new Map();
50
51
  this.syncBlockSourceInfoRequests = new Map();
51
52
  this.providerFactories = new Map();
52
53
  this.pendingCacheDeletions = new Map();
@@ -185,7 +186,6 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
185
186
  value: function fetchSyncBlockSourceInfo(resourceId) {
186
187
  var _this = this;
187
188
  try {
188
- var _existingSyncBlock$da, _existingSyncBlock$da2;
189
189
  if (!resourceId || !this.dataProvider) {
190
190
  // make sure experience has been started before throwing error
191
191
  if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
@@ -194,8 +194,13 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
194
194
  }
195
195
  throw new Error('Data provider or resourceId not set');
196
196
  }
197
- if (this.syncBlockSourceInfoRequests.get(resourceId)) {
198
- return;
197
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
198
+ var existingRequest = this.syncBlockSourceInfoRequests.get(resourceId);
199
+ if (existingRequest) {
200
+ return existingRequest;
201
+ }
202
+ } else if (this.syncBlockSourceInfoRequestsOld.get(resourceId)) {
203
+ return Promise.resolve(undefined);
199
204
  }
200
205
  var existingSyncBlock = this.getFromCache(resourceId);
201
206
  if (!existingSyncBlock) {
@@ -205,10 +210,28 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
205
210
  }
206
211
  throw new Error('No existing sync block to fetch source info for');
207
212
  }
208
-
213
+ var _ref = existingSyncBlock.data || {},
214
+ sourceAri = _ref.sourceAri,
215
+ product = _ref.product,
216
+ blockInstanceId = _ref.blockInstanceId,
217
+ sourceURL = _ref.sourceURL,
218
+ sourceTitle = _ref.sourceTitle,
219
+ onSamePage = _ref.onSamePage,
220
+ sourceSubType = _ref.sourceSubType;
209
221
  // skip if source URL and title are already present
210
- if ((_existingSyncBlock$da = existingSyncBlock.data) !== null && _existingSyncBlock$da !== void 0 && _existingSyncBlock$da.sourceURL && (_existingSyncBlock$da2 = existingSyncBlock.data) !== null && _existingSyncBlock$da2 !== void 0 && _existingSyncBlock$da2.sourceTitle) {
211
- return;
222
+ if (sourceURL && sourceTitle) {
223
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
224
+ return Promise.resolve({
225
+ title: sourceTitle,
226
+ url: sourceURL,
227
+ subType: sourceSubType,
228
+ sourceAri: sourceAri || '',
229
+ onSamePage: onSamePage,
230
+ productType: product
231
+ });
232
+ } else {
233
+ return Promise.resolve(undefined);
234
+ }
212
235
  }
213
236
 
214
237
  // only start experience if there is data to fetch
@@ -216,10 +239,6 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
216
239
  var _this$fetchSourceInfo3;
217
240
  (_this$fetchSourceInfo3 = this.fetchSourceInfoExperience) === null || _this$fetchSourceInfo3 === void 0 || _this$fetchSourceInfo3.start({});
218
241
  }
219
- var _ref = existingSyncBlock.data || {},
220
- sourceAri = _ref.sourceAri,
221
- product = _ref.product,
222
- blockInstanceId = _ref.blockInstanceId;
223
242
  if (!sourceAri || !product || !blockInstanceId) {
224
243
  if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
225
244
  var _this$fetchSourceInfo4;
@@ -230,10 +249,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
230
249
  var _this$fireAnalyticsEv2;
231
250
  (_this$fireAnalyticsEv2 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv2 === void 0 || _this$fireAnalyticsEv2.call(this, (0, _errorHandling.getSourceInfoErrorPayload)('SourceAri, product or blockInstanceId missing'));
232
251
  }
233
- return;
252
+ return Promise.resolve(undefined);
234
253
  }
235
- this.syncBlockSourceInfoRequests.set(resourceId, true);
236
- this.dataProvider.fetchSyncBlockSourceInfo(blockInstanceId, sourceAri, product, this.fireAnalyticsEvent).then(function (sourceInfo) {
254
+ var sourceInfoPromise = this.dataProvider.fetchSyncBlockSourceInfo(blockInstanceId, sourceAri, product, this.fireAnalyticsEvent).then(function (sourceInfo) {
237
255
  if (!sourceInfo) {
238
256
  if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
239
257
  var _this$fetchSourceInfo5;
@@ -241,7 +259,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
241
259
  reason: 'No source info returned'
242
260
  });
243
261
  }
244
- return;
262
+ return undefined;
245
263
  }
246
264
  _this.updateCacheWithSourceInfo(resourceId, sourceInfo);
247
265
  if (sourceInfo.title) {
@@ -257,6 +275,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
257
275
  reason: 'Missing title or url'
258
276
  });
259
277
  }
278
+ return sourceInfo;
260
279
  }
261
280
  }).catch(function (error) {
262
281
  if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
@@ -268,9 +287,20 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
268
287
  var _this$fireAnalyticsEv3;
269
288
  (_this$fireAnalyticsEv3 = _this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv3 === void 0 || _this$fireAnalyticsEv3.call(_this, (0, _errorHandling.getSourceInfoErrorPayload)(error.message));
270
289
  }
290
+ return undefined;
271
291
  }).finally(function () {
272
- _this.syncBlockSourceInfoRequests.delete(resourceId);
292
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
293
+ _this.syncBlockSourceInfoRequests.delete(resourceId);
294
+ } else {
295
+ _this.syncBlockSourceInfoRequestsOld.delete(resourceId);
296
+ }
273
297
  });
298
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
299
+ this.syncBlockSourceInfoRequests.set(resourceId, sourceInfoPromise);
300
+ return sourceInfoPromise;
301
+ } else {
302
+ this.syncBlockSourceInfoRequestsOld.set(resourceId, true);
303
+ }
274
304
  } catch (error) {
275
305
  (0, _monitoring.logException)(error, {
276
306
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
@@ -285,6 +315,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
285
315
  (_this$fireAnalyticsEv4 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv4 === void 0 || _this$fireAnalyticsEv4.call(this, (0, _errorHandling.getSourceInfoErrorPayload)(error.message));
286
316
  }
287
317
  }
318
+ return Promise.resolve(undefined);
288
319
  }
289
320
 
290
321
  /**
@@ -417,7 +448,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
417
448
  existingSyncBlock.data.sourceURL = sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.url;
418
449
  existingSyncBlock.data = _objectSpread(_objectSpread({}, existingSyncBlock.data), {}, {
419
450
  sourceURL: sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.url,
420
- sourceTitle: sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.title
451
+ sourceTitle: sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.title,
452
+ onSamePage: sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.onSamePage,
453
+ sourceSubType: sourceInfo === null || sourceInfo === void 0 ? void 0 : sourceInfo.subType
421
454
  });
422
455
  this.updateCache(existingSyncBlock);
423
456
  }
@@ -696,7 +729,8 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
696
729
  }
697
730
  var hasMediaProvider = providerFactory.hasProvider('mediaProvider');
698
731
  var hasEmojiProvider = providerFactory.hasProvider('emojiProvider');
699
- if (hasMediaProvider && hasEmojiProvider) {
732
+ var hasCardProvider = providerFactory.hasProvider('cardProvider');
733
+ if (hasMediaProvider && hasEmojiProvider && hasCardProvider) {
700
734
  return;
701
735
  }
702
736
  var syncBlock = this.getFromCache(resourceId);
@@ -733,6 +767,14 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
733
767
  }
734
768
  }
735
769
  }
770
+ if (!hasCardProvider) {
771
+ if (providerCreator.createSmartLinkProvider) {
772
+ var smartLinkProvider = providerCreator.createSmartLinkProvider();
773
+ if (smartLinkProvider) {
774
+ providerFactory.setProvider('cardProvider', smartLinkProvider);
775
+ }
776
+ }
777
+ }
736
778
  }
737
779
 
738
780
  /**
@@ -850,6 +892,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
850
892
  this.subscriptions.clear();
851
893
  this.titleSubscriptions.clear();
852
894
  this.syncBlockFetchDataRequests.clear();
895
+ this.syncBlockSourceInfoRequestsOld.clear();
853
896
  this.syncBlockSourceInfoRequests.clear();
854
897
  this.providerFactories.clear();
855
898
  this.isRefreshingSubscriptions = false;
@@ -578,6 +578,23 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
578
578
  }
579
579
  return deleteSyncBlocksWithConfirmation;
580
580
  }())
581
+ }, {
582
+ key: "getSyncBlockSourceInfo",
583
+ value: function getSyncBlockSourceInfo(localId) {
584
+ try {
585
+ if (!this.dataProvider) {
586
+ throw new Error('Data provider not set');
587
+ }
588
+ return this.dataProvider.fetchSyncBlockSourceInfo(localId, undefined, undefined, this.fireAnalyticsEvent);
589
+ } catch (error) {
590
+ var _this$fireAnalyticsEv5;
591
+ (0, _monitoring.logException)(error, {
592
+ location: 'editor-synced-block-provider/sourceSyncBlockStoreManager'
593
+ });
594
+ (_this$fireAnalyticsEv5 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv5 === void 0 || _this$fireAnalyticsEv5.call(this, (0, _errorHandling.getSourceInfoErrorPayload)(error.message));
595
+ return Promise.resolve(undefined);
596
+ }
597
+ }
581
598
  }, {
582
599
  key: "destroy",
583
600
  value: function destroy() {
@@ -5,11 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.useMemoizedSyncBlockStoreManager = exports.SyncBlockStoreManager = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
13
  var _react = require("react");
14
+ var _monitoring = require("@atlaskit/editor-common/monitoring");
15
+ var _ari = require("../clients/block-service/ari");
16
+ var _types = require("../common/types");
17
+ var _errorHandling = require("../utils/errorHandling");
11
18
  var _referenceSyncBlockStoreManager = require("./referenceSyncBlockStoreManager");
12
19
  var _sourceSyncBlockStoreManager = require("./sourceSyncBlockStoreManager");
20
+ 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; }
21
+ 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; }
13
22
  // A parent store manager responsible for the lifecycle and state management of sync blocks in an editor instance.
14
23
  // Contains two child store managers: ReferenceSyncBlockStoreManager and SourceSyncBlockStoreManager.
15
24
  // ReferenceSyncBlockStoreManager is responsible for the lifecycle and state management of reference sync blocks in an editor instance.
@@ -22,10 +31,122 @@ var SyncBlockStoreManager = exports.SyncBlockStoreManager = /*#__PURE__*/functio
22
31
  // we can pass the source manager as a parameter to the reference manager constructor
23
32
  this.sourceSyncBlockStoreManager = new _sourceSyncBlockStoreManager.SourceSyncBlockStoreManager(dataProvider);
24
33
  this.referenceSyncBlockStoreManager = new _referenceSyncBlockStoreManager.ReferenceSyncBlockStoreManager(dataProvider);
34
+ this.dataProvider = dataProvider;
25
35
  }
26
36
  return (0, _createClass2.default)(SyncBlockStoreManager, [{
37
+ key: "fetchReferencesSourceInfo",
38
+ value: function () {
39
+ var _fetchReferencesSourceInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(resourceId, blockInstanceId, isSourceSyncBlock) {
40
+ var _this = this;
41
+ var _response$references, response, sourceInfoPromises, sourceInfos, sourceSyncBlockData, _this$fireAnalyticsEv;
42
+ return _regenerator.default.wrap(function _callee2$(_context2) {
43
+ while (1) switch (_context2.prev = _context2.next) {
44
+ case 0:
45
+ _context2.prev = 0;
46
+ if (this.dataProvider) {
47
+ _context2.next = 3;
48
+ break;
49
+ }
50
+ throw new Error('Data provider not set');
51
+ case 3:
52
+ _context2.next = 5;
53
+ return this.dataProvider.fetchReferences(resourceId, isSourceSyncBlock);
54
+ case 5:
55
+ response = _context2.sent;
56
+ if (!response.error) {
57
+ _context2.next = 8;
58
+ break;
59
+ }
60
+ return _context2.abrupt("return", {
61
+ error: response.error
62
+ });
63
+ case 8:
64
+ if (!(!response.references || ((_response$references = response.references) === null || _response$references === void 0 ? void 0 : _response$references.length) === 0)) {
65
+ _context2.next = 10;
66
+ break;
67
+ }
68
+ return _context2.abrupt("return", isSourceSyncBlock ? {
69
+ references: []
70
+ } : {
71
+ error: _types.SyncBlockError.Errored
72
+ });
73
+ case 10:
74
+ sourceInfoPromises = response.references.map( /*#__PURE__*/function () {
75
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(reference) {
76
+ var _this$dataProvider;
77
+ var sourceInfo;
78
+ return _regenerator.default.wrap(function _callee$(_context) {
79
+ while (1) switch (_context.prev = _context.next) {
80
+ case 0:
81
+ _context.next = 2;
82
+ return (_this$dataProvider = _this.dataProvider) === null || _this$dataProvider === void 0 ? void 0 : _this$dataProvider.fetchSyncBlockSourceInfo(blockInstanceId, reference.documentAri, (0, _ari.getProductFromSourceAri)(reference.documentAri), _this.fireAnalyticsEvent, reference.hasAccess, 'view');
83
+ case 2:
84
+ sourceInfo = _context.sent;
85
+ if (sourceInfo) {
86
+ _context.next = 5;
87
+ break;
88
+ }
89
+ return _context.abrupt("return", undefined);
90
+ case 5:
91
+ return _context.abrupt("return", _objectSpread(_objectSpread({}, sourceInfo), {}, {
92
+ onSamePage: reference.onSamePage,
93
+ hasAccess: reference.hasAccess,
94
+ productType: sourceInfo.productType
95
+ }));
96
+ case 6:
97
+ case "end":
98
+ return _context.stop();
99
+ }
100
+ }, _callee);
101
+ }));
102
+ return function (_x4) {
103
+ return _ref.apply(this, arguments);
104
+ };
105
+ }());
106
+ _context2.next = 13;
107
+ return Promise.all(sourceInfoPromises);
108
+ case 13:
109
+ sourceInfos = _context2.sent;
110
+ _context2.next = 16;
111
+ return isSourceSyncBlock ? this.sourceSyncBlockStoreManager.getSyncBlockSourceInfo(blockInstanceId) : this.referenceSyncBlockStoreManager.fetchSyncBlockSourceInfo(resourceId);
112
+ case 16:
113
+ sourceSyncBlockData = _context2.sent;
114
+ if (sourceSyncBlockData) {
115
+ sourceInfos.push(_objectSpread(_objectSpread({}, sourceSyncBlockData), {}, {
116
+ onSamePage: Boolean(sourceSyncBlockData === null || sourceSyncBlockData === void 0 ? void 0 : sourceSyncBlockData.onSamePage),
117
+ hasAccess: true,
118
+ isSource: true,
119
+ productType: sourceSyncBlockData === null || sourceSyncBlockData === void 0 ? void 0 : sourceSyncBlockData.productType
120
+ }));
121
+ }
122
+ return _context2.abrupt("return", {
123
+ references: sourceInfos
124
+ });
125
+ case 21:
126
+ _context2.prev = 21;
127
+ _context2.t0 = _context2["catch"](0);
128
+ (0, _monitoring.logException)(_context2.t0, {
129
+ location: 'editor-synced-block-provider/syncBlockStoreManager'
130
+ });
131
+ (_this$fireAnalyticsEv = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv === void 0 || _this$fireAnalyticsEv.call(this, (0, _errorHandling.fetchReferencesErrorPayload)(_context2.t0.message));
132
+ return _context2.abrupt("return", {
133
+ error: _types.SyncBlockError.Errored
134
+ });
135
+ case 26:
136
+ case "end":
137
+ return _context2.stop();
138
+ }
139
+ }, _callee2, this, [[0, 21]]);
140
+ }));
141
+ function fetchReferencesSourceInfo(_x, _x2, _x3) {
142
+ return _fetchReferencesSourceInfo.apply(this, arguments);
143
+ }
144
+ return fetchReferencesSourceInfo;
145
+ }()
146
+ }, {
27
147
  key: "setFireAnalyticsEvent",
28
148
  value: function setFireAnalyticsEvent(fireAnalyticsEvent) {
149
+ this.fireAnalyticsEvent = fireAnalyticsEvent;
29
150
  this.referenceSyncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
30
151
  this.sourceSyncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
31
152
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.updateReferenceErrorPayload = exports.updateErrorPayload = exports.updateCacheErrorPayload = exports.stringifyError = exports.getSourceInfoErrorPayload = exports.getErrorPayload = exports.fetchErrorPayload = exports.deleteErrorPayload = exports.createErrorPayload = void 0;
6
+ exports.updateReferenceErrorPayload = exports.updateErrorPayload = exports.updateCacheErrorPayload = exports.stringifyError = exports.getSourceInfoErrorPayload = exports.getErrorPayload = exports.fetchReferencesErrorPayload = exports.fetchErrorPayload = exports.deleteErrorPayload = exports.createErrorPayload = void 0;
7
7
  var _analytics = require("@atlaskit/editor-common/analytics");
8
8
  var stringifyError = exports.stringifyError = function stringifyError(error) {
9
9
  try {
@@ -43,4 +43,7 @@ var deleteErrorPayload = exports.deleteErrorPayload = function deleteErrorPayloa
43
43
  };
44
44
  var updateCacheErrorPayload = exports.updateCacheErrorPayload = function updateCacheErrorPayload(error) {
45
45
  return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_UPDATE_CACHE, error);
46
+ };
47
+ var fetchReferencesErrorPayload = exports.fetchReferencesErrorPayload = function fetchReferencesErrorPayload(error) {
48
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_FETCH_REFERENCES, error);
46
49
  };
@@ -41,4 +41,15 @@ export const getLocalIdFromBlockResourceId = ari => {
41
41
  return match[1];
42
42
  }
43
43
  throw new Error(`Invalid page ARI: ${ari}`);
44
+ };
45
+ export const getProductFromSourceAri = ari => {
46
+ const jiraMatch = ari === null || ari === void 0 ? void 0 : ari.search(/ari:cloud:jira:.*/);
47
+ if (jiraMatch !== -1) {
48
+ return 'jira-work-item';
49
+ }
50
+ const confluenceMatch = ari === null || ari === void 0 ? void 0 : ari.search(/ari:cloud:confluence:.*/);
51
+ if (confluenceMatch !== -1) {
52
+ return 'confluence-page';
53
+ }
54
+ return undefined;
44
55
  };
@@ -116,7 +116,6 @@ export const getSyncedBlockContent = async ({
116
116
  }
117
117
  return await response.json();
118
118
  };
119
- ;
120
119
 
121
120
  /**
122
121
  * Batch retrieves multiple synced blocks by their ARIs.
@@ -218,4 +217,16 @@ export const updateReferenceSyncedBlockOnDocument = async ({
218
217
  if (!noContent) {
219
218
  return await response.json();
220
219
  }
220
+ };
221
+ export const getReferenceSyncedBlocksByBlockAri = async ({
222
+ blockAri
223
+ }) => {
224
+ const response = await fetchWithRetry(`${BLOCK_SERVICE_API_URL}/reference/batch-retrieve/${encodeURIComponent(blockAri)}`, {
225
+ method: 'GET',
226
+ headers: COMMON_HEADERS
227
+ });
228
+ if (!response.ok) {
229
+ throw new BlockError(response.status);
230
+ }
231
+ return await response.json();
221
232
  };
@@ -56,6 +56,31 @@ const getConfluenceSourceInfo = async ari => {
56
56
  }
57
57
  return await response.json();
58
58
  };
59
+ const resolveNoAccessPageInfo = async ari => {
60
+ const response = await fetch('/gateway/api/object-resolver/resolve/ari', {
61
+ method: 'POST',
62
+ headers: {
63
+ 'Content-Type': 'application/json',
64
+ Accept: 'application/json'
65
+ },
66
+ body: JSON.stringify({
67
+ ari
68
+ })
69
+ });
70
+ if (response.ok) {
71
+ var _payload$data, _payload$data2;
72
+ const payload = await response.json();
73
+ const url = payload === null || payload === void 0 ? void 0 : (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.url;
74
+ const title = payload === null || payload === void 0 ? void 0 : (_payload$data2 = payload.data) === null || _payload$data2 === void 0 ? void 0 : _payload$data2.name;
75
+ return {
76
+ url: typeof url === 'string' ? url : undefined,
77
+ title: typeof title === 'string' ? title : undefined,
78
+ sourceAri: ari
79
+ };
80
+ } else {
81
+ throw new Error(`Failed to resolve ari: ${response.statusText}`);
82
+ }
83
+ };
59
84
  export const fetchConfluencePageInfoOld = async (pageAri, localId, fireAnalyticsEvent) => {
60
85
  try {
61
86
  var _response$data, _response$data$conten, _response$data$conten2, _contentData$space;
@@ -86,7 +111,8 @@ export const fetchConfluencePageInfoOld = async (pageAri, localId, fireAnalytics
86
111
  }
87
112
  return Promise.resolve({
88
113
  title,
89
- url
114
+ url,
115
+ sourceAri: pageAri
90
116
  });
91
117
  } catch (error) {
92
118
  logException(error, {
@@ -96,35 +122,44 @@ export const fetchConfluencePageInfoOld = async (pageAri, localId, fireAnalytics
96
122
  return Promise.resolve(undefined);
97
123
  }
98
124
  };
99
- export const fetchConfluencePageInfoNew = async (pageAri, localId) => {
100
- var _response$data2, _response$data2$conte, _response$data2$conte2, _contentData$space2;
101
- const {
102
- type: pageType
103
- } = getPageIdAndTypeFromConfluencePageAri({
104
- ari: pageAri
105
- });
106
- const response = await getConfluenceSourceInfo(pageAri);
107
- const contentData = (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : (_response$data2$conte = _response$data2.content) === null || _response$data2$conte === void 0 ? void 0 : (_response$data2$conte2 = _response$data2$conte.nodes) === null || _response$data2$conte2 === void 0 ? void 0 : _response$data2$conte2[0];
108
- const title = contentData === null || contentData === void 0 ? void 0 : contentData.title;
109
- let url;
110
- const {
111
- base
112
- } = (contentData === null || contentData === void 0 ? void 0 : contentData.links) || {};
113
- if (base && contentData !== null && contentData !== void 0 && (_contentData$space2 = contentData.space) !== null && _contentData$space2 !== void 0 && _contentData$space2.key && contentData !== null && contentData !== void 0 && contentData.id) {
114
- if (isBlogPageType(pageType)) {
115
- url = `${base}/spaces/${contentData.space.key}/blog/edit-v2/${contentData.id}`;
116
- } else if (contentData.subType === 'live') {
117
- url = `${base}/spaces/${contentData.space.key}/pages/${contentData.id}`;
118
- } else {
119
- url = `${base}/spaces/${contentData.space.key}/pages/edit-v2/${contentData.id}`;
125
+ export const fetchConfluencePageInfoNew = async (pageAri, hasAccess, urlType, localId) => {
126
+ if (hasAccess) {
127
+ var _response$data2, _response$data2$conte, _response$data2$conte2, _contentData$space2;
128
+ const {
129
+ type: pageType
130
+ } = getPageIdAndTypeFromConfluencePageAri({
131
+ ari: pageAri
132
+ });
133
+ const response = await getConfluenceSourceInfo(pageAri);
134
+ const contentData = (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : (_response$data2$conte = _response$data2.content) === null || _response$data2$conte === void 0 ? void 0 : (_response$data2$conte2 = _response$data2$conte.nodes) === null || _response$data2$conte2 === void 0 ? void 0 : _response$data2$conte2[0];
135
+ const {
136
+ title,
137
+ subType
138
+ } = contentData || {};
139
+ let url;
140
+ const {
141
+ base
142
+ } = (contentData === null || contentData === void 0 ? void 0 : contentData.links) || {};
143
+ if (base && contentData !== null && contentData !== void 0 && (_contentData$space2 = contentData.space) !== null && _contentData$space2 !== void 0 && _contentData$space2.key && contentData !== null && contentData !== void 0 && contentData.id) {
144
+ if (isBlogPageType(pageType)) {
145
+ url = `${base}/spaces/${contentData.space.key}/blog${urlType === 'edit' ? '/edit-v2' : ''}/${contentData.id}`;
146
+ } else if (contentData.subType === 'live') {
147
+ url = `${base}/spaces/${contentData.space.key}/pages/${contentData.id}`;
148
+ } else {
149
+ url = `${base}/spaces/${contentData.space.key}/pages${urlType === 'edit' ? '/edit-v2' : ''}/${contentData.id}`;
150
+ }
120
151
  }
152
+ url = url && localId ? `${url}#block-${localId}` : url;
153
+ return Promise.resolve({
154
+ title,
155
+ url,
156
+ sourceAri: pageAri,
157
+ subType
158
+ });
159
+ } else {
160
+ return await resolveNoAccessPageInfo(pageAri);
121
161
  }
122
- url = url && localId ? `${url}#block-${localId}` : url;
123
- return Promise.resolve({
124
- title,
125
- url
126
- });
127
162
  };
128
- export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEvent) => {
129
- return fg('platform_synced_block_dogfooding') ? await fetchConfluencePageInfoNew(pageAri, localId) : await fetchConfluencePageInfoOld(pageAri, localId, fireAnalyticsEvent);
163
+ export const fetchConfluencePageInfo = async (pageAri, hasAccess, urlType, localId, fireAnalyticsEvent) => {
164
+ return fg('platform_synced_block_dogfooding') ? await fetchConfluencePageInfoNew(pageAri, hasAccess, urlType, localId) : await fetchConfluencePageInfoOld(pageAri, localId, fireAnalyticsEvent);
130
165
  };