@atlaskit/editor-synced-block-provider 3.5.5 → 3.6.1

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 (71) hide show
  1. package/CHANGELOG.md +21 -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 +150 -19
  5. package/dist/cjs/common/consts.js +7 -0
  6. package/dist/cjs/hooks/useFetchSyncBlockData.js +10 -2
  7. package/dist/cjs/index.js +7 -0
  8. package/dist/cjs/providers/block-service/blockServiceAPI.js +195 -125
  9. package/dist/cjs/providers/syncBlockProvider.js +83 -14
  10. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +267 -63
  11. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +134 -34
  12. package/dist/cjs/store-manager/syncBlockStoreManager.js +121 -0
  13. package/dist/cjs/utils/errorHandling.js +4 -1
  14. package/dist/cjs/utils/parseResourceId.js +38 -0
  15. package/dist/es2019/clients/block-service/ari.js +11 -0
  16. package/dist/es2019/clients/block-service/blockService.js +12 -1
  17. package/dist/es2019/clients/confluence/sourceInfo.js +70 -2
  18. package/dist/es2019/common/consts.js +1 -0
  19. package/dist/es2019/hooks/useFetchSyncBlockData.js +10 -1
  20. package/dist/es2019/index.js +1 -0
  21. package/dist/es2019/providers/block-service/blockServiceAPI.js +45 -2
  22. package/dist/es2019/providers/syncBlockProvider.js +37 -5
  23. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +249 -39
  24. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +101 -16
  25. package/dist/es2019/store-manager/syncBlockStoreManager.js +64 -0
  26. package/dist/es2019/utils/errorHandling.js +2 -1
  27. package/dist/es2019/utils/parseResourceId.js +25 -0
  28. package/dist/esm/clients/block-service/ari.js +11 -0
  29. package/dist/esm/clients/block-service/blockService.js +34 -1
  30. package/dist/esm/clients/confluence/sourceInfo.js +149 -18
  31. package/dist/esm/common/consts.js +1 -0
  32. package/dist/esm/hooks/useFetchSyncBlockData.js +10 -2
  33. package/dist/esm/index.js +1 -0
  34. package/dist/esm/providers/block-service/blockServiceAPI.js +195 -125
  35. package/dist/esm/providers/syncBlockProvider.js +81 -12
  36. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +267 -63
  37. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +135 -35
  38. package/dist/esm/store-manager/syncBlockStoreManager.js +121 -0
  39. package/dist/esm/utils/errorHandling.js +3 -0
  40. package/dist/esm/utils/parseResourceId.js +31 -0
  41. package/dist/types/clients/block-service/ari.d.ts +1 -0
  42. package/dist/types/clients/block-service/blockService.d.ts +15 -5
  43. package/dist/types/clients/confluence/sourceInfo.d.ts +3 -1
  44. package/dist/types/common/consts.d.ts +1 -0
  45. package/dist/types/common/types.d.ts +27 -1
  46. package/dist/types/hooks/useFetchSyncBlockData.d.ts +6 -1
  47. package/dist/types/index.d.ts +3 -2
  48. package/dist/types/providers/block-service/blockServiceAPI.d.ts +3 -2
  49. package/dist/types/providers/syncBlockProvider.d.ts +3 -2
  50. package/dist/types/providers/types.d.ts +15 -2
  51. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +11 -2
  52. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +7 -2
  53. package/dist/types/store-manager/syncBlockStoreManager.d.ts +4 -0
  54. package/dist/types/utils/errorHandling.d.ts +1 -0
  55. package/dist/types/utils/parseResourceId.d.ts +6 -0
  56. package/dist/types-ts4.5/clients/block-service/ari.d.ts +1 -0
  57. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +15 -5
  58. package/dist/types-ts4.5/clients/confluence/sourceInfo.d.ts +3 -1
  59. package/dist/types-ts4.5/common/consts.d.ts +4 -0
  60. package/dist/types-ts4.5/common/types.d.ts +27 -1
  61. package/dist/types-ts4.5/hooks/useFetchSyncBlockData.d.ts +6 -1
  62. package/dist/types-ts4.5/index.d.ts +3 -2
  63. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +3 -2
  64. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +3 -2
  65. package/dist/types-ts4.5/providers/types.d.ts +15 -2
  66. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +11 -2
  67. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +7 -2
  68. package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +4 -0
  69. package/dist/types-ts4.5/utils/errorHandling.d.ts +1 -0
  70. package/dist/types-ts4.5/utils/parseResourceId.d.ts +6 -0
  71. package/package.json +2 -2
