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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/clients/block-service/blockService.js +121 -17
  3. package/dist/cjs/clients/block-service/blockSubscription.js +48 -3
  4. package/dist/cjs/clients/confluence/fetchMediaToken.js +7 -5
  5. package/dist/cjs/hooks/useFetchSyncBlockTitle.js +40 -2
  6. package/dist/cjs/hooks/useHandleContentChanges.js +3 -0
  7. package/dist/cjs/index.js +12 -33
  8. package/dist/cjs/providers/block-service/blockServiceAPI.js +509 -185
  9. package/dist/cjs/providers/syncBlockProvider.js +68 -6
  10. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +3 -0
  11. package/dist/cjs/store-manager/syncBlockStoreManager.js +20 -5
  12. package/dist/cjs/utils/experienceTracking.js +10 -10
  13. package/dist/cjs/utils/resourceId.js +2 -2
  14. package/dist/cjs/utils/retry.js +33 -7
  15. package/dist/cjs/utils/utils.js +1 -1
  16. package/dist/cjs/utils/validValue.js +2 -1
  17. package/dist/es2019/clients/block-service/blockService.js +108 -13
  18. package/dist/es2019/clients/block-service/blockSubscription.js +62 -2
  19. package/dist/es2019/clients/confluence/fetchMediaToken.js +5 -3
  20. package/dist/es2019/hooks/useFetchSyncBlockTitle.js +36 -3
  21. package/dist/es2019/hooks/useHandleContentChanges.js +3 -0
  22. package/dist/es2019/index.js +2 -6
  23. package/dist/es2019/providers/block-service/blockServiceAPI.js +172 -23
  24. package/dist/es2019/providers/syncBlockProvider.js +56 -3
  25. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +3 -0
  26. package/dist/es2019/store-manager/syncBlockStoreManager.js +19 -6
  27. package/dist/es2019/utils/experienceTracking.js +10 -10
  28. package/dist/es2019/utils/resourceId.js +2 -2
  29. package/dist/es2019/utils/retry.js +26 -6
  30. package/dist/es2019/utils/utils.js +1 -1
  31. package/dist/es2019/utils/validValue.js +2 -1
  32. package/dist/esm/clients/block-service/blockService.js +120 -16
  33. package/dist/esm/clients/block-service/blockSubscription.js +47 -2
  34. package/dist/esm/clients/confluence/fetchMediaToken.js +7 -5
  35. package/dist/esm/hooks/useFetchSyncBlockTitle.js +41 -3
  36. package/dist/esm/hooks/useHandleContentChanges.js +3 -0
  37. package/dist/esm/index.js +2 -6
  38. package/dist/esm/providers/block-service/blockServiceAPI.js +513 -189
  39. package/dist/esm/providers/syncBlockProvider.js +69 -7
  40. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +3 -0
  41. package/dist/esm/store-manager/syncBlockStoreManager.js +21 -6
  42. package/dist/esm/utils/experienceTracking.js +10 -10
  43. package/dist/esm/utils/resourceId.js +2 -2
  44. package/dist/esm/utils/retry.js +33 -7
  45. package/dist/esm/utils/utils.js +1 -1
  46. package/dist/esm/utils/validValue.js +2 -1
  47. package/dist/types/clients/block-service/blockService.d.ts +36 -0
  48. package/dist/types/clients/block-service/blockSubscription.d.ts +26 -1
  49. package/dist/types/index.d.ts +2 -6
  50. package/dist/types/providers/block-service/blockServiceAPI.d.ts +15 -7
  51. package/dist/types/providers/syncBlockProvider.d.ts +1 -1
  52. package/dist/types/providers/types.d.ts +6 -0
  53. package/dist/types/store-manager/syncBlockStoreManager.d.ts +1 -1
  54. package/dist/types/utils/experienceTracking.d.ts +10 -10
  55. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +36 -0
  56. package/dist/types-ts4.5/clients/block-service/blockSubscription.d.ts +26 -1
  57. package/dist/types-ts4.5/index.d.ts +2 -6
  58. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +15 -7
  59. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +1 -1
  60. package/dist/types-ts4.5/providers/types.d.ts +6 -0
  61. package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +1 -1
  62. package/dist/types-ts4.5/utils/experienceTracking.d.ts +10 -10
  63. package/package.json +5 -2
  64. package/dist/cjs/clients/block-service/sharedSubscriptionUtils.js +0 -82
  65. package/dist/cjs/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +0 -94
  66. package/dist/cjs/utils/relayResponseConverter.js +0 -76
  67. package/dist/cjs/utils/relaySubscriptionUtils.js +0 -130
  68. package/dist/es2019/clients/block-service/sharedSubscriptionUtils.js +0 -91
  69. package/dist/es2019/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +0 -88
  70. package/dist/es2019/utils/relayResponseConverter.js +0 -69
  71. package/dist/es2019/utils/relaySubscriptionUtils.js +0 -125
  72. package/dist/esm/clients/block-service/sharedSubscriptionUtils.js +0 -76
  73. package/dist/esm/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +0 -88
  74. package/dist/esm/utils/relayResponseConverter.js +0 -69
  75. package/dist/esm/utils/relaySubscriptionUtils.js +0 -123
  76. package/dist/types/clients/block-service/sharedSubscriptionUtils.d.ts +0 -61
  77. package/dist/types/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +0 -31
  78. package/dist/types/utils/relayResponseConverter.d.ts +0 -47
  79. package/dist/types/utils/relaySubscriptionUtils.d.ts +0 -61
  80. package/dist/types-ts4.5/clients/block-service/sharedSubscriptionUtils.d.ts +0 -61
  81. package/dist/types-ts4.5/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +0 -31
  82. package/dist/types-ts4.5/utils/relayResponseConverter.d.ts +0 -47
  83. package/dist/types-ts4.5/utils/relaySubscriptionUtils.d.ts +0 -61
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 3.31.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`6590226f4f11a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6590226f4f11a) -
8
+ EDITOR-2914 implement bulk update for synced blocks
9
+
10
+ ### Patch Changes
11
+
12
+ - [`f4633c591d70f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f4633c591d70f) -
13
+ Revert 610719f because the query stopped sending
14
+ - Updated dependencies
15
+
16
+ ## 3.30.6
17
+
18
+ ### Patch Changes
19
+
20
+ - [`e18437c28f9ab`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e18437c28f9ab) -
21
+ Improve synced blocks robustness.
22
+ - Updated dependencies
23
+
3
24
  ## 3.30.5
