@atlaskit/editor-synced-block-provider 3.30.4 → 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 +16 -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 +55 -85
  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 +44 -62
  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 +55 -85
  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 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
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
+
11
+ ## 3.30.5
12
+
13
+ ### Patch Changes
14
+
15
+ - [`85444e8a5672a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/85444e8a5672a) -
16
+ EDITOR-5526 clean up platform_synced_block_patch_2
17
+ - Updated dependencies
18
+
3
19
  ## 3.30.4
4
20
 
5
21
  ### 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);
@@ -858,17 +861,12 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
858
861
  }, {
859
862
  key: "debouncedBatchedFetchSyncBlocks",
860
863
  value: function debouncedBatchedFetchSyncBlocks(resourceId) {
861
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
862
- // Only add to pending requests if there are active subscriptions for this resource
863
- if (this.subscriptions.has(resourceId) && Object.keys(this.subscriptions.get(resourceId) || {}).length > 0) {
864
- this.pendingFetchRequests.add(resourceId);
865
- this.scheduledBatchFetch();
866
- } else {
867
- this.pendingFetchRequests.delete(resourceId);
868
- }
869
- } else {
864
+ // Only add to pending requests if there are active subscriptions for this resource
865
+ if (this.subscriptions.has(resourceId) && Object.keys(this.subscriptions.get(resourceId) || {}).length > 0) {
870
866
  this.pendingFetchRequests.add(resourceId);
871
867
  this.scheduledBatchFetch();
868
+ } else {
869
+ this.pendingFetchRequests.delete(resourceId);
872
870
  }
873
871
  }
874
872
  }, {
@@ -1191,12 +1189,8 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1191
1189
  }
1192
1190
  return _context6.abrupt("return", true);
1193
1191
  case 2:
1194
- if (!(0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
1195
- _context6.next = 9;
1196
- break;
1197
- }
1198
1192
  if (!this.isFlushInProgress) {
1199
- _context6.next = 8;
1193
+ _context6.next = 7;
1200
1194
  break;
1201
1195
  }
1202
1196
  // Mark that another flush is needed after the current one completes
@@ -1204,27 +1198,22 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1204
1198
 
1205
1199
  // We return true here because we know the pending flush will handle the dirty cache
1206
1200
  return _context6.abrupt("return", true);
1207
- case 8:
1201
+ case 7:
1208
1202
  this.isFlushInProgress = true;
1209
- case 9:
1203
+ case 8:
1210
1204
  success = true; // a copy of the subscriptions STRUCTURE (without the callbacks)
1211
1205
  // To be saved as the last flushed structure if the flush is successful
1212
1206
  syncedBlocksToFlush = {};
1213
- _context6.prev = 11;
1207
+ _context6.prev = 10;
1214
1208
  if (this.dataProvider) {
1215
- _context6.next = 14;
1209
+ _context6.next = 13;
1216
1210
  break;
1217
1211
  }
1218
1212
  throw new Error('Data provider not set');
1219
- case 14:
1220
- blocks = [];
1221
- if (!(0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
1222
- _context6.next = 37;
1223
- break;
1224
- }
1225
- // First, build the complete subscription structure
1213
+ case 13:
1214
+ blocks = []; // First, build the complete subscription structure
1226
1215
  _iterator4 = _createForOfIteratorHelper(this.subscriptions.entries());
1227
- _context6.prev = 17;
1216
+ _context6.prev = 15;
1228
1217
  _loop2 = /*#__PURE__*/_regenerator.default.mark(function _loop2() {
1229
1218
  var _step4$value, resourceId, callbacks;
1230
1219
  return _regenerator.default.wrap(function _loop2$(_context5) {
@@ -1246,50 +1235,34 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1246
1235
  }, _loop2);
1247
1236
  });
1248
1237
  _iterator4.s();
1249
- case 20:
1238
+ case 18:
1250
1239
  if ((_step4 = _iterator4.n()).done) {
1251
- _context6.next = 24;
1240
+ _context6.next = 22;
1252
1241
  break;
1253
1242
  }
1254
- return _context6.delegateYield(_loop2(), "t0", 22);
1243
+ return _context6.delegateYield(_loop2(), "t0", 20);
1244
+ case 20:
1245
+ _context6.next = 18;
1246
+ break;
1255
1247
  case 22:
1256
- _context6.next = 20;
1248
+ _context6.next = 27;
1257
1249
  break;
1258
1250
  case 24:
1259
- _context6.next = 29;
1260
- break;
1261
- case 26:
1262
- _context6.prev = 26;
1263
- _context6.t1 = _context6["catch"](17);
1251
+ _context6.prev = 24;
1252
+ _context6.t1 = _context6["catch"](15);
1264
1253
  _iterator4.e(_context6.t1);
1265
- case 29:
1266
- _context6.prev = 29;
1254
+ case 27:
1255
+ _context6.prev = 27;
1267
1256
  _iterator4.f();
1268
- return _context6.finish(29);
1269
- case 32:
1257
+ return _context6.finish(27);
1258
+ case 30:
1270
1259
  if (!(0, _isEqual.default)(syncedBlocksToFlush, this.lastFlushedSyncedBlocks)) {
1271
- _context6.next = 35;
1260
+ _context6.next = 33;
1272
1261
  break;
1273
1262
  }
1274
1263
  this.isCacheDirty = false; // Reset since we're considering this a successful no-op flush
1275
1264
  return _context6.abrupt("return", true);
1276
- case 35:
1277
- _context6.next = 38;
1278
- break;
1279
- case 37:
1280
- // Collect all reference synced blocks on the current document
1281
- Array.from(this.subscriptions.entries()).forEach(function (_ref2) {
1282
- var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
1283
- resourceId = _ref3[0],
1284
- callbacks = _ref3[1];
1285
- Object.keys(callbacks).forEach(function (localId) {
1286
- blocks.push({
1287
- resourceId: resourceId,
1288
- localId: localId
1289
- });
1290
- });
1291
- });
1292
- case 38:
1265
+ case 33:
1293
1266
  // reset isCacheDirty early to prevent race condition
1294
1267
  // There is a race condition where if a user makes changes (create/delete) to a reference sync block
1295
1268
  // on a live page and the reference sync block is being saved while the user
@@ -1297,9 +1270,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1297
1270
  // exactly at a time when the updateReferenceData is being executed asynchronously.
1298
1271
  this.isCacheDirty = false;
1299
1272
  (_this$saveExperience = this.saveExperience) === null || _this$saveExperience === void 0 || _this$saveExperience.start();
1300
- _context6.next = 42;
1273
+ _context6.next = 37;
1301
1274
  return this.dataProvider.updateReferenceData(blocks);
1302
- case 42:
1275
+ case 37:
1303
1276
  updateResult = _context6.sent;
1304
1277
  if (!updateResult.success) {
1305
1278
  success = false;
@@ -1308,11 +1281,11 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1308
1281
  });
1309
1282
  (_this$fireAnalyticsEv1 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv1 === void 0 || _this$fireAnalyticsEv1.call(this, (0, _errorHandling.updateReferenceErrorPayload)(updateResult.error || 'Failed to update reference synced blocks on the document'));
1310
1283
  }
1311
- _context6.next = 52;
1284
+ _context6.next = 47;
1312
1285
  break;
1313
- case 46:
1314
- _context6.prev = 46;
1315
- _context6.t2 = _context6["catch"](11);
1286
+ case 41:
1287
+ _context6.prev = 41;
1288
+ _context6.t2 = _context6["catch"](10);
1316
1289
  success = false;
1317
1290
  (0, _monitoring.logException)(_context6.t2, {
1318
1291
  location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
@@ -1321,40 +1294,37 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
1321
1294
  reason: _context6.t2.message
1322
1295
  });
1323
1296
  (_this$fireAnalyticsEv10 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv10 === void 0 || _this$fireAnalyticsEv10.call(this, (0, _errorHandling.updateReferenceErrorPayload)(_context6.t2.message));
1324
- case 52:
1325
- _context6.prev = 52;
1297
+ case 47:
1298
+ _context6.prev = 47;
1326
1299
  if (!success) {
1327
1300
  // set isCacheDirty back to true for cases where it failed to update the reference synced blocks on the BE
1328
1301
  this.isCacheDirty = true;
1329
1302
  } else {
1330
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
1331
- this.lastFlushedSyncedBlocks = syncedBlocksToFlush;
1332
- }
1303
+ this.lastFlushedSyncedBlocks = syncedBlocksToFlush;
1333
1304
  (_this$saveExperience4 = this.saveExperience) === null || _this$saveExperience4 === void 0 || _this$saveExperience4.success();
1334
1305
  }
1335
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
1336
- // Always reset isFlushInProgress regardless of feature flag
1337
- this.isFlushInProgress = false;
1338
1306
 
1339
- // If another flush was requested while this one was in progress, execute it now
1340
- if (this.flushNeededAfterCurrent) {
1341
- this.flushNeededAfterCurrent = false;
1342
- // Use setTimeout to avoid deep recursion and run queued flush asynchronously
1343
- // Note: flush() handles all exceptions internally and never rejects
1344
- this.queuedFlushTimeout = setTimeout(function () {
1345
- _this11.queuedFlushTimeout = undefined;
1346
- void _this11.flush();
1347
- }, 0);
1348
- }
1307
+ // Always reset isFlushInProgress
1308
+ this.isFlushInProgress = false;
1309
+
1310
+ // If another flush was requested while this one was in progress, execute it now
1311
+ if (this.flushNeededAfterCurrent) {
1312
+ this.flushNeededAfterCurrent = false;
1313
+ // Use setTimeout to avoid deep recursion and run queued flush asynchronously
1314
+ // Note: flush() handles all exceptions internally and never rejects
1315
+ this.queuedFlushTimeout = setTimeout(function () {
1316
+ _this11.queuedFlushTimeout = undefined;
1317
+ void _this11.flush();
1318
+ }, 0);
1349
1319
  }
1350
- return _context6.finish(52);
1351
- case 56:
1320
+ return _context6.finish(47);
1321
+ case 52:
1352
1322
  return _context6.abrupt("return", success);
1353
- case 57:
1323
+ case 53:
1354
1324
  case "end":
1355
1325
  return _context6.stop();
1356
1326
  }
1357
- }, _callee4, this, [[11, 46, 52, 56], [17, 26, 29, 32]]);
1327
+ }, _callee4, this, [[10, 41, 47, 52], [15, 24, 27, 30]]);
1358
1328
  }));
1359
1329
  function flush() {
1360
1330
  return _flush.apply(this, arguments);
@@ -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