@@ -45,6 +45,16 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
45
45
  value: function setCreateExperience(createExperience) {
46
46
  this.createExperience = createExperience;
47
47
  }
48
+ }, {
49
+ key: "setSaveExperience",
50
+ value: function setSaveExperience(saveExperience) {
51
+ this.saveExperience = saveExperience;
52
+ }
53
+ }, {
54
+ key: "setDeleteExperience",
55
+ value: function setDeleteExperience(deleteExperience) {
56
+ this.deleteExperience = deleteExperience;
57
+ }
48
58
  }, {
49
59
  key: "isSourceBlock",
50
60
  value: function isSourceBlock(node) {
@@ -93,17 +103,11 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
93
103
  value: (function () {
94
104
  var _flush = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
95
105
  var _this2 = this;
96
- var bodiedSyncBlockNodes, bodiedSyncBlockData, writeResults, _this$fireAnalyticsEv2;
106
+ var bodiedSyncBlockNodes, bodiedSyncBlockData, _this$saveExperience, writeResults, successfulSaved, failedSave, _this$saveExperience2, _this$saveExperience3, _this$saveExperience4, _this$fireAnalyticsEv2;
97
107
  return _regenerator.default.wrap(function _callee$(_context) {
98
108
  while (1) switch (_context.prev = _context.next) {
99
109
  case 0:
100
110
  _context.prev = 0;
101
- if (this.dataProvider) {
102
- _context.next = 3;
103
- break;
104
- }
105
- throw new Error('Data provider not set');
106
- case 3:
107
111
  bodiedSyncBlockNodes = [];
108
112
  bodiedSyncBlockData = [];
109
113
  Array.from(this.syncBlockCache.values()).forEach(function (syncBlockData) {
@@ -128,14 +132,25 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
128
132
  }
129
133
  });
130
134
  if (!(bodiedSyncBlockNodes.length === 0)) {
131
- _context.next = 8;
135
+ _context.next = 6;
132
136
  break;
133
137
  }
134
138
  return _context.abrupt("return", Promise.resolve(true));
135
- case 8:
136
- _context.next = 10;
137
- return this.dataProvider.writeNodesData(bodiedSyncBlockNodes, bodiedSyncBlockData);
139
+ case 6:
140
+ // only start the save experience if we have sync blocks to save
141
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
142
+ (_this$saveExperience = this.saveExperience) === null || _this$saveExperience === void 0 || _this$saveExperience.start({});
143
+ }
144
+ ;
145
+ if (this.dataProvider) {
146
+ _context.next = 10;
147
+ break;
148
+ }
149
+ throw new Error('Data provider not set');
138
150
  case 10:
151
+ _context.next = 12;
152
+ return this.dataProvider.writeNodesData(bodiedSyncBlockNodes, bodiedSyncBlockData);
153
+ case 12:
139
154
  writeResults = _context.sent;
140
155
  writeResults.forEach(function (result) {
141
156
  // set isDirty to true for cases where it failed to save the sync block to the BE
@@ -146,37 +161,75 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
146
161
  }
147
162
  }
148
163
  });
164
+ successfulSaved = writeResults.filter(function (result) {
165
+ return result.resourceId && !result.error;
166
+ }).map(function (result) {
167
+ return {
168
+ resourceId: result.resourceId
169
+ };
170
+ });
171
+ failedSave = writeResults.filter(function (result) {
172
+ return !result.resourceId || result.error;
173
+ }).map(function (result) {
174
+ return {
175
+ resourceId: result.resourceId || 'unknown',
176
+ failReason: result.error || 'Failed to save sync blocks'
177
+ };
178
+ });
149
179
  if (!writeResults.every(function (result) {
150
180
  return result.resourceId && !result.error;
151
181
  })) {
152
- _context.next = 16;
182
+ _context.next = 22;
153
183
  break;
154
184
  }
185
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
186
+ (_this$saveExperience2 = this.saveExperience) === null || _this$saveExperience2 === void 0 || _this$saveExperience2.success({
187
+ metadata: {
188
+ successfulSaved: successfulSaved
189
+ }
190
+ });
191
+ }
192
+ ;
155
193
  return _context.abrupt("return", true);
156
- case 16:
157
- writeResults.filter(function (result) {
158
- return !result.resourceId || result.error;
159
- }).forEach(function (result) {
160
- var _this2$fireAnalyticsE;
161
- (_this2$fireAnalyticsE = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE === void 0 || _this2$fireAnalyticsE.call(_this2, (0, _errorHandling.updateErrorPayload)(result.error || 'Failed to write data'));
162
- });
194
+ case 22:
195
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
196
+ (_this$saveExperience3 = this.saveExperience) === null || _this$saveExperience3 === void 0 || _this$saveExperience3.failure({
197
+ metadata: {
198
+ successfulSaved: successfulSaved,
199
+ failedSave: failedSave
200
+ }
201
+ });
202
+ } else {
203
+ writeResults.filter(function (result) {
204
+ return !result.resourceId || result.error;
205
+ }).forEach(function (result) {
206
+ var _this2$fireAnalyticsE;
207
+ (_this2$fireAnalyticsE = _this2.fireAnalyticsEvent) === null || _this2$fireAnalyticsE === void 0 || _this2$fireAnalyticsE.call(_this2, (0, _errorHandling.updateErrorPayload)(result.error || 'Failed to write data'));
208
+ });
209
+ }
163
210
  return _context.abrupt("return", false);
164
- case 18:
165
- _context.next = 25;
211
+ case 24:
212
+ _context.next = 31;
166
213
  break;
167
- case 20:
168
- _context.prev = 20;
214
+ case 26:
215
+ _context.prev = 26;
169
216
  _context.t0 = _context["catch"](0);
170
217
  (0, _monitoring.logException)(_context.t0, {
171
218
  location: 'editor-synced-block-provider/sourceSyncBlockStoreManager'
172
219
  });
173
- (_this$fireAnalyticsEv2 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv2 === void 0 || _this$fireAnalyticsEv2.call(this, (0, _errorHandling.updateErrorPayload)(_context.t0.message));
220
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
221
+ (_this$saveExperience4 = this.saveExperience) === null || _this$saveExperience4 === void 0 || _this$saveExperience4.failure({
222
+ reason: _context.t0.message
223
+ });
224
+ } else {
225
+ (_this$fireAnalyticsEv2 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv2 === void 0 || _this$fireAnalyticsEv2.call(this, (0, _errorHandling.updateErrorPayload)(_context.t0.message));
226
+ }
174
227
  return _context.abrupt("return", false);
175
- case 25:
228
+ case 31:
176
229
  case "end":
177
230
  return _context.stop();
178
231
  }
179
- }, _callee, this, [[0, 20]]);
232
+ }, _callee, this, [[0, 26]]);
180
233
  }));