4
25
 
5
26
  ### Patch Changes
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.updateSyncedBlock = exports.updateReferenceSyncedBlockOnDocument = exports.isBlockContentResponse = exports.getSyncedBlockContent = exports.getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocks = exports.deleteSyncedBlock = exports.createSyncedBlock = exports.batchRetrieveSyncedBlocks = exports.BlockError = void 0;
7
+ exports.updateSyncedBlocks = exports.updateSyncedBlock = exports.updateReferenceSyncedBlockOnDocument = exports.isBlockContentResponse = exports.getSyncedBlockContent = exports.getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocks = exports.deleteSyncedBlock = exports.createSyncedBlock = exports.batchRetrieveSyncedBlocks = exports.BlockError = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
@@ -129,8 +129,9 @@ var UPDATE_DOCUMENT_REFERENCES_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_UPDATE_DOCU
129
129
  var BATCH_RETRIEVE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_BATCH_RETRIEVE_BLOCKS';
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
+ var BATCH_UPDATE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_BATCH_UPDATE_BLOCKS';
132
133
  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}");
134
+ 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
135
  };
135
136
  var buildGetBlockQuery = function buildGetBlockQuery(blockAri) {
136
137
  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 +162,17 @@ var buildDeleteBlockMutation = function buildDeleteBlockMutation(blockAri, delet
161
162
  * 'jira-work-item' -> 'JIRA_WORK_ITEM'
162
163
  */
163
164
  var convertProductToGraphQLEnum = function convertProductToGraphQLEnum(product) {
164
- if (product === 'confluence-page') {
165
- return 'CONFLUENCE_PAGE';
165
+ switch (product) {
166
+ case 'confluence-page':
167
+ return 'CONFLUENCE_PAGE';
168
+ case 'jira-work-item':
169
+ return 'JIRA_WORK_ITEM';
170
+ default:
171
+ {
172
+ var exhaustiveCheck = product;
173
+ throw new Error("Unsupported product: ".concat(exhaustiveCheck));
174
+ }
166
175
  }
167
- // product must be 'jira-work-item' at this point
168
- return 'JIRA_WORK_ITEM';
169
176
  };
170
177
  var buildCreateBlockMutation = function buildCreateBlockMutation(blockAri, blockInstanceId, content, product, sourceAri, stepVersion, status) {
171
178
  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))];
@@ -195,6 +202,19 @@ var buildBatchRetrieveBlocksQuery = function buildBatchRetrieveBlocksQuery(block
195
202
  var buildGetBlockReferencesQuery = function buildGetBlockReferencesQuery(blockAri) {
196
203
  return "query ".concat(GET_BLOCK_REFERENCES_OPERATION_NAME, " {\n\tblockService_getReferences(blockAri: ").concat(JSON.stringify(blockAri), ") {\n\t\treferences {\n\t\t\tblockAri\n\t\t\tblockInstanceId\n\t\t\tcreatedAt\n\t\t\tcreatedBy\n\t\t\tdocumentAri\n\t\t}\n\t\terrors {\n\t\t\tblockAri\n\t\t\tcode\n\t\t\treason\n\t\t}\n\t}\n}");
197
204
  };
205
+ var buildBatchUpdateBlocksMutation = function buildBatchUpdateBlocksMutation(blocks) {
206
+ var blocksArray = blocks.map(function (block) {
207
+ var inputParts = ["blockAri: ".concat(JSON.stringify(block.blockAri)), "content: ".concat(JSON.stringify(block.content))];
208
+ if (block.stepVersion !== undefined) {
209
+ inputParts.push("stepVersion: ".concat(block.stepVersion));
210
+ }
211
+ if (block.status !== undefined) {
212
+ inputParts.push("status: ".concat(JSON.stringify(block.status)));
213
+ }
214
+ return "{ ".concat(inputParts.join(', '), " }");
215
+ }).join(', ');
216
+ return "mutation ".concat(BATCH_UPDATE_BLOCKS_OPERATION_NAME, " {\n\tblockService_batchUpdateBlocks(input: { blocks: [").concat(blocksArray, "] }) {\n\t\tsuccess {\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\tdeletionReason\n\t\t\tproduct\n\t\t\tsourceAri\n\t\t\tstatus\n\t\t\tversion\n\t\t}\n\t\terror {\n\t\t\tblockAri\n\t\t\tcode\n\t\t\treason\n\t\t}\n\t}\n}");
217
+ };
198
218
  var BlockError = exports.BlockError = /*#__PURE__*/function (_Error) {
199
219
  function BlockError(status) {
200
220
  var _this;
@@ -336,8 +356,8 @@ var batchRetrieveSyncedBlocks = exports.batchRetrieveSyncedBlocks = /*#__PURE__*
336
356
  }();
337
357
  var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
338
358
  var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(_ref6) {
339
- var _result$data3;
340
- var blockAri, deleteReason, bodyData, url, response, result;
359
+ var _result$data3, _result$data4;
360
+ var blockAri, deleteReason, bodyData, url, response, result, isDeleted;
341
361
  return _regenerator.default.wrap(function _callee4$(_context4) {
342
362
  while (1) switch (_context4.prev = _context4.next) {
343
363
  case 0:
@@ -373,12 +393,13 @@ var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
373
393
  return e.message;
374
394
  }).join(', '));
375
395
  case 13:
376
- if ((_result$data3 = result.data) !== null && _result$data3 !== void 0 && _result$data3.blockService_deleteBlock.deleted) {
377
- _context4.next = 15;
396
+ 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;
397
+ if (isDeleted) {
398
+ _context4.next = 16;
378
399
  break;
379
400
  }
380
401
  throw new Error('Block deletion failed; deleted flag is false');
381
- case 15:
402
+ case 16:
382
403
  case "end":
383
404
  return _context4.stop();
384
405
  }
@@ -437,7 +458,7 @@ var updateSyncedBlock = exports.updateSyncedBlock = /*#__PURE__*/function () {
437
458
  }();
438
459
  var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
439
460
  var _ref1 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(_ref0) {
440
- var _result$data4;
461
+ var _result$data5;
441
462
  var blockAri, blockInstanceId, sourceAri, product, content, stepVersion, status, bodyData, url, response, result;
442
463
  return _regenerator.default.wrap(function _callee6$(_context6) {
443
464
  while (1) switch (_context6.prev = _context6.next) {
@@ -474,7 +495,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
474
495
  return e.message;
475
496
  }).join(', '));
476
497
  case 13:
477
- if ((_result$data4 = result.data) !== null && _result$data4 !== void 0 && _result$data4.blockService_createBlock) {
498
+ if ((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_createBlock) {
478
499
  _context6.next = 15;
479
500
  break;
480
501
  }
@@ -493,7 +514,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
493
514
  }();
494
515
  var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnDocument = /*#__PURE__*/function () {
495
516
  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;
517
+ var documentAri, blocks, _ref10$noContent, noContent, bodyData, url, response, result, _result$data6;
497
518
  return _regenerator.default.wrap(function _callee7$(_context7) {
498
519
  while (1) switch (_context7.prev = _context7.next) {
499
520
  case 0:
@@ -534,7 +555,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
534
555
  _context7.next = 17;
535
556
  break;
536
557
  }
537
- if ((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_updateDocumentReferences) {
558
+ if ((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_updateDocumentReferences) {
538
559
  _context7.next = 16;
539
560
  break;
540
561
  }
@@ -553,7 +574,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
553
574
  }();
554
575
  var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlockAri = /*#__PURE__*/function () {
555
576
  var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(_ref12) {
556
- var _result$data6;
577
+ var _result$data7;
557
578
  var blockAri, bodyData, url, response, result, graphqlResponse;
558
579
  return _regenerator.default.wrap(function _callee8$(_context8) {
559
580
  while (1) switch (_context8.prev = _context8.next) {
@@ -590,7 +611,7 @@ var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlock
590
611
  return e.message;
591
612
  }).join(', '));
592
613
  case 13:
593
- if ((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_getReferences) {
614
+ if ((_result$data7 = result.data) !== null && _result$data7 !== void 0 && _result$data7.blockService_getReferences) {
594
615
  _context8.next = 15;
595
616
  break;
596
617
  }
@@ -611,4 +632,87 @@ var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlock
611
632
  return function getReferenceSyncedBlocksByBlockAri(_x8) {
612
633
  return _ref13.apply(this, arguments);
613
634
  };
635
+ }();
636
+
637
+ /**
638
+ * Batch updates multiple synced blocks.
639
+ *
640
+ * Calls the Block Service GraphQL API: `blockService_batchUpdateBlocks`
641
+ *
642
+ * @param blocks - Array of block updates to apply
643
+ * @returns A promise containing arrays of successfully updated blocks and any errors encountered
644
+ *
645
+ * @example
646
+ * ```typescript
647
+ * const result = await updateSyncedBlocks({
648
+ * blocks: [
649
+ * {
650
+ * blockAri: 'ari:cloud:blocks:site-123:synced-block/uuid-456',
651
+ * content: '{"type":"doc","version":1,"content":[]}',
652
+ * status: 'active',
653
+ * stepVersion: 42
654
+ * }
655
+ * ]
656
+ * });
657
+ * ```
658
+ */
659
+ var updateSyncedBlocks = exports.updateSyncedBlocks = /*#__PURE__*/function () {
660
+ var _ref15 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(_ref14) {
661
+ var _result$data8;
662
+ var blocks, bodyData, url, response, result, graphqlResponse;
663
+ return _regenerator.default.wrap(function _callee9$(_context9) {
664
+ while (1) switch (_context9.prev = _context9.next) {
665
+ case 0:
666
+ blocks = _ref14.blocks;
667
+ bodyData = {
668
+ query: buildBatchUpdateBlocksMutation(blocks),
669
+ operationName: BATCH_UPDATE_BLOCKS_OPERATION_NAME
670
+ };
671
+ url = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_3') ? "".concat(GRAPHQL_ENDPOINT, "?operation=editorSyncedBlockBatchUpdateBlocks") : GRAPHQL_ENDPOINT;
672
+ _context9.next = 5;
673
+ return (0, _retry.fetchWithRetry)(url, {
674
+ method: 'POST',
675
+ headers: COMMON_HEADERS,
676
+ body: JSON.stringify(bodyData)
677
+ });
678
+ case 5:
679
+ response = _context9.sent;
680
+ if (response.ok) {
681
+ _context9.next = 8;
682
+ break;
683
+ }
684
+ throw new BlockError(response.status);
685
+ case 8:
686
+ _context9.next = 10;
687
+ return response.json();
688
+ case 10:
689
+ result = _context9.sent;
690
+ if (!(result.errors && result.errors.length > 0)) {
691
+ _context9.next = 13;
692
+ break;
693
+ }
694
+ throw new Error(result.errors.map(function (e) {
695
+ return e.message;
696
+ }).join(', '));
697
+ case 13:
698
+ if ((_result$data8 = result.data) !== null && _result$data8 !== void 0 && _result$data8.blockService_batchUpdateBlocks) {
699
+ _context9.next = 15;
700
+ break;
701
+ }
702
+ throw new Error('No data returned from GraphQL mutation');
703
+ case 15:
704
+ graphqlResponse = result.data.blockService_batchUpdateBlocks;
705
+ return _context9.abrupt("return", {
706
+ success: graphqlResponse.success,
707
+ error: graphqlResponse.error
708
+ });
709
+ case 17:
710
+ case "end":
711
+ return _context9.stop();
712
+ }
713
+ }, _callee9);
714
+ }));
715
+ return function updateSyncedBlocks(_x9) {
716
+ return _ref15.apply(this, arguments);
717
+ };
614
718
  }();
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.subscribeToBlockUpdates = void 0;
7
7
  var _graphqlWs = require("graphql-ws");
8
8
  var _coreUtils = require("@atlaskit/editor-common/core-utils");
9
- var _sharedSubscriptionUtils = require("./sharedSubscriptionUtils");
9
+ var _utils = require("../../utils/utils");
10
10
  var GRAPHQL_WS_ENDPOINT = '/gateway/api/graphql/subscriptions';
11
11
  var blockServiceClient = null;
12
12
  var getBlockServiceClient = function getBlockServiceClient() {
@@ -25,6 +25,51 @@ var getBlockServiceClient = function getBlockServiceClient() {
25
25
  }
26
26
  return blockServiceClient;
27
27
  };
28
+ var SUBSCRIPTION_QUERY = "\nsubscription EDITOR_SYNCED_BLOCK_ON_BLOCK_UPDATED($resourceId: ID!) {\n\tblockService_onBlockUpdated(resourceId: $resourceId) {\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}\n}\n";
29
+ /**
30
+ * Extracts the resourceId from a block ARI.
31
+ * Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
32
+ * @param blockAri - The block ARI string
33
+ * @returns The resourceId portion of the ARI
34
+ */
35
+ var extractResourceIdFromBlockAri = function extractResourceIdFromBlockAri(blockAri) {
36
+ // eslint-disable-next-line require-unicode-regexp
37
+ var match = blockAri.match(/ari:cloud:blocks:[^:]+:synced-block\/(.+)$/);
38
+ return (match === null || match === void 0 ? void 0 : match[1]) || null;
39
+ };
40
+
41
+ /**
42
+ * Parses the subscription payload into a standardized format.
43
+ * @param payload - The raw subscription payload
44
+ * @returns Parsed block data or null if parsing fails
45
+ */
46
+ var parseSubscriptionPayload = function parseSubscriptionPayload(payload) {
47
+ try {
48
+ var resourceId = extractResourceIdFromBlockAri(payload.blockAri);
49
+ if (!resourceId) {
50
+ return null;
51
+ }
52
+ var createdAt;
53
+ if (payload.createdAt !== undefined && payload.createdAt !== null) {
54
+ createdAt = new Date(payload.createdAt).toISOString();
55
+ }
56
+ return {
57
+ blockAri: payload.blockAri,
58
+ blockInstanceId: payload.blockInstanceId,
59
+ content: JSON.parse(payload.content),
60
+ contentUpdatedAt: (0, _utils.convertContentUpdatedAt)(payload.contentUpdatedAt),
61
+ createdAt: createdAt,
62
+ createdBy: payload.createdBy,
63
+ product: payload.product,
64
+ resourceId: resourceId,
65
+ sourceAri: payload.sourceAri,
66
+ status: payload.status
67
+ };
68
+ } catch (_unused) {
69
+ return null;
70
+ }
71
+ };
72
+
28
73
  /**
29
74
  * Creates a GraphQL subscription to block updates using the shared graphql-ws client.
30
75
  *
@@ -40,7 +85,7 @@ var subscribeToBlockUpdates = exports.subscribeToBlockUpdates = function subscri
40
85
  return function () {};
41
86
  }
42
87
  var unsubscribe = client.subscribe({
43
- query: _sharedSubscriptionUtils.BLOCK_SERVICE_SUBSCRIPTION_QUERY,
88
+ query: SUBSCRIPTION_QUERY,
44
89
  variables: {
45
90
  resourceId: blockAri
46
91
  },
@@ -49,7 +94,7 @@ var subscribeToBlockUpdates = exports.subscribeToBlockUpdates = function subscri
49
94
  next: function next(value) {
50
95
  var _value$data;
51
96
  if ((_value$data = value.data) !== null && _value$data !== void 0 && _value$data.blockService_onBlockUpdated) {
52
- var parsed = (0, _sharedSubscriptionUtils.parseSubscriptionPayload)(value.data.blockService_onBlockUpdated);
97
+ var parsed = parseSubscriptionPayload(value.data.blockService_onBlockUpdated);
53
98
  if (parsed !== null) {
54
99
  onData(parsed);
55
100
  } else {
@@ -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]);
package/dist/cjs/index.js CHANGED
@@ -3,12 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "BLOCK_SERVICE_SUBSCRIPTION_QUERY", {
7
- enumerable: true,
8
- get: function get() {
9
- return _sharedSubscriptionUtils.BLOCK_SERVICE_SUBSCRIPTION_QUERY;
10
- }
11
- });
12
6
  Object.defineProperty(exports, "BlockError", {
13
7
  enumerable: true,
14
8
  get: function get() {
@@ -63,12 +57,6 @@ Object.defineProperty(exports, "convertPMNodesToSyncBlockNodes", {
63
57
  return _utils.convertPMNodesToSyncBlockNodes;
64
58
  }
65
59
  });
66
- Object.defineProperty(exports, "convertRelayResponseToSyncBlockInstance", {
67
- enumerable: true,
68
- get: function get() {
69
- return _relayResponseConverter.convertRelayResponseToSyncBlockInstance;
70
- }
71
- });
72
60
  Object.defineProperty(exports, "convertSyncBlockJSONNodeToSyncBlockNode", {
73
61
  enumerable: true,
74
62
  get: function get() {
@@ -87,18 +75,6 @@ Object.defineProperty(exports, "convertToSyncBlockData", {
87
75
  return _blockServiceAPI.convertToSyncBlockData;
88
76
  }
89
77
  });
90
- Object.defineProperty(exports, "createRelayBlockSubscription", {
91
- enumerable: true,
92
- get: function get() {
93
- return _relaySubscriptionUtils.createRelayBlockSubscription;
94
- }
95
- });
96
- Object.defineProperty(exports, "createRelaySubscriptionFunction", {
97
- enumerable: true,
98
- get: function get() {
99
- return _relaySubscriptionUtils.createRelaySubscriptionFunction;
100
- }
101
- });
102
78
  Object.defineProperty(exports, "createResourceIdForReference", {
103
79
  enumerable: true,
104
80
  get: function get() {
@@ -207,12 +183,6 @@ Object.defineProperty(exports, "parseResourceId", {
207
183
  return _resourceId.parseResourceId;
208
184
  }
209
185
  });
210
- Object.defineProperty(exports, "parseSubscriptionPayload", {
211
- enumerable: true,
212
- get: function get() {
213
- return _sharedSubscriptionUtils.parseSubscriptionPayload;
214
- }
215
- });
216
186
  Object.defineProperty(exports, "rebaseTransaction", {
217
187
  enumerable: true,
218
188
  get: function get() {
@@ -231,6 +201,12 @@ Object.defineProperty(exports, "syncBlockInMemorySessionCache", {
231
201
  return _syncBlockInMemorySessionCache.syncBlockInMemorySessionCache;
232
202
  }
233
203
  });
204
+ Object.defineProperty(exports, "updateSyncedBlocks", {
205
+ enumerable: true,
206
+ get: function get() {
207
+ return _blockService.updateSyncedBlocks;
208
+ }
209
+ });
234
210
  Object.defineProperty(exports, "useFetchSyncBlockData", {
235
211
  enumerable: true,
236
212
  get: function get() {
@@ -273,6 +249,12 @@ Object.defineProperty(exports, "useMemoizedSyncedBlockProvider", {
273
249
  return _syncBlockProvider.useMemoizedSyncedBlockProvider;
274
250
  }
275
251
  });
252
+ Object.defineProperty(exports, "writeDataBatch", {
253
+ enumerable: true,
254
+ get: function get() {
255
+ return _blockServiceAPI.writeDataBatch;
256
+ }
257
+ });
276
258
  var _rebaseTransaction = require("./common/rebase-transaction");
277
259
  var _types = require("./common/types");
278
260
  var _useFetchSyncBlockData = require("./hooks/useFetchSyncBlockData");
@@ -289,9 +271,6 @@ var _syncBlockProvider = require("./providers/syncBlockProvider");
289
271
  var _referenceSyncBlockStoreManager = require("./store-manager/referenceSyncBlockStoreManager");
290
272
  var _syncBlockInMemorySessionCache = require("./store-manager/syncBlockInMemorySessionCache");
291
273
  var _syncBlockStoreManager = require("./store-manager/syncBlockStoreManager");
292
- var _sharedSubscriptionUtils = require("./clients/block-service/sharedSubscriptionUtils");
293
- var _relayResponseConverter = require("./utils/relayResponseConverter");
294
- var _relaySubscriptionUtils = require("./utils/relaySubscriptionUtils");
295
274
  var _resolveSyncBlockInstance = require("./utils/resolveSyncBlockInstance");
296
275
  var _resourceId = require("./utils/resourceId");
297
276
  var _utils = require("./utils/utils");