@atlaskit/editor-synced-block-provider 3.12.0 → 3.13.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 (56) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/clients/block-service/blockSubscription.js +124 -0
  3. package/dist/cjs/clients/jira/sourceInfo.js +152 -0
  4. package/dist/cjs/providers/block-service/blockServiceAPI.js +43 -6
  5. package/dist/cjs/providers/syncBlockProvider.js +40 -8
  6. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +393 -204
  7. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +95 -124
  8. package/dist/cjs/store-manager/syncBlockStoreManager.js +2 -2
  9. package/dist/cjs/utils/errorHandling.js +79 -19
  10. package/dist/cjs/utils/experienceTracking.js +119 -0
  11. package/dist/cjs/utils/resolveSyncBlockInstance.js +1 -1
  12. package/dist/es2019/clients/block-service/blockSubscription.js +125 -0
  13. package/dist/es2019/clients/jira/sourceInfo.js +87 -0
  14. package/dist/es2019/providers/block-service/blockServiceAPI.js +40 -5
  15. package/dist/es2019/providers/syncBlockProvider.js +26 -2
  16. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +286 -139
  17. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +80 -89
  18. package/dist/es2019/store-manager/syncBlockStoreManager.js +2 -2
  19. package/dist/es2019/utils/errorHandling.js +61 -10
  20. package/dist/es2019/utils/experienceTracking.js +113 -0
  21. package/dist/es2019/utils/resolveSyncBlockInstance.js +1 -1
  22. package/dist/esm/clients/block-service/blockSubscription.js +118 -0
  23. package/dist/esm/clients/jira/sourceInfo.js +147 -0
  24. package/dist/esm/providers/block-service/blockServiceAPI.js +43 -6
  25. package/dist/esm/providers/syncBlockProvider.js +38 -6
  26. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +394 -205
  27. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +96 -125
  28. package/dist/esm/store-manager/syncBlockStoreManager.js +2 -2
  29. package/dist/esm/utils/errorHandling.js +77 -18
  30. package/dist/esm/utils/experienceTracking.js +113 -0
  31. package/dist/esm/utils/resolveSyncBlockInstance.js +1 -1
  32. package/dist/types/clients/block-service/blockService.d.ts +2 -2
  33. package/dist/types/clients/block-service/blockSubscription.d.ts +38 -0
  34. package/dist/types/clients/jira/sourceInfo.d.ts +2 -0
  35. package/dist/types/common/types.d.ts +4 -2
  36. package/dist/types/index.d.ts +2 -2
  37. package/dist/types/providers/block-service/blockServiceAPI.d.ts +8 -0
  38. package/dist/types/providers/syncBlockProvider.d.ts +9 -1
  39. package/dist/types/providers/types.d.ts +22 -6
  40. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +59 -1
  41. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +1 -5
  42. package/dist/types/utils/errorHandling.d.ts +14 -9
  43. package/dist/types/utils/experienceTracking.d.ts +51 -0
  44. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +2 -2
  45. package/dist/types-ts4.5/clients/block-service/blockSubscription.d.ts +38 -0
  46. package/dist/types-ts4.5/clients/jira/sourceInfo.d.ts +2 -0
  47. package/dist/types-ts4.5/common/types.d.ts +4 -2
  48. package/dist/types-ts4.5/index.d.ts +2 -2
  49. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +8 -0
  50. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +9 -1
  51. package/dist/types-ts4.5/providers/types.d.ts +22 -6
  52. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +59 -1
  53. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +1 -5
  54. package/dist/types-ts4.5/utils/errorHandling.d.ts +14 -9
  55. package/dist/types-ts4.5/utils/experienceTracking.d.ts +51 -0
  56. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 3.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`870c3baec758b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/870c3baec758b) -
8
+ Enable consumers to use GraphQL subscription for fetching the block data when the block changes
9
+
10
+ ### Patch Changes
11
+
12
+ - [`5c522f81f181e`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5c522f81f181e) -
13
+ [ux] EDITOR-4369 Support synced location for references on Jira in source and reference synced
14
+ block
15
+ - [`058065aadf69f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/058065aadf69f) -
16
+ [ux] [EDITOR-2851] Support reference sync block unsyc
17
+ - Updated dependencies
18
+
19
+ ## 3.12.1
20
+
21
+ ### Patch Changes
22
+
23
+ - [`7f41011a1b0ff`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/7f41011a1b0ff) -
24
+ EDITOR-1665 update sync block experience events to use general experience ids, keep existing error
25
+ events and add success events
26
+ - Updated dependencies
27
+
3
28
  ## 3.12.0