181
234
  function flush() {
182
235
  return _flush.apply(this, arguments);
@@ -327,7 +380,7 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
327
380
  value: function () {
328
381
  var _delete2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(syncBlockIds, onDelete, onDeleteCompleted) {
329
382
  var _this5 = this;
330
- var results, callback, isDeleteSuccessful, _this$fireAnalyticsEv4;
383
+ var results, callback, isDeleteSuccessful, _this$deleteExperienc, successfulDeleted, failedDelete, _this$deleteExperienc2, _this$fireAnalyticsEv4;
331
384
  return _regenerator.default.wrap(function _callee2$(_context2) {
332
385
  while (1) switch (_context2.prev = _context2.next) {
333
386
  case 0:
@@ -361,12 +414,36 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
361
414
  callback = function callback(Ids) {
362
415
  _this5.setPendingDeletion(Ids, false);
363
416
  };
364
- results.filter(function (result) {
365
- return result.resourceId === undefined;
366
- }).forEach(function (result) {
367
- var _this5$fireAnalyticsE;
368
- (_this5$fireAnalyticsE = _this5.fireAnalyticsEvent) === null || _this5$fireAnalyticsE === void 0 || _this5$fireAnalyticsE.call(_this5, (0, _errorHandling.deleteErrorPayload)(result.error || 'Failed to delete synced block'));
369
- });
417
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
418
+ successfulDeleted = results.filter(function (result) {
419
+ return result.success;
420
+ }).map(function (result) {
421
+ return {
422
+ resourceId: result.resourceId
423
+ };
424
+ });
425
+ failedDelete = results.filter(function (result) {
426
+ return !result.success;
427
+ }).map(function (result) {
428
+ return {
429
+ resourceId: result.resourceId || 'unknown',
430
+ failReason: result.error || 'Failed to delete sync block'
431
+ };
432
+ });
433
+ (_this$deleteExperienc = this.deleteExperience) === null || _this$deleteExperienc === void 0 || _this$deleteExperienc.failure({
434
+ metadata: {
435
+ successfulDeleted: successfulDeleted,
436
+ failedDelete: failedDelete
437
+ }
438
+ });
439
+ } else {
440
+ results.filter(function (result) {
441
+ return result.resourceId === undefined;
442
+ }).forEach(function (result) {
443
+ var _this5$fireAnalyticsE;
444
+ (_this5$fireAnalyticsE = _this5.fireAnalyticsEvent) === null || _this5$fireAnalyticsE === void 0 || _this5$fireAnalyticsE.call(_this5, (0, _errorHandling.deleteErrorPayload)(result.error || 'Failed to delete synced block'));
445
+ });
446
+ }
370
447
  }
371
448
  syncBlockIds.forEach(callback);
372
449
  return _context2.abrupt("return", isDeleteSuccessful);
@@ -379,7 +456,13 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
379
456
  (0, _monitoring.logException)(_context2.t0, {
380
457
  location: 'editor-synced-block-provider/sourceSyncBlockStoreManager'
381
458
  });
382
- (_this$fireAnalyticsEv4 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv4 === void 0 || _this$fireAnalyticsEv4.call(this, (0, _errorHandling.deleteErrorPayload)(_context2.t0.message));
459
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
460
+ (_this$deleteExperienc2 = this.deleteExperience) === null || _this$deleteExperienc2 === void 0 || _this$deleteExperienc2.failure({
461
+ reason: _context2.t0.message
462
+ });
463
+ } else {
464
+ (_this$fireAnalyticsEv4 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv4 === void 0 || _this$fireAnalyticsEv4.call(this, (0, _errorHandling.deleteErrorPayload)(_context2.t0.message));
465
+ }
383
466
  onDeleteCompleted(false);
384
467
  return _context2.abrupt("return", false);
385
468
  case 21:
@@ -495,6 +578,23 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
495
578
  }
496
579
  return deleteSyncBlocksWithConfirmation;
497
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
+ }
498
598
  }, {
499
599
  key: "destroy",
500
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
  };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.parseResourceId = void 0;
8
+ var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
9
+ var _consts = require("../common/consts");
10
+ var isSyncBlockProduct = function isSyncBlockProduct(product) {
11
+ return _consts.SYNC_BLOCK_PRODUCTS.includes(product);
12
+ };
13
+ var parseResourceId = exports.parseResourceId = function parseResourceId(resourceId) {
14
+ if (!resourceId) {
15
+ return undefined;
16
+ }
17
+ var _resourceId$split = resourceId.split('/'),
18
+ _resourceId$split2 = (0, _toArray2.default)(_resourceId$split),
19
+ product = _resourceId$split2[0],
20
+ contentId = _resourceId$split2[1],
21
+ uuid = _resourceId$split2[2],
22
+ rest = _resourceId$split2.slice(3);
23
+
24
+ // invalid if any part is missing or there are extra parts
25
+ if (!product || !contentId || !uuid || rest.length > 0) {
26
+ return undefined;
27
+ }
28
+
29
+ // invalid if product is not recognized
30
+ if (!isSyncBlockProduct(product)) {
31
+ return undefined;
32
+ }
33
+ return {
34
+ product: product,
35
+ contentId: contentId,
36
+ uuid: uuid
37
+ };
38
+ };
@@ -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
  };
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable require-unicode-regexp */
2
2
 
3
3
  import { logException } from '@atlaskit/editor-common/monitoring';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { getSourceInfoErrorPayload } from '../../utils/errorHandling';
5
6
  import { fetchWithRetry } from '../../utils/retry';
6
7
  import { getPageIdAndTypeFromConfluencePageAri } from './ari';
@@ -55,7 +56,32 @@ const getConfluenceSourceInfo = async ari => {
55
56
  }
56
57
  return await response.json();
57
58
  };
58
- export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEvent) => {
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
+ };
84
+ export const fetchConfluencePageInfoOld = async (pageAri, localId, fireAnalyticsEvent) => {
59
85
  try {
60
86
  var _response$data, _response$data$conten, _response$data$conten2, _contentData$space;
61
87
  const {
@@ -85,7 +111,8 @@ export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEve
85
111
  }
86
112
  return Promise.resolve({
87
113
  title,
88
- url
114
+ url,
115
+ sourceAri: pageAri
89
116
  });
90
117
  } catch (error) {
91
118
  logException(error, {
@@ -94,4 +121,45 @@ export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEve
94
121
  fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(getSourceInfoErrorPayload(error.message));
95
122
  return Promise.resolve(undefined);
96
123
  }
124
+ };
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
+ }
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);
161
+ }
162
+ };
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);
97
165
  };
@@ -0,0 +1 @@
1
+ export const SYNC_BLOCK_PRODUCTS = ['confluence-page', 'jira-work-item'];
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
2
  import { logException } from '@atlaskit/editor-common/monitoring';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
3
4
  import { SyncBlockError } from '../common/types';
4
5
  import { fetchErrorPayload } from '../utils/errorHandling';
5
6
  import { createSyncBlockNode } from '../utils/utils';
@@ -45,7 +46,14 @@ export const useFetchSyncBlockData = (manager, resourceId, localId, fireAnalytic
45
46
  logException(error, {
46
47
  location: 'editor-synced-block-provider/useFetchSyncBlockData'
47
48
  });
48
- fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(fetchErrorPayload(error.message));
49
+ if (fg('platform_synced_block_dogfooding')) {
50
+ var _manager$referenceMan2, _manager$referenceMan3;
51
+ manager === null || manager === void 0 ? void 0 : (_manager$referenceMan2 = manager.referenceManager) === null || _manager$referenceMan2 === void 0 ? void 0 : (_manager$referenceMan3 = _manager$referenceMan2.fetchExperience) === null || _manager$referenceMan3 === void 0 ? void 0 : _manager$referenceMan3.failure({
52
+ reason: error.message
53
+ });
54
+ } else {
55
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(fetchErrorPayload(error.message));
56
+ }
49
57
 
50
58
  // Set error state if fetching fails
51
59
  setFetchState({
@@ -75,6 +83,7 @@ export const useFetchSyncBlockData = (manager, resourceId, localId, fireAnalytic
75
83
  }, [localId, manager.referenceManager, resourceId]);
76
84
  return {
77
85
  isLoading,
86
+ ssrProviders: resourceId ? manager.referenceManager.getSSRProviders(resourceId) : null,
78
87
  providerFactory: manager.referenceManager.getProviderFactory(resourceId || ''),
79
88
  reloadData,
80
89
  syncBlockInstance
@@ -25,6 +25,7 @@ export { SyncBlockStoreManager, useMemoizedSyncBlockStoreManager } from './store
25
25
 
26
26
  // utils
27
27
  export { resolveSyncBlockInstance } from './utils/resolveSyncBlockInstance';
28
+ export { parseResourceId } from './utils/parseResourceId';
28
29
  export { createSyncBlockNode, convertSyncBlockPMNodeToSyncBlockData, convertSyncBlockJSONNodeToSyncBlockNode, convertPMNodesToSyncBlockNodes, getContentIdAndProductFromResourceId } from './utils/utils';
29
30
  export { fetchErrorPayload } from './utils/errorHandling';
30
31
  export { fetchReferences } from './providers/block-service/blockServiceAPI';