@atlaskit/editor-synced-block-provider 3.30.5 → 3.30.6

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 (44) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/clients/block-service/blockService.js +23 -16
  3. package/dist/cjs/clients/confluence/fetchMediaToken.js +7 -5
  4. package/dist/cjs/hooks/useFetchSyncBlockTitle.js +40 -2
  5. package/dist/cjs/hooks/useHandleContentChanges.js +3 -0
  6. package/dist/cjs/providers/syncBlockProvider.js +32 -2
  7. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +3 -0
  8. package/dist/cjs/store-manager/syncBlockStoreManager.js +20 -5
  9. package/dist/cjs/utils/experienceTracking.js +10 -10
  10. package/dist/cjs/utils/resourceId.js +2 -2
  11. package/dist/cjs/utils/retry.js +33 -7
  12. package/dist/cjs/utils/utils.js +1 -1
  13. package/dist/cjs/utils/validValue.js +2 -1
  14. package/dist/es2019/clients/block-service/blockService.js +20 -13
  15. package/dist/es2019/clients/confluence/fetchMediaToken.js +5 -3
  16. package/dist/es2019/hooks/useFetchSyncBlockTitle.js +36 -3
  17. package/dist/es2019/hooks/useHandleContentChanges.js +3 -0
  18. package/dist/es2019/providers/syncBlockProvider.js +30 -3
  19. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +3 -0
  20. package/dist/es2019/store-manager/syncBlockStoreManager.js +19 -6
  21. package/dist/es2019/utils/experienceTracking.js +10 -10
  22. package/dist/es2019/utils/resourceId.js +2 -2
  23. package/dist/es2019/utils/retry.js +26 -6
  24. package/dist/es2019/utils/utils.js +1 -1
  25. package/dist/es2019/utils/validValue.js +2 -1
  26. package/dist/esm/clients/block-service/blockService.js +23 -16
  27. package/dist/esm/clients/confluence/fetchMediaToken.js +7 -5
  28. package/dist/esm/hooks/useFetchSyncBlockTitle.js +41 -3
  29. package/dist/esm/hooks/useHandleContentChanges.js +3 -0
  30. package/dist/esm/providers/syncBlockProvider.js +33 -3
  31. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +3 -0
  32. package/dist/esm/store-manager/syncBlockStoreManager.js +21 -6
  33. package/dist/esm/utils/experienceTracking.js +10 -10
  34. package/dist/esm/utils/resourceId.js +2 -2
  35. package/dist/esm/utils/retry.js +33 -7
  36. package/dist/esm/utils/utils.js +1 -1
  37. package/dist/esm/utils/validValue.js +2 -1
  38. package/dist/types/providers/syncBlockProvider.d.ts +1 -1
  39. package/dist/types/store-manager/syncBlockStoreManager.d.ts +1 -1
  40. package/dist/types/utils/experienceTracking.d.ts +10 -10
  41. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +1 -1
  42. package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +1 -1
  43. package/dist/types-ts4.5/utils/experienceTracking.d.ts +10 -10
  44. package/package.json +5 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 3.30.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`e18437c28f9ab`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e18437c28f9ab) -
8
+ Improve synced blocks robustness.
9
+ - Updated dependencies
10
+
3
11
  ## 3.30.5
4
12
 
5
13
  ### Patch Changes
@@ -130,7 +130,7 @@ var BATCH_RETRIEVE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_BATCH_RETRIEVE_B
130
130
  var GET_BLOCK_REFERENCES_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_REFERENCES';
131
131
  var GET_BLOCK_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_BLOCK';