4
29
 
5
30
  ### Minor Changes
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.subscribeToBlockUpdates = void 0;
7
+ var _graphqlWs = require("graphql-ws");
8
+ var GRAPHQL_WS_ENDPOINT = '/gateway/api/graphql/subscriptions';
9
+ var blockServiceClient = null;
10
+ var getBlockServiceClient = function getBlockServiceClient() {
11
+ // Don't create client during SSR
12
+ if (typeof window === 'undefined') {
13
+ return null;
14
+ }
15
+ if (!blockServiceClient) {
16
+ var protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
17
+ var wsUrl = "".concat(protocol, "//").concat(window.location.host).concat(GRAPHQL_WS_ENDPOINT);
18
+ blockServiceClient = (0, _graphqlWs.createClient)({
19
+ url: wsUrl,
20
+ lazy: true,
21
+ retryAttempts: 3
22
+ });
23
+ }
24
+ return blockServiceClient;
25
+ };
26
+ 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";
27
+ /**
28
+ * Extracts the resourceId from a block ARI.
29
+ * Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
30
+ * @param blockAri - The block ARI string
31
+ * @returns The resourceId portion of the ARI
32
+ */
33
+ var extractResourceIdFromBlockAri = function extractResourceIdFromBlockAri(blockAri) {
34
+ // eslint-disable-next-line require-unicode-regexp
35
+ var match = blockAri.match(/ari:cloud:blocks:[^:]+:synced-block\/(.+)$/);
36
+ return (match === null || match === void 0 ? void 0 : match[1]) || null;
37
+ };
38
+
39
+ /**
40
+ * Parses the subscription payload into a standardized format.
41
+ * @param payload - The raw subscription payload
42
+ * @returns Parsed block data or null if parsing fails
43
+ */
44
+ var parseSubscriptionPayload = function parseSubscriptionPayload(payload) {
45
+ try {
46
+ var resourceId = extractResourceIdFromBlockAri(payload.blockAri);
47
+ if (!resourceId) {
48
+ return null;
49
+ }
50
+ var createdAt;
51
+ if (payload.createdAt !== undefined && payload.createdAt !== null) {
52
+ try {
53
+ // BE returns microseconds, convert to milliseconds
54
+ createdAt = new Date(payload.createdAt / 1000).toISOString();
55
+ } catch (_unused) {
56
+ createdAt = undefined;
57
+ }
58
+ }
59
+ return {
60
+ blockAri: payload.blockAri,
61
+ blockInstanceId: payload.blockInstanceId,
62
+ content: JSON.parse(payload.content),
63
+ createdAt: createdAt,
64
+ createdBy: payload.createdBy,
65
+ product: payload.product,
66
+ resourceId: resourceId,
67
+ sourceAri: payload.sourceAri,
68
+ status: payload.status
69
+ };
70
+ } catch (_unused2) {
71
+ return null;
72
+ }
73
+ };
74
+
75
+ /**
76
+ * Creates a GraphQL subscription to block updates using the shared graphql-ws client.
77
+ *
78
+ * @param blockAri - The full block ARI to subscribe to (ari:cloud:blocks:{cloudId}:synced-block/{resourceId})
79
+ * @param onData - Callback function invoked when block data is updated
80
+ * @param onError - Optional callback function invoked on subscription errors
81
+ * @returns Unsubscribe function to close the subscription
82
+ */
83
+ var subscribeToBlockUpdates = exports.subscribeToBlockUpdates = function subscribeToBlockUpdates(blockAri, onData, onError) {
84
+ var client = getBlockServiceClient();
85
+ if (!client) {
86
+ // Return a no-op unsubscribe if client is not available (e.g., SSR)
87
+ return function () {};
88
+ }
89
+ var unsubscribe = client.subscribe({
90
+ query: SUBSCRIPTION_QUERY,
91
+ variables: {
92
+ resourceId: blockAri
93
+ },
94
+ operationName: 'EDITOR_SYNCED_BLOCK_ON_BLOCK_UPDATED'
95
+ }, {
96
+ next: function next(value) {
97
+ var _value$data;
98
+ if ((_value$data = value.data) !== null && _value$data !== void 0 && _value$data.blockService_onBlockUpdated) {
99
+ var parsed = parseSubscriptionPayload(value.data.blockService_onBlockUpdated);
100
+ if (parsed !== null) {
101
+ onData(parsed);
102
+ } else {
103
+ onError === null || onError === void 0 || onError(new Error('Failed to parse block subscription payload'));
104
+ }
105
+ }
106
+ },
107
+ error: function (_error) {
108
+ function error(_x) {
109
+ return _error.apply(this, arguments);
110
+ }
111
+ error.toString = function () {
112
+ return _error.toString();
113
+ };
114
+ return error;
115
+ }(function (error) {
116
+ var errorMessage = error instanceof Error ? error.message : 'GraphQL subscription error';
117
+ onError === null || onError === void 0 || onError(new Error(errorMessage));
118
+ }),
119
+ complete: function complete() {
120
+ // Subscription completed
121
+ }
122
+ });
123
+ return unsubscribe;
124
+ };
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.fetchJiraWorkItemInfo = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _retry = require("../../utils/retry");
12
+ 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; }
13
+ 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; } /* eslint-disable require-unicode-regexp */
14
+ var COMMON_HEADERS = {
15
+ 'Content-Type': 'application/json',
16
+ Accept: 'application/json'
17
+ };
18
+ var AGG_HEADERS = {
19
+ 'X-ExperimentalApi': 'confluence-agg-beta'
20
+ };
21
+ var GRAPHQL_ENDPOINT = '/gateway/api/graphql';
22
+ var GET_SOURCE_INFO_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_SOURCE_INFO';
23
+ /**
24
+ * Query to get the work item url by id
25
+ * @param id - the ID of the work item
26
+ * @returns url of the work item
27
+ */
28
+ var GET_SOURCE_INFO_QUERY = "query ".concat(GET_SOURCE_INFO_OPERATION_NAME, " ($id: ID!) {\n jira {\n issueById(id: $id) {\n id\n webUrl\n summary\n }\n }}");
29
+ var getJiraWorkItemSourceInfo = /*#__PURE__*/function () {
30
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(ari) {
31
+ var bodyData, response;
32
+ return _regenerator.default.wrap(function _callee$(_context) {
33
+ while (1) switch (_context.prev = _context.next) {
34
+ case 0:
35
+ bodyData = {
36
+ query: GET_SOURCE_INFO_QUERY,
37
+ operationName: GET_SOURCE_INFO_OPERATION_NAME,
38
+ variables: {
39
+ id: ari
40
+ }
41
+ };
42
+ _context.next = 3;
43
+ return (0, _retry.fetchWithRetry)(GRAPHQL_ENDPOINT, {
44
+ method: 'POST',
45
+ headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
46
+ body: JSON.stringify(bodyData)
47
+ });
48
+ case 3:
49
+ response = _context.sent;
50
+ if (response.ok) {
51
+ _context.next = 6;
52
+ break;
53
+ }
54
+ throw new Error("Failed to get url: ".concat(response.statusText));
55
+ case 6:
56
+ _context.next = 8;
57
+ return response.json();
58
+ case 8:
59
+ return _context.abrupt("return", _context.sent);
60
+ case 9:
61
+ case "end":
62
+ return _context.stop();
63
+ }
64
+ }, _callee);
65
+ }));
66
+ return function getJiraWorkItemSourceInfo(_x) {
67
+ return _ref.apply(this, arguments);
68
+ };
69
+ }();
70
+ var resolveNoAccessWorkItemInfo = /*#__PURE__*/function () {
71
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(ari) {
72
+ var response, _payload$data, _payload$data2, payload, url, title;
73
+ return _regenerator.default.wrap(function _callee2$(_context2) {
74
+ while (1) switch (_context2.prev = _context2.next) {
75
+ case 0:
76
+ _context2.next = 2;
77
+ return fetch('/gateway/api/object-resolver/resolve/ari', {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ Accept: 'application/json'
82
+ },
83
+ body: JSON.stringify({
84
+ ari: ari
85
+ })
86
+ });
87
+ case 2:
88
+ response = _context2.sent;
89
+ if (!response.ok) {
90
+ _context2.next = 12;
91
+ break;
92
+ }
93
+ _context2.next = 6;
94
+ return response.json();
95
+ case 6:
96
+ payload = _context2.sent;
97
+ url = payload === null || payload === void 0 || (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.url;
98
+ title = payload === null || payload === void 0 || (_payload$data2 = payload.data) === null || _payload$data2 === void 0 ? void 0 : _payload$data2.name;
99
+ return _context2.abrupt("return", {
100
+ url: typeof url === 'string' ? url : undefined,
101
+ title: typeof title === 'string' ? title : undefined,
102
+ sourceAri: ari
103
+ });
104
+ case 12:
105
+ throw new Error("Failed to resolve ari: ".concat(response.statusText));
106
+ case 13:
107
+ case "end":
108
+ return _context2.stop();
109
+ }
110
+ }, _callee2);
111
+ }));
112
+ return function resolveNoAccessWorkItemInfo(_x2) {
113
+ return _ref2.apply(this, arguments);
114
+ };
115
+ }();
116
+ var fetchJiraWorkItemInfo = exports.fetchJiraWorkItemInfo = /*#__PURE__*/function () {
117
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(workItemAri, hasAccess) {
118
+ var _response$data, response, contentData, webUrl, summary;
119
+ return _regenerator.default.wrap(function _callee3$(_context3) {
120
+ while (1) switch (_context3.prev = _context3.next) {
121
+ case 0:
122
+ if (!hasAccess) {
123
+ _context3.next = 10;
124
+ break;
125
+ }
126
+ _context3.next = 3;
127
+ return getJiraWorkItemSourceInfo(workItemAri);
128
+ case 3:
129
+ response = _context3.sent;
130
+ contentData = (_response$data = response.data) === null || _response$data === void 0 || (_response$data = _response$data.jira) === null || _response$data === void 0 ? void 0 : _response$data.issueById;
131
+ webUrl = contentData === null || contentData === void 0 ? void 0 : contentData.webUrl;
132
+ summary = contentData === null || contentData === void 0 ? void 0 : contentData.summary;
133
+ return _context3.abrupt("return", Promise.resolve({
134
+ url: webUrl,
135
+ sourceAri: workItemAri,
136
+ title: summary
137
+ }));
138
+ case 10:
139
+ _context3.next = 12;
140
+ return resolveNoAccessWorkItemInfo(workItemAri);
141
+ case 12:
142
+ return _context3.abrupt("return", _context3.sent);
143
+ case 13:
144
+ case "end":
145
+ return _context3.stop();
146
+ }
147
+ }, _callee3);
148
+ }));
149
+ return function fetchJiraWorkItemInfo(_x3, _x4) {
150
+ return _ref3.apply(this, arguments);
151
+ };
152
+ }();
@@ -15,6 +15,7 @@ var _react = require("react");
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
16
  var _ari = require("../../clients/block-service/ari");
17
17
  var _blockService = require("../../clients/block-service/blockService");
18
+ var _blockSubscription = require("../../clients/block-service/blockSubscription");
18
19
  var _types = require("../../common/types");
19
20
  var _errorHandling = require("../../utils/errorHandling");
20
21
  var _resourceId2 = require("../../utils/resourceId");
@@ -117,7 +118,8 @@ var convertToSyncBlockData = exports.convertToSyncBlockData = function convertTo
117
118
  createdBy: data.createdBy,
118
119
  product: data.product,
119
120
  resourceId: resourceId,
120
- sourceAri: data.sourceAri
121
+ sourceAri: data.sourceAri,
122
+ status: data.status
121
123
  };
122
124
  };
123
125
  var fetchReferences = exports.fetchReferences = /*#__PURE__*/function () {
@@ -237,7 +239,8 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
237
239
  blockInstanceId: blockContentResponse.blockInstanceId,
238
240
  // this was the node's localId, but has become the resourceId.
239
241
  sourceAri: blockContentResponse.sourceAri,
240
- product: blockContentResponse.product
242
+ product: blockContentResponse.product,
243
+ status: blockContentResponse.status
241
244
  },
242
245
  resourceId: resourceId
243
246
  });
@@ -292,7 +295,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
292
295
  response.references.forEach(function (reference) {
293
296
  references.push(_objectSpread(_objectSpread({}, reference), {}, {
294
297
  hasAccess: true,
295
- onSamePage: _this.parentAri === reference.documentAri
298
+ onSameDocument: _this.parentAri === reference.documentAri
296
299
  }));
297
300
  });
298
301
  response.errors.forEach(function (reference) {
@@ -301,7 +304,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
301
304
  blockAri: reference.blockAri,
302
305
  documentAri: reference.documentAri,
303
306
  hasAccess: false,
304
- onSamePage: false
307
+ onSameDocument: false
305
308
  });
306
309
  }
307
310
  });
@@ -432,7 +435,8 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
432
435
  resourceId: blockContentResponse.blockAri,
433
436
  blockInstanceId: blockContentResponse.blockInstanceId,
434
437
  sourceAri: blockContentResponse.sourceAri,
435
- product: blockContentResponse.product
438
+ product: blockContentResponse.product,
439
+ status: blockContentResponse.status
436
440
  },
437
441
  resourceId: resourceId
438
442
  });
@@ -535,7 +539,40 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
535
539
  return _batchFetchData.apply(this, arguments);
536
540
  }
537
541
  return batchFetchData;
538
- }())
542
+ }()
543
+ /**
544
+ * Subscribes to real-time updates for a specific block using GraphQL WebSocket subscriptions.
545
+ * @param resourceId - The resource ID of the block to subscribe to
546
+ * @param onUpdate - Callback function invoked when the block is updated
547
+ * @param onError - Optional callback function invoked on subscription errors
548
+ * @returns Unsubscribe function to stop receiving updates
549
+ */
550
+ )
551
+ }, {
552
+ key: "subscribeToBlockUpdates",
553
+ value: function subscribeToBlockUpdates(resourceId, onUpdate, onError) {
554
+ var blockAri = (0, _ari.generateBlockAriFromReference)({
555
+ cloudId: this.cloudId,
556
+ resourceId: resourceId
557
+ });
558
+ return (0, _blockSubscription.subscribeToBlockUpdates)(blockAri, function (parsedData) {
559
+ // Convert ParsedBlockSubscriptionData to SyncBlockInstance
560
+ var syncBlockInstance = {
561
+ data: {
562
+ content: parsedData.content,
563
+ resourceId: parsedData.blockAri,
564
+ blockInstanceId: parsedData.blockInstanceId,
565
+ sourceAri: parsedData.sourceAri,
566
+ product: parsedData.product,
567
+ createdAt: parsedData.createdAt,
568
+ createdBy: parsedData.createdBy,
569
+ status: parsedData.status
570
+ },
571
+ resourceId: parsedData.resourceId
572
+ };
573
+ onUpdate(syncBlockInstance);
574
+ }, onError);
575
+ }
539
576
  }]);
540
577
  }();
541
578
  /**
@@ -17,7 +17,8 @@ var _react = require("react");
17
17
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
18
  var _ari = require("../clients/block-service/ari");
19
19
  var _ari2 = require("../clients/confluence/ari");
20
- var _sourceInfo = require("../clients/confluence/sourceInfo");
20
+ var _sourceInfo2 = require("../clients/confluence/sourceInfo");
21
+ var _sourceInfo3 = require("../clients/jira/sourceInfo");
21
22
  var _types = require("../common/types");
22
23
  var _types2 = require("./types");
23
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -309,6 +310,8 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
309
310
  _this$writeProvider,
310
311
  sourceInfo,
311
312
  _this$writeProvider2,
313
+ _this$writeProvider3,
314
+ _sourceInfo,
312
315
  _args4 = arguments;
313
316
  return _regenerator.default.wrap(function _callee4$(_context4) {
314
317
  while (1) switch (_context4.prev = _context4.next) {
@@ -327,11 +330,11 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
327
330
  return _context4.abrupt("return", Promise.reject(new Error('Source ari or source product is undefined')));
328
331
  case 6:
329
332
  _context4.t0 = product;
330
- _context4.next = _context4.t0 === 'confluence-page' ? 9 : _context4.t0 === 'jira-work-item' ? 19 : 22;
333
+ _context4.next = _context4.t0 === 'confluence-page' ? 9 : _context4.t0 === 'jira-work-item' ? 19 : 27;
331
334
  break;
332
335
  case 9:
333
336
  _context4.next = 11;
334
- return (0, _sourceInfo.fetchConfluencePageInfo)(ari, hasAccess, urlType, localId, fireAnalyticsEvent);
337
+ return (0, _sourceInfo2.fetchConfluencePageInfo)(ari, hasAccess, urlType, localId, fireAnalyticsEvent);
335
338
  case 11:
336
339
  sourceInfo = _context4.sent;
337
340
  if (!(0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
@@ -345,22 +348,35 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
345
348
  return _context4.abrupt("return", Promise.resolve(undefined));
346
349
  case 15:
347
350
  return _context4.abrupt("return", _objectSpread(_objectSpread({}, sourceInfo), {}, {
348
- onSamePage: ((_this$writeProvider2 = this.writeProvider) === null || _this$writeProvider2 === void 0 ? void 0 : _this$writeProvider2.parentAri) === ari,
351
+ onSameDocument: ((_this$writeProvider2 = this.writeProvider) === null || _this$writeProvider2 === void 0 ? void 0 : _this$writeProvider2.parentAri) === ari,
349
352
  productType: product
350
353
  }));
351
354
  case 18:
352
355
  return _context4.abrupt("return", sourceInfo);
353
356
  case 19:
354
357
  if (!(0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
355
- _context4.next = 21;
358
+ _context4.next = 26;
359
+ break;
360
+ }
361
+ _context4.next = 22;
362
+ return (0, _sourceInfo3.fetchJiraWorkItemInfo)(ari, hasAccess);
363
+ case 22:
364
+ _sourceInfo = _context4.sent;
365
+ if (_sourceInfo) {
366
+ _context4.next = 25;
356
367
  break;
357
368
  }
358
369
  return _context4.abrupt("return", Promise.resolve(undefined));
359
- case 21:
370
+ case 25:
371
+ return _context4.abrupt("return", _objectSpread(_objectSpread({}, _sourceInfo), {}, {
372
+ onSameDocument: ((_this$writeProvider3 = this.writeProvider) === null || _this$writeProvider3 === void 0 ? void 0 : _this$writeProvider3.parentAri) === ari,
373
+ productType: product
374
+ }));
375
+ case 26:
360
376
  return _context4.abrupt("return", Promise.reject(new Error('Jira work item source product not supported')));
361
- case 22:
377
+ case 27:
362
378
  return _context4.abrupt("return", Promise.reject(new Error("".concat(product, " source product not supported"))));
363
- case 23:
379
+ case 28:
364
380
  case "end":
365
381
  return _context4.stop();
366
382
  }
@@ -445,6 +461,22 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
445
461
  }
446
462
  return this.fetchProvider.fetchReferences(isSource ? this.generateResourceIdForReference(resourceId) : resourceId);
447
463
  }
464
+
465
+ /**
466
+ * Subscribes to real-time updates for a specific block.
467
+ * @param resourceId - The resource ID of the block to subscribe to
468
+ * @param onUpdate - Callback function invoked when the block is updated
469
+ * @param onError - Optional callback function invoked on subscription errors
470
+ * @returns Unsubscribe function to stop receiving updates, or undefined if not supported
471
+ */
472
+ }, {
473
+ key: "subscribeToBlockUpdates",
474
+ value: function subscribeToBlockUpdates(resourceId, onUpdate, onError) {
475
+ if (this.fetchProvider.subscribeToBlockUpdates) {
476
+ return this.fetchProvider.subscribeToBlockUpdates(resourceId, onUpdate, onError);
477
+ }
478
+ return undefined;
479
+ }
448
480
  }]);
449
481
  }(_types2.SyncBlockDataProvider);
450
482
  var createSyncedBlockProvider = function createSyncedBlockProvider(_ref) {