132
132
  var buildGetDocumentReferenceBlocksQuery = function buildGetDocumentReferenceBlocksQuery(documentAri) {
133
- return "query ".concat(GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME, " {\n\tblockService_getDocumentReferenceBlocks(documentAri: \"").concat(documentAri, "\") {\n\t\tblocks {\n\t\t\tblockAri\n\t\t\tblockInstanceId\n\t\t\tcontent\n\t\t\tcontentUpdatedAt\n\t\t\tcreatedAt\n\t\t\tcreatedBy\n\t\t\tproduct\n\t\t\tsourceAri\n\t\t\tstatus\n\t\t\tversion\n\t\t}\n\t\terrors {\n\t\t\tblockAri\n\t\t\tcode\n\t\t\treason\n\t\t}\n\t}\n}");
133
+ return "query ".concat(GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME, " {\n\tblockService_getDocumentReferenceBlocks(documentAri: ").concat((0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? JSON.stringify(documentAri) : "\"".concat(documentAri, "\""), ") {\n\t\tblocks {\n\t\t\tblockAri\n\t\t\tblockInstanceId\n\t\t\tcontent\n\t\t\tcontentUpdatedAt\n\t\t\tcreatedAt\n\t\t\tcreatedBy\n\t\t\tproduct\n\t\t\tsourceAri\n\t\t\tstatus\n\t\t\tversion\n\t\t}\n\t\terrors {\n\t\t\tblockAri\n\t\t\tcode\n\t\t\treason\n\t\t}\n\t}\n}");
134
134
  };
135
135
  var buildGetBlockQuery = function buildGetBlockQuery(blockAri) {
136
136
  return "query ".concat(GET_BLOCK_OPERATION_NAME, " {\n\tblockService_getBlock(blockAri: ").concat(JSON.stringify(blockAri), ") {\n\t\tblockAri\n\t\tblockInstanceId\n\t\tcontent\n\t\tcontentUpdatedAt\n\t\tcreatedAt\n\t\tcreatedBy\n\t\tdeletionReason\n\t\tproduct\n\t\tsourceAri\n\t\tstatus\n\t\tversion\n\t}\n}");
@@ -161,11 +161,17 @@ var buildDeleteBlockMutation = function buildDeleteBlockMutation(blockAri, delet
161
161
  * 'jira-work-item' -> 'JIRA_WORK_ITEM'
162
162
  */
163
163
  var convertProductToGraphQLEnum = function convertProductToGraphQLEnum(product) {
164
- if (product === 'confluence-page') {
165
- return 'CONFLUENCE_PAGE';
164
+ switch (product) {
165
+ case 'confluence-page':
166
+ return 'CONFLUENCE_PAGE';
167
+ case 'jira-work-item':
168
+ return 'JIRA_WORK_ITEM';
169
+ default:
170
+ {
171
+ var exhaustiveCheck = product;
172
+ throw new Error("Unsupported product: ".concat(exhaustiveCheck));
173
+ }
166
174
  }
167
- // product must be 'jira-work-item' at this point
168
- return 'JIRA_WORK_ITEM';
169
175
  };
170
176
  var buildCreateBlockMutation = function buildCreateBlockMutation(blockAri, blockInstanceId, content, product, sourceAri, stepVersion, status) {
171
177
  var inputParts = ["blockAri: ".concat(JSON.stringify(blockAri)), "blockInstanceId: ".concat(JSON.stringify(blockInstanceId)), "content: ".concat(JSON.stringify(content)), "product: ".concat(convertProductToGraphQLEnum(product)), "sourceAri: ".concat(JSON.stringify(sourceAri))];
@@ -336,8 +342,8 @@ var batchRetrieveSyncedBlocks = exports.batchRetrieveSyncedBlocks = /*#__PURE__*
336
342
  }();
337
343
  var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
338
344
  var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(_ref6) {
339
- var _result$data3;
340
- var blockAri, deleteReason, bodyData, url, response, result;
345
+ var _result$data3, _result$data4;
346
+ var blockAri, deleteReason, bodyData, url, response, result, isDeleted;
341
347
  return _regenerator.default.wrap(function _callee4$(_context4) {
342
348
  while (1) switch (_context4.prev = _context4.next) {
343
349
  case 0:
@@ -373,12 +379,13 @@ var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
373
379
  return e.message;
374
380
  }).join(', '));
375
381
  case 13:
376
- if ((_result$data3 = result.data) !== null && _result$data3 !== void 0 && _result$data3.blockService_deleteBlock.deleted) {
377
- _context4.next = 15;
382
+ isDeleted = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? (_result$data3 = result.data) === null || _result$data3 === void 0 || (_result$data3 = _result$data3.blockService_deleteBlock) === null || _result$data3 === void 0 ? void 0 : _result$data3.deleted : (_result$data4 = result.data) === null || _result$data4 === void 0 ? void 0 : _result$data4.blockService_deleteBlock.deleted;
383
+ if (isDeleted) {
384
+ _context4.next = 16;
378
385
  break;
379
386
  }
380
387
  throw new Error('Block deletion failed; deleted flag is false');
381
- case 15:
388
+ case 16:
382
389
  case "end":
383
390
  return _context4.stop();
384
391
  }
@@ -437,7 +444,7 @@ var updateSyncedBlock = exports.updateSyncedBlock = /*#__PURE__*/function () {
437
444
  }();
438
445
  var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
439
446
  var _ref1 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(_ref0) {
440
- var _result$data4;
447
+ var _result$data5;
441
448
  var blockAri, blockInstanceId, sourceAri, product, content, stepVersion, status, bodyData, url, response, result;
442
449
  return _regenerator.default.wrap(function _callee6$(_context6) {
443
450
  while (1) switch (_context6.prev = _context6.next) {
@@ -474,7 +481,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
474
481
  return e.message;
475
482
  }).join(', '));
476
483
  case 13:
477
- if ((_result$data4 = result.data) !== null && _result$data4 !== void 0 && _result$data4.blockService_createBlock) {
484
+ if ((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_createBlock) {
478
485
  _context6.next = 15;
479
486
  break;
480
487
  }
@@ -493,7 +500,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
493
500
  }();
494
501
  var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnDocument = /*#__PURE__*/function () {
495
502
  var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(_ref10) {
496
- var documentAri, blocks, _ref10$noContent, noContent, bodyData, url, response, result, _result$data5;
503
+ var documentAri, blocks, _ref10$noContent, noContent, bodyData, url, response, result, _result$data6;
497
504
  return _regenerator.default.wrap(function _callee7$(_context7) {
498
505
  while (1) switch (_context7.prev = _context7.next) {
499
506
  case 0:
@@ -534,7 +541,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
534
541
  _context7.next = 17;
535
542
  break;
536
543
  }
537
- if ((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_updateDocumentReferences) {
544
+ if ((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_updateDocumentReferences) {
538
545
  _context7.next = 16;
539
546
  break;
540
547
  }
@@ -553,7 +560,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
553
560
  }();
554
561
  var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlockAri = /*#__PURE__*/function () {
555
562
  var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(_ref12) {
556
- var _result$data6;
563
+ var _result$data7;
557
564
  var blockAri, bodyData, url, response, result, graphqlResponse;
558
565
  return _regenerator.default.wrap(function _callee8$(_context8) {
559
566
  while (1) switch (_context8.prev = _context8.next) {
@@ -590,7 +597,7 @@ var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlock
590
597
  return e.message;
591
598
  }).join(', '));
592
599
  case 13:
593
- if ((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_getReferences) {
600
+ if ((_result$data7 = result.data) !== null && _result$data7 !== void 0 && _result$data7.blockService_getReferences) {
594
601
  _context8.next = 15;
595
602
  break;
596
603
  }
@@ -9,6 +9,7 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
11
  var _monitoring = require("@atlaskit/editor-common/monitoring");
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
13
  var _retry = require("../../utils/retry");
13
14
  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; }
14
15
  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; }
@@ -66,7 +67,7 @@ var getContentMediaSession = /*#__PURE__*/function () {
66
67
  }();
67
68
  var fetchMediaToken = exports.fetchMediaToken = /*#__PURE__*/function () {
68
69
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(contentId) {
69
- var _response$data, _contentData$token, response, contentData, token, configuration, collection;
70
+ var _response$data, _contentData$token, response, contentData, token, configuration, collection, errorMsg;
70
71
  return _regenerator.default.wrap(function _callee2$(_context2) {
71
72
  while (1) switch (_context2.prev = _context2.next) {
72
73
  case 0:
@@ -85,19 +86,20 @@ var fetchMediaToken = exports.fetchMediaToken = /*#__PURE__*/function () {
85
86
  }
86
87
  throw new Error('Failed to get content media session data');
87
88
  case 10:
88
- return _context2.abrupt("return", Promise.resolve({
89
+ return _context2.abrupt("return", {
89
90
  config: configuration,
90
91
  token: token,
91
92
  collectionId: collection
92
- }));
93
+ });
93
94
  case 13:
94
95
  _context2.prev = 13;
95
96
  _context2.t0 = _context2["catch"](0);
96
97
  (0, _monitoring.logException)(_context2.t0, {
97
98
  location: 'editor-synced-block-provider/fetchMediaToken'
98
99
  });
99
- throw new Error("Failed to get content media session: ".concat(_context2.t0));
100
- case 17:
100
+ errorMsg = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? _context2.t0 instanceof Error ? _context2.t0.message : String(_context2.t0) : String(_context2.t0);
101
+ throw new Error("Failed to get content media session: ".concat(errorMsg));
102
+ case 18:
101
103
  case "end":
102
104
  return _context2.stop();
103
105
  }
@@ -7,7 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.useFetchSyncBlockTitle = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _react = require("react");
10
- var useFetchSyncBlockTitle = exports.useFetchSyncBlockTitle = function useFetchSyncBlockTitle(manager, syncBlockNode) {
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
+ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
12
+ var useFetchSyncBlockTitleBase = function useFetchSyncBlockTitleBase(manager, syncBlockNode) {
11
13
  // Initialize state from cache to prevent flickering during re-renders
12
14
  var _useState = (0, _react.useState)(function () {
13
15
  var _cachedData$data;
@@ -33,4 +35,40 @@ var useFetchSyncBlockTitle = exports.useFetchSyncBlockTitle = function useFetchS
33
35
  };
34
36
  }, [manager, syncBlockNode]);
35
37
  return sourceTitle;
36
- };
38
+ };
39
+ var useFetchSyncBlockTitlePatched = function useFetchSyncBlockTitlePatched(manager, syncBlockNode) {
40
+ var _syncBlockNode$attrs, _syncBlockNode$attrs2;
41
+ var nodeRef = (0, _react.useRef)(syncBlockNode);
42
+ nodeRef.current = syncBlockNode;
43
+ var nodeTypeName = syncBlockNode.type.name;
44
+ var resourceId = (_syncBlockNode$attrs = syncBlockNode.attrs) === null || _syncBlockNode$attrs === void 0 ? void 0 : _syncBlockNode$attrs.resourceId;
45
+ var localId = (_syncBlockNode$attrs2 = syncBlockNode.attrs) === null || _syncBlockNode$attrs2 === void 0 ? void 0 : _syncBlockNode$attrs2.localId;
46
+
47
+ // Initialize state from cache to prevent flickering during re-renders
48
+ var _useState3 = (0, _react.useState)(function () {
49
+ var _cachedData$data2;
50
+ if (nodeTypeName !== 'syncBlock') {
51
+ return undefined;
52
+ }
53
+ if (!resourceId) {
54
+ return undefined;
55
+ }
56
+ var cachedData = manager.referenceManager.getFromCache(resourceId);
57
+ return cachedData === null || cachedData === void 0 || (_cachedData$data2 = cachedData.data) === null || _cachedData$data2 === void 0 ? void 0 : _cachedData$data2.sourceTitle;
58
+ }),
59
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
60
+ sourceTitle = _useState4[0],
61
+ setSourceTitle = _useState4[1];
62
+ (0, _react.useEffect)(function () {
63
+ var unsubscribe = manager.referenceManager.subscribeToSourceTitle(nodeRef.current, function (title) {
64
+ setSourceTitle(title);
65
+ });
66
+ return function () {
67
+ unsubscribe();
68
+ };
69
+ }, [manager, nodeTypeName, resourceId, localId]);
70
+ return sourceTitle;
71
+ };
72
+ var useFetchSyncBlockTitle = exports.useFetchSyncBlockTitle = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
73
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
74
+ }, useFetchSyncBlockTitlePatched, useFetchSyncBlockTitleBase);
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.useHandleContentChanges = void 0;
7
7
  var _react = require("react");
8
8
  var useHandleContentChanges = exports.useHandleContentChanges = function useHandleContentChanges(manager, syncBlockNode) {
9
+ // syncBlockNode is intentionally in deps — its reference changes when the
10
+ // node content is modified by a ProseMirror transaction, which is exactly
11
+ // when the source manager cache needs to be updated.
9
12
  (0, _react.useEffect)(function () {
10
13
  manager.sourceManager.updateSyncBlockData(syncBlockNode);
11
14
  }, [manager, syncBlockNode]);
@@ -15,6 +15,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
15
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
  var _react = require("react");
17
17
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
+ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
18
19
  var _ari = require("../clients/block-service/ari");
19
20
  var _ari2 = require("../clients/confluence/ari");
20
21
  var _sourceInfo2 = require("../clients/confluence/sourceInfo");
@@ -451,7 +452,7 @@ var createSyncedBlockProvider = function createSyncedBlockProvider(_ref) {
451
452
  writeProvider = _ref.writeProvider;
452
453
  return new SyncedBlockProvider(fetchProvider, writeProvider);
453
454
  };
454
- var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvider(_ref2) {
455
+ var useMemoizedSyncedBlockProviderBase = function useMemoizedSyncedBlockProviderBase(_ref2) {
455
456
  var fetchProvider = _ref2.fetchProvider,
456
457
  writeProvider = _ref2.writeProvider,
457
458
  providerOptions = _ref2.providerOptions,
@@ -468,4 +469,33 @@ var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = fu
468
469
  syncBlockProvider.setSSRData(ssrData);
469
470
  }
470
471
  return syncBlockProvider;
471
- };
472
+ };
473
+ var useMemoizedSyncedBlockProviderPatched = function useMemoizedSyncedBlockProviderPatched(_ref3) {
474
+ var fetchProvider = _ref3.fetchProvider,
475
+ writeProvider = _ref3.writeProvider,
476
+ providerOptions = _ref3.providerOptions,
477
+ getSSRData = _ref3.getSSRData;
478
+ var syncBlockProvider = (0, _react.useMemo)(function () {
479
+ return createSyncedBlockProvider({
480
+ fetchProvider: fetchProvider,
481
+ writeProvider: writeProvider
482
+ });
483
+ }, [fetchProvider, writeProvider]);
484
+ var prevProviderOptionsRef = (0, _react.useRef)(undefined);
485
+ if (providerOptions !== prevProviderOptionsRef.current) {
486
+ prevProviderOptionsRef.current = providerOptions;
487
+ syncBlockProvider.setProviderOptions(providerOptions);
488
+ }
489
+ var prevSSRDataRef = (0, _react.useRef)(undefined);
490
+ var ssrData = getSSRData === null || getSSRData === void 0 ? void 0 : getSSRData();
491
+ if (ssrData !== prevSSRDataRef.current) {
492
+ prevSSRDataRef.current = ssrData;
493
+ if (ssrData) {
494
+ syncBlockProvider.setSSRData(ssrData);
495
+ }
496
+ }
497
+ return syncBlockProvider;
498
+ };
499
+ var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
500
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
501
+ }, useMemoizedSyncedBlockProviderPatched, useMemoizedSyncedBlockProviderBase);
@@ -392,6 +392,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
392
392
  value: function handleGraphQLSubscriptionUpdate(syncBlockInstance) {
393
393
  var _this5 = this;
394
394
  if (!syncBlockInstance.resourceId) {
395
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_4')) {
396
+ return;
397
+ }
395
398
  throw new Error('Sync block instance provided to graphql subscription update missing resource id');
396
399
  }
397
400
  var existingSyncBlock = this.getFromCache(syncBlockInstance.resourceId);
@@ -12,6 +12,8 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
12
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
13
  var _react = require("react");
14
14
  var _monitoring = require("@atlaskit/editor-common/monitoring");
15
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
+ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
15
17
  var _ari = require("../clients/block-service/ari");
16
18
  var _types = require("../common/types");
17
19
  var _errorHandling = require("../utils/errorHandling");
@@ -28,7 +30,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
28
30
  var SyncBlockStoreManager = exports.SyncBlockStoreManager = /*#__PURE__*/function () {
29
31
  function SyncBlockStoreManager(dataProvider) {
30
32
  (0, _classCallCheck2.default)(this, SyncBlockStoreManager);
31
- // In future, if reference manager needs to reach to source manager and read it's current in memorey cache
33
+ // In future, if reference manager needs to reach to source manager and read its current in memory cache
32
34
  // we can pass the source manager as a parameter to the reference manager constructor
33
35
  this.sourceSyncBlockStoreManager = new _sourceSyncBlockStoreManager.SourceSyncBlockStoreManager(dataProvider);
34
36
  this.referenceSyncBlockStoreManager = new _referenceSyncBlockStoreManager.ReferenceSyncBlockStoreManager(dataProvider);
@@ -200,11 +202,24 @@ var SyncBlockStoreManager = exports.SyncBlockStoreManager = /*#__PURE__*/functio
200
202
  var createSyncBlockStoreManager = function createSyncBlockStoreManager(dataProvider) {
201
203
  return new SyncBlockStoreManager(dataProvider);
202
204
  };
203
- var useMemoizedSyncBlockStoreManager = exports.useMemoizedSyncBlockStoreManager = function useMemoizedSyncBlockStoreManager(dataProvider, fireAnalyticsEvent) {
205
+ var useMemoizedSyncBlockStoreManagerBase = function useMemoizedSyncBlockStoreManagerBase(dataProvider, fireAnalyticsEvent) {
204
206
  var syncBlockStoreManager = (0, _react.useMemo)(function () {
205
- var syncBlockStoreManager = createSyncBlockStoreManager(dataProvider);
206
- return syncBlockStoreManager;
207
+ return createSyncBlockStoreManager(dataProvider);
207
208
  }, [dataProvider]);
208
209
  syncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
209
210
  return syncBlockStoreManager;
210
- };
211
+ };
212
+ var useMemoizedSyncBlockStoreManagerPatched = function useMemoizedSyncBlockStoreManagerPatched(dataProvider, fireAnalyticsEvent) {
213
+ var syncBlockStoreManager = (0, _react.useMemo)(function () {
214
+ return createSyncBlockStoreManager(dataProvider);
215
+ }, [dataProvider]);
216
+ var prevFireAnalyticsEventRef = (0, _react.useRef)(undefined);
217
+ if (fireAnalyticsEvent !== prevFireAnalyticsEventRef.current) {
218
+ prevFireAnalyticsEventRef.current = fireAnalyticsEvent;
219
+ syncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
220
+ }
221
+ return syncBlockStoreManager;
222
+ };
223
+ var useMemoizedSyncBlockStoreManager = exports.useMemoizedSyncBlockStoreManager = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
224
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
225
+ }, useMemoizedSyncBlockStoreManagerPatched, useMemoizedSyncBlockStoreManagerBase);
@@ -87,9 +87,9 @@ var getFetchSourceInfoExperience = exports.getFetchSourceInfoExperience = functi
87
87
  /**
88
88
  * This experience tracks when a source sync block is deleted from the BE.
89
89
  *
90
- * Start: When the fetchSourceInfo function is called.
91
- * Success: When the fetching the data is successful within the timeout duration of start.
92
- * Failure: When the timeout duration passes without the data being successfully fetched, or the fetch fails
90
+ * Start: When the delete source sync block function is called.
91
+ * Success: When the sync block deletion is successful within the timeout duration of start.
92
+ * Failure: When the timeout duration passes without the sync block being successfully deleted, or the deletion fails
93
93
  */
94
94
  var getDeleteSourceExperience = exports.getDeleteSourceExperience = function getDeleteSourceExperience(fireAnalyticsEvent) {
95
95
  return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
@@ -104,9 +104,9 @@ var getDeleteSourceExperience = exports.getDeleteSourceExperience = function get
104
104
  /**
105
105
  * This experience tracks when a source sync block is created and registered to the BE.
106
106
  *
107
- * Start: When the fetchSourceInfo function is called.
108
- * Success: When the fetching the data is successful within the timeout duration of start.
109
- * Failure: When the timeout duration passes without the data being successfully fetched, or the fetch fails
107
+ * Start: When the create source sync block function is called.
108
+ * Success: When the sync block creation is successful within the timeout duration of start.
109
+ * Failure: When the timeout duration passes without the sync block being successfully created, or the creation fails
110
110
  */
111
111
  var getCreateSourceExperience = exports.getCreateSourceExperience = function getCreateSourceExperience(fireAnalyticsEvent) {
112
112
  return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
@@ -119,11 +119,11 @@ var getCreateSourceExperience = exports.getCreateSourceExperience = function get
119
119
  };
120
120
 
121
121
  /**
122
- * This experience tracks when a source sync block is created and registered to the BE.
122
+ * This experience tracks when references for a sync block are fetched from the BE.
123
123
  *
124
- * Start: When the fetchSourceInfo function is called.
125
- * Success: When the fetching the data is successful within the timeout duration of start.
126
- * Failure: When the timeout duration passes without the data being successfully fetched, or the fetch fails
124
+ * Start: When the fetchReferences function is called.
125
+ * Success: When the fetching of references is successful within the timeout duration of start.
126
+ * Failure: When the timeout duration passes without references being successfully fetched, or the fetch fails
127
127
  */
128
128
  var getFetchReferencesExperience = exports.getFetchReferencesExperience = function getFetchReferencesExperience(fireAnalyticsEvent) {
129
129
  return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
@@ -19,7 +19,7 @@ var isSyncBlockProduct = function isSyncBlockProduct(product) {
19
19
  *
20
20
  * Format
21
21
  * - {product}/{contentId}/{uuid}
22
- * - product: a recognized `SyncBlockProduct` (e.g. 'confluence-page', 'jira-issue')
22
+ * - product: a recognized `SyncBlockProduct` (e.g. 'confluence-page', 'jira-work-item')
23
23
  * - contentId: the host content identifier (e.g. page ID or issue ID)
24
24
  * - uuid: the UUID for the specific synced block instance
25
25
  *
@@ -32,7 +32,7 @@ var isSyncBlockProduct = function isSyncBlockProduct(product) {
32
32
  * - No extra segments; returns `undefined` on any invalid input
33
33
  *
34
34
  * Notes
35
- * - `product` is a qualified domain like 'confluence-page' or 'jira-issue',
35
+ * - `product` is a qualified domain like 'confluence-page' or 'jira-work-item',
36
36
  * not just 'confluence' or 'jira'.
37
37
  */
38
38
 
@@ -7,10 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.fetchWithRetry = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
- var parseRetryAfter = function parseRetryAfter(retryAfter) {
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
+ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
12
+ var MAX_RETRY_DELAY = 30000;
13
+ var parseRetryAfterBase = function parseRetryAfterBase(retryAfter) {
11
14
  var newDelay;
12
15
 
13
- // retryAfter can either be in ms or HTTP date
16
+ // retryAfter can either be in seconds or HTTP date
14
17
  var parsedRetryAfter = parseInt(retryAfter);
15
18
  if (!isNaN(parsedRetryAfter)) {
16
19
  newDelay = parsedRetryAfter * 1000;
@@ -23,13 +26,35 @@ var parseRetryAfter = function parseRetryAfter(retryAfter) {
23
26
  }
24
27
  return newDelay;
25
28
  };
29
+ var parseRetryAfterPatched = function parseRetryAfterPatched(retryAfter) {
30
+ // retryAfter can either be in seconds or HTTP date
31
+ var parsedRetryAfter = parseInt(retryAfter, 10);
32
+ if (!isNaN(parsedRetryAfter) && parsedRetryAfter > 0) {
33
+ return parsedRetryAfter * 1000;
34
+ }
35
+ var retryDate = new Date(retryAfter);
36
+ if (isNaN(retryDate.getTime())) {
37
+ return undefined;
38
+ }
39
+ var delayFromDate = retryDate.getTime() - Date.now();
40
+ if (delayFromDate > 0) {
41
+ return delayFromDate;
42
+ }
43
+ return undefined;
44
+ };
45
+ var parseRetryAfter = (0, _platformFeatureFlagsReact.functionWithCondition)(function () {
46
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
47
+ }, parseRetryAfterPatched, parseRetryAfterBase);
26
48
  var _fetchWithRetry = exports.fetchWithRetry = /*#__PURE__*/function () {
27
49
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(url, options) {
50
+ var _ref2;
28
51
  var retriesRemaining,
29
52
  delay,
30
53
  response,
31
54
  shouldRetry,
32
55
  retryAfter,
56
+ parsedDelay,
57
+ retryDelay,
33
58
  _args = arguments;
34
59
  return _regenerator.default.wrap(function _callee$(_context) {
35
60
  while (1) switch (_context.prev = _context.next) {
@@ -48,14 +73,15 @@ var _fetchWithRetry = exports.fetchWithRetry = /*#__PURE__*/function () {
48
73
  return _context.abrupt("return", response);
49
74
  case 8:
50
75
  retryAfter = response.headers.get('Retry-After');
51
- _context.next = 11;
76
+ parsedDelay = (_ref2 = retryAfter ? parseRetryAfter(retryAfter) : undefined) !== null && _ref2 !== void 0 ? _ref2 : delay;
77
+ retryDelay = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? Math.min(parsedDelay, MAX_RETRY_DELAY) : parsedDelay;
78
+ _context.next = 13;
52
79
  return new Promise(function (resolve) {
53
- var _ref2;
54
- return setTimeout(resolve, (_ref2 = retryAfter ? parseRetryAfter(retryAfter) : undefined) !== null && _ref2 !== void 0 ? _ref2 : delay);
80
+ return setTimeout(resolve, retryDelay);
55
81
  });
56
- case 11:
82
+ case 13:
57
83
  return _context.abrupt("return", _fetchWithRetry(url, options, retriesRemaining - 1, delay * 2));
58
- case 12:
84
+ case 14:
59
85
  case "end":
60
86
  return _context.stop();
61
87
  }
@@ -40,7 +40,7 @@ var convertPMNodesToSyncBlockNodes = exports.convertPMNodesToSyncBlockNodes = fu
40
40
  return convertPMNodeToSyncBlockNode(node);
41
41
  }).filter(function (node) {
42
42
  return node !== undefined;
43
- }) || [];
43
+ });
44
44
  };
45
45
 
46
46
  /*
@@ -4,8 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.normaliseSyncBlockStatus = exports.normaliseSyncBlockProduct = void 0;
7
+ var _consts = require("../common/consts");
7
8
  var normaliseSyncBlockProduct = exports.normaliseSyncBlockProduct = function normaliseSyncBlockProduct(value) {
8
- return value === 'confluence-page' || value === 'jira-work-item' ? value : undefined;
9
+ return _consts.SYNC_BLOCK_PRODUCTS.includes(value) ? value : undefined;
9
10
  };
10
11
  var normaliseSyncBlockStatus = exports.normaliseSyncBlockStatus = function normaliseSyncBlockStatus(value) {
11
12
  return value === 'active' || value === 'unpublished' || value === 'deleted' ? value : undefined;
@@ -82,7 +82,7 @@ const BATCH_RETRIEVE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_BATCH_RETRIEVE
82
82
  const GET_BLOCK_REFERENCES_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_REFERENCES';
83
83
  const GET_BLOCK_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_BLOCK';
84
84
  const buildGetDocumentReferenceBlocksQuery = documentAri => `query ${GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME} {
85
- blockService_getDocumentReferenceBlocks(documentAri: "${documentAri}") {
85
+ blockService_getDocumentReferenceBlocks(documentAri: ${fg('platform_synced_block_patch_4') ? JSON.stringify(documentAri) : `"${documentAri}"`}) {
86
86
  blocks {
87
87
  blockAri
88
88
  blockInstanceId
@@ -151,11 +151,17 @@ const buildDeleteBlockMutation = (blockAri, deletionReason) => {
151
151
  * 'jira-work-item' -> 'JIRA_WORK_ITEM'
152
152
  */
153
153
  const convertProductToGraphQLEnum = product => {
154
- if (product === 'confluence-page') {
155
- return 'CONFLUENCE_PAGE';
154
+ switch (product) {
155
+ case 'confluence-page':
156
+ return 'CONFLUENCE_PAGE';
157
+ case 'jira-work-item':
158
+ return 'JIRA_WORK_ITEM';
159
+ default:
160
+ {
161
+ const exhaustiveCheck = product;
162
+ throw new Error(`Unsupported product: ${exhaustiveCheck}`);
163
+ }
156
164
  }
157
- // product must be 'jira-work-item' at this point
158
- return 'JIRA_WORK_ITEM';
159
165
  };
160
166
  const buildCreateBlockMutation = (blockAri, blockInstanceId, content, product, sourceAri, stepVersion, status) => {
161
167
  const inputParts = [`blockAri: ${JSON.stringify(blockAri)}`, `blockInstanceId: ${JSON.stringify(blockInstanceId)}`, `content: ${JSON.stringify(content)}`, `product: ${convertProductToGraphQLEnum(product)}`, `sourceAri: ${JSON.stringify(sourceAri)}`];
@@ -327,7 +333,7 @@ export const deleteSyncedBlock = async ({
327
333
  blockAri,
328
334
  deleteReason
329
335
  }) => {
330
- var _result$data3;
336
+ var _result$data3, _result$data3$blockSe, _result$data4;
331
337
  const bodyData = {
332
338
  query: buildDeleteBlockMutation(blockAri, deleteReason),
333
339
  operationName: DELETE_BLOCK_OPERATION_NAME
@@ -345,7 +351,8 @@ export const deleteSyncedBlock = async ({
345
351
  if (result.errors && result.errors.length > 0) {
346
352
  throw new Error(result.errors.map(e => e.message).join(', '));
347
353
  }
348
- if (!((_result$data3 = result.data) !== null && _result$data3 !== void 0 && _result$data3.blockService_deleteBlock.deleted)) {
354
+ const isDeleted = fg('platform_synced_block_patch_4') ? (_result$data3 = result.data) === null || _result$data3 === void 0 ? void 0 : (_result$data3$blockSe = _result$data3.blockService_deleteBlock) === null || _result$data3$blockSe === void 0 ? void 0 : _result$data3$blockSe.deleted : (_result$data4 = result.data) === null || _result$data4 === void 0 ? void 0 : _result$data4.blockService_deleteBlock.deleted;
355
+ if (!isDeleted) {
349
356
  throw new Error('Block deletion failed; deleted flag is false');
350
357
  }
351
358
  };
@@ -382,7 +389,7 @@ export const createSyncedBlock = async ({
382
389
  stepVersion,
383
390
  status
384
391
  }) => {
385
- var _result$data4;
392
+ var _result$data5;
386
393
  const bodyData = {
387
394
  query: buildCreateBlockMutation(blockAri, blockInstanceId, content, product, sourceAri, stepVersion, status),
388
395
  operationName: CREATE_BLOCK_OPERATION_NAME
@@ -400,7 +407,7 @@ export const createSyncedBlock = async ({
400
407
  if (result.errors && result.errors.length > 0) {
401
408
  throw new Error(result.errors.map(e => e.message).join(', '));
402
409
  }
403
- if (!((_result$data4 = result.data) !== null && _result$data4 !== void 0 && _result$data4.blockService_createBlock)) {
410
+ if (!((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_createBlock)) {
404
411
  throw new Error('No data returned from GraphQL mutation');
405
412
  }
406
413
  return result.data.blockService_createBlock;
@@ -429,8 +436,8 @@ export const updateReferenceSyncedBlockOnDocument = async ({
429
436
  throw new Error(result.errors.map(e => e.message).join(', '));
430
437
  }
431
438
  if (!noContent) {
432
- var _result$data5;
433
- if (!((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_updateDocumentReferences)) {
439
+ var _result$data6;
440
+ if (!((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_updateDocumentReferences)) {
434
441
  throw new Error('No data returned from GraphQL mutation');
435
442
  }
436
443
  return result.data.blockService_updateDocumentReferences;
@@ -439,7 +446,7 @@ export const updateReferenceSyncedBlockOnDocument = async ({
439
446
  export const getReferenceSyncedBlocksByBlockAri = async ({
440
447
  blockAri
441
448
  }) => {
442
- var _result$data6;
449
+ var _result$data7;
443
450
  const bodyData = {
444
451
  query: buildGetBlockReferencesQuery(blockAri),
445
452
  operationName: GET_BLOCK_REFERENCES_OPERATION_NAME
@@ -457,7 +464,7 @@ export const getReferenceSyncedBlocksByBlockAri = async ({
457
464
  if (result.errors && result.errors.length > 0) {
458
465
  throw new Error(result.errors.map(e => e.message).join(', '));
459
466
  }
460
- if (!((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_getReferences)) {
467
+ if (!((_result$data7 = result.data) !== null && _result$data7 !== void 0 && _result$data7.blockService_getReferences)) {
461
468
  throw new Error('No data returned from GraphQL query');
462
469
  }
463
470
  const graphqlResponse = result.data.blockService_getReferences;
@@ -1,4 +1,5 @@
1
1
  import { logException } from '@atlaskit/editor-common/monitoring';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { fetchWithRetry } from '../../utils/retry';
3
4
  const COMMON_HEADERS = {
4
5
  'Content-Type': 'application/json',
@@ -54,15 +55,16 @@ export const fetchMediaToken = async contentId => {
54
55
  if (!token || !configuration || !collection) {
55
56
  throw new Error('Failed to get content media session data');
56
57
  }
57
- return Promise.resolve({
58
+ return {
58
59
  config: configuration,
59
60
  token,
60
61
  collectionId: collection
61
- });
62
+ };
62
63
  } catch (error) {
63
64
  logException(error, {
64
65
  location: 'editor-synced-block-provider/fetchMediaToken'
65
66
  });
66
- throw new Error(`Failed to get content media session: ${error}`);
67
+ const errorMsg = fg('platform_synced_block_patch_4') ? error instanceof Error ? error.message : String(error) : String(error);
68
+ throw new Error(`Failed to get content media session: ${errorMsg}`);
67
69
  }
68
70
  };