@atlaskit/editor-synced-block-provider 3.13.0 → 3.13.2

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 3.13.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`87abc5dda86fe`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/87abc5dda86fe) -
8
+ [ux] Show last edited time in sync block tooltip
9
+ - Updated dependencies
10
+
11
+ ## 3.13.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [`ab11bedd7f6e6`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ab11bedd7f6e6) -
16
+ Fix over logging of source ari not found error
17
+
3
18
  ## 3.13.0
4
19
 
5
20
  ### Minor Changes
@@ -48,7 +48,7 @@ var isBlockContentResponse = exports.isBlockContentResponse = function isBlockCo
48
48
  * "status": "active",
49
49
  * "createdAt": "2025-10-08T10:30:00.000Z",
50
50
  * "createdBy": "557058:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
51
- * "updatedAt": "2025-10-08T10:30:00.000Z"
51
+ * "contentUpdatedAt": "2025-10-08T10:30:00.000Z"
52
52
  * }
53
53
  * ],
54
54
  * "errors": [
@@ -122,7 +122,7 @@ var BLOCK_SERVICE_API_URL = '/gateway/api/blocks/v1';
122
122
  var GRAPHQL_ENDPOINT = '/gateway/api/graphql';
123
123
  var GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_DOCUMENT_REFERENCE_BLOCKS';
124
124
  var buildGetDocumentReferenceBlocksQuery = function buildGetDocumentReferenceBlocksQuery(documentAri) {
125
- 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\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}");
125
+ 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}");
126
126
  };
127
127
  var BlockError = exports.BlockError = /*#__PURE__*/function (_Error) {
128
128
  function BlockError(status) {
@@ -137,11 +137,11 @@ var BlockError = exports.BlockError = /*#__PURE__*/function (_Error) {
137
137
  }( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
138
138
  var getSyncedBlockContent = exports.getSyncedBlockContent = /*#__PURE__*/function () {
139
139
  var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(_ref2) {
140
- var blockAri, documentAri, queryParams, response;
140
+ var blockAri, queryParams, response;
141
141
  return _regenerator.default.wrap(function _callee2$(_context2) {
142
142
  while (1) switch (_context2.prev = _context2.next) {
143
143
  case 0:
144
- blockAri = _ref2.blockAri, documentAri = _ref2.documentAri;
144
+ blockAri = _ref2.blockAri;
145
145
  // Disable sending documentAri for now. We'll add it back if we find a way to update references that follows the save & refresh principle.
146
146
  // Slack discussion here: https://atlassian.slack.com/archives/C09DZT1TBNW/p1767836775552099?thread_ts=1767836754.024889&cid=C09DZT1TBNW
147
147
  // const queryParams = documentAri ? `?documentAri=${encodeURIComponent(documentAri)}` : '';
@@ -94,7 +94,6 @@ var blockAriToResourceId = exports.blockAriToResourceId = function blockAriToRes
94
94
  // convert BlockContentResponse to SyncBlockData
95
95
  // throws exception if JSON parsing fails
96
96
  // what's missing from BlockContentResponse to SyncBlockData:
97
- // - updatedAt
98
97
  // - sourceURL
99
98
  // - sourceTitle
100
99
  // - isSynced
@@ -111,9 +110,18 @@ var convertToSyncBlockData = exports.convertToSyncBlockData = function convertTo
111
110
  createdAt = undefined;
112
111
  }
113
112
  }
113
+ var contentUpdatedAt;
114
+ if (typeof data.contentUpdatedAt === 'number' && (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
115
+ try {
116
+ contentUpdatedAt = new Date(data.contentUpdatedAt).toISOString();
117
+ } catch (e) {
118
+ contentUpdatedAt = undefined;
119
+ }
120
+ }
114
121
  return {
115
122
  blockInstanceId: data.blockInstanceId,
116
123
  content: JSON.parse(data.content),
124
+ contentUpdatedAt: contentUpdatedAt,
117
125
  createdAt: createdAt,
118
126
  createdBy: data.createdBy,
119
127
  product: data.product,
@@ -204,7 +212,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
204
212
  key: "fetchData",
205
213
  value: function () {
206
214
  var _fetchData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(resourceId) {
207
- var blockAri, blockContentResponse, value, syncedBlockData;
215
+ var blockAri, blockContentResponse, value, syncedBlockData, contentUpdatedAt;
208
216
  return _regenerator.default.wrap(function _callee2$(_context2) {
209
217
  while (1) switch (_context2.prev = _context2.next) {
210
218
  case 0:
@@ -232,39 +240,47 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
232
240
  case 8:
233
241
  // Parse the synced block content from the response's content
234
242
  syncedBlockData = JSON.parse(value);
243
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
244
+ try {
245
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
246
+ } catch (e) {
247
+ contentUpdatedAt = undefined;
248
+ }
249
+ }
235
250
  return _context2.abrupt("return", {
236
251
  data: {
237
252
  content: syncedBlockData,
238
253
  resourceId: blockAri,
239
254
  blockInstanceId: blockContentResponse.blockInstanceId,
240
255
  // this was the node's localId, but has become the resourceId.
256
+ contentUpdatedAt: contentUpdatedAt,
241
257
  sourceAri: blockContentResponse.sourceAri,
242
258
  product: blockContentResponse.product,
243
259
  status: blockContentResponse.status
244
260
  },
245
261
  resourceId: resourceId
246
262
  });
247
- case 12:
248
- _context2.prev = 12;
263
+ case 13:
264
+ _context2.prev = 13;
249
265
  _context2.t0 = _context2["catch"](1);
250
266
  if (!(_context2.t0 instanceof _blockService.BlockError)) {
251
- _context2.next = 16;
267
+ _context2.next = 17;
252
268
  break;
253
269
  }
254
270
  return _context2.abrupt("return", {
255
271
  error: mapBlockError(_context2.t0),
256
272
  resourceId: resourceId
257
273
  });
258
- case 16:
274
+ case 17:
259
275
  return _context2.abrupt("return", {
260
276
  error: _types.SyncBlockError.Errored,
261
277
  resourceId: resourceId
262
278
  });
263
- case 17:
279
+ case 18:
264
280
  case "end":
265
281
  return _context2.stop();
266
282
  }
267
- }, _callee2, this, [[1, 12]]);
283
+ }, _callee2, this, [[1, 13]]);
268
284
  }));
269
285
  function fetchData(_x2) {
270
286
  return _fetchData.apply(this, arguments);
@@ -357,7 +373,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
357
373
  value: (function () {
358
374
  var _batchFetchData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(blockNodeIdentifiers) {
359
375
  var _this2 = this;
360
- var blockIdentifiers, validResourceIds, processedResourceIds, response, results, _iterator, _step, blockContentResponse, resourceId, value, syncedBlockData, _iterator2, _step2, errorResponse, _resourceId, _iterator3, _step3, blockNodeIdentifier;
376
+ var blockIdentifiers, validResourceIds, processedResourceIds, response, results, _iterator, _step, blockContentResponse, resourceId, value, syncedBlockData, contentUpdatedAt, _iterator2, _step2, errorResponse, _resourceId, _iterator3, _step3, blockNodeIdentifier;
361
377
  return _regenerator.default.wrap(function _callee4$(_context4) {
362
378
  while (1) switch (_context4.prev = _context4.next) {
363
379
  case 0:
@@ -429,10 +445,19 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
429
445
  case 24:
430
446
  try {
431
447
  syncedBlockData = JSON.parse(value);
448
+ contentUpdatedAt = void 0;
449
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
450
+ try {
451
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
452
+ } catch (e) {
453
+ contentUpdatedAt = undefined;
454
+ }
455
+ }
432
456
  results.push({
433
457
  data: {
434
458
  content: syncedBlockData,
435
459
  resourceId: blockContentResponse.blockAri,
460
+ contentUpdatedAt: contentUpdatedAt,
436
461
  blockInstanceId: blockContentResponse.blockInstanceId,
437
462
  sourceAri: blockContentResponse.sourceAri,
438
463
  product: blockContentResponse.product,
@@ -893,7 +893,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
893
893
  }, {
894
894
  key: "retrieveDynamicProviders",
895
895
  value: function retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
896
- var _syncBlock$data2, _syncBlock$data3, _syncBlock$data4, _syncBlock$data5;
896
+ var _syncBlock$data2, _syncBlock$data3;
897
897
  if (!this.dataProvider) {
898
898
  throw new Error('Data provider not set');
899
899
  }
@@ -904,15 +904,15 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
904
904
  return;
905
905
  }
906
906
  var syncBlock = this.getFromCache(resourceId);
907
- if (!syncBlock) {
907
+ if (!(syncBlock !== null && syncBlock !== void 0 && syncBlock.data)) {
908
908
  return;
909
909
  }
910
- if (!((_syncBlock$data2 = syncBlock.data) !== null && _syncBlock$data2 !== void 0 && _syncBlock$data2.sourceAri) || !((_syncBlock$data3 = syncBlock.data) !== null && _syncBlock$data3 !== void 0 && _syncBlock$data3.product)) {
910
+ if (!syncBlock.data.sourceAri || !syncBlock.data.product) {
911
911
  var _this$fireAnalyticsEv7;
912
912
  (_this$fireAnalyticsEv7 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv7 === void 0 || _this$fireAnalyticsEv7.call(this, (0, _errorHandling.fetchErrorPayload)('Sync block source ari or product not found'));
913
913
  return;
914
914
  }
915
- var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data4 = syncBlock.data) === null || _syncBlock$data4 === void 0 ? void 0 : _syncBlock$data4.sourceAri, (_syncBlock$data5 = syncBlock.data) === null || _syncBlock$data5 === void 0 ? void 0 : _syncBlock$data5.product);
915
+ var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data2 = syncBlock.data) === null || _syncBlock$data2 === void 0 ? void 0 : _syncBlock$data2.sourceAri, (_syncBlock$data3 = syncBlock.data) === null || _syncBlock$data3 === void 0 ? void 0 : _syncBlock$data3.product);
916
916
  if (!parentInfo) {
917
917
  throw new Error('Unable to retrive sync block parent info');
918
918
  }
@@ -31,7 +31,7 @@ export const isBlockContentResponse = response => {
31
31
  * "status": "active",
32
32
  * "createdAt": "2025-10-08T10:30:00.000Z",
33
33
  * "createdBy": "557058:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
34
- * "updatedAt": "2025-10-08T10:30:00.000Z"
34
+ * "contentUpdatedAt": "2025-10-08T10:30:00.000Z"
35
35
  * }
36
36
  * ],
37
37
  * "errors": [
@@ -79,6 +79,7 @@ const buildGetDocumentReferenceBlocksQuery = documentAri => `query ${GET_DOCUMEN
79
79
  blockAri
80
80
  blockInstanceId
81
81
  content
82
+ contentUpdatedAt
82
83
  createdAt
83
84
  createdBy
84
85
  product
@@ -100,8 +101,7 @@ export class BlockError extends Error {
100
101
  }
101
102
  }
102
103
  export const getSyncedBlockContent = async ({
103
- blockAri,
104
- documentAri
104
+ blockAri
105
105
  }) => {
106
106
  // Disable sending documentAri for now. We'll add it back if we find a way to update references that follows the save & refresh principle.
107
107
  // Slack discussion here: https://atlassian.slack.com/archives/C09DZT1TBNW/p1767836775552099?thread_ts=1767836754.024889&cid=C09DZT1TBNW
@@ -77,7 +77,6 @@ export const blockAriToResourceId = blockAri => {
77
77
  // convert BlockContentResponse to SyncBlockData
78
78
  // throws exception if JSON parsing fails
79
79
  // what's missing from BlockContentResponse to SyncBlockData:
80
- // - updatedAt
81
80
  // - sourceURL
82
81
  // - sourceTitle
83
82
  // - isSynced
@@ -94,9 +93,18 @@ export const convertToSyncBlockData = (data, resourceId) => {
94
93
  createdAt = undefined;
95
94
  }
96
95
  }
96
+ let contentUpdatedAt;
97
+ if (typeof data.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
98
+ try {
99
+ contentUpdatedAt = new Date(data.contentUpdatedAt).toISOString();
100
+ } catch (e) {
101
+ contentUpdatedAt = undefined;
102
+ }
103
+ }
97
104
  return {
98
105
  blockInstanceId: data.blockInstanceId,
99
106
  content: JSON.parse(data.content),
107
+ contentUpdatedAt,
100
108
  createdAt,
101
109
  createdBy: data.createdBy,
102
110
  product: data.product,
@@ -181,12 +189,21 @@ class BlockServiceADFFetchProvider {
181
189
 
182
190
  // Parse the synced block content from the response's content
183
191
  const syncedBlockData = JSON.parse(value);
192
+ let contentUpdatedAt;
193
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
194
+ try {
195
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
196
+ } catch (e) {
197
+ contentUpdatedAt = undefined;
198
+ }
199
+ }
184
200
  return {
185
201
  data: {
186
202
  content: syncedBlockData,
187
203
  resourceId: blockAri,
188
204
  blockInstanceId: blockContentResponse.blockInstanceId,
189
205
  // this was the node's localId, but has become the resourceId.
206
+ contentUpdatedAt,
190
207
  sourceAri: blockContentResponse.sourceAri,
191
208
  product: blockContentResponse.product,
192
209
  status: blockContentResponse.status
@@ -308,10 +325,19 @@ class BlockServiceADFFetchProvider {
308
325
  }
309
326
  try {
310
327
  const syncedBlockData = JSON.parse(value);
328
+ let contentUpdatedAt;
329
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
330
+ try {
331
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
332
+ } catch (e) {
333
+ contentUpdatedAt = undefined;
334
+ }
335
+ }
311
336
  results.push({
312
337
  data: {
313
338
  content: syncedBlockData,
314
339
  resourceId: blockContentResponse.blockAri,
340
+ contentUpdatedAt,
315
341
  blockInstanceId: blockContentResponse.blockInstanceId,
316
342
  sourceAri: blockContentResponse.sourceAri,
317
343
  product: blockContentResponse.product,
@@ -727,7 +727,7 @@ export class ReferenceSyncBlockStoreManager {
727
727
  return null;
728
728
  }
729
729
  retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
730
- var _syncBlock$data2, _syncBlock$data3, _syncBlock$data4, _syncBlock$data5;
730
+ var _syncBlock$data2, _syncBlock$data3;
731
731
  if (!this.dataProvider) {
732
732
  throw new Error('Data provider not set');
733
733
  }
@@ -738,15 +738,15 @@ export class ReferenceSyncBlockStoreManager {
738
738
  return;
739
739
  }
740
740
  const syncBlock = this.getFromCache(resourceId);
741
- if (!syncBlock) {
741
+ if (!(syncBlock !== null && syncBlock !== void 0 && syncBlock.data)) {
742
742
  return;
743
743
  }
744
- if (!((_syncBlock$data2 = syncBlock.data) !== null && _syncBlock$data2 !== void 0 && _syncBlock$data2.sourceAri) || !((_syncBlock$data3 = syncBlock.data) !== null && _syncBlock$data3 !== void 0 && _syncBlock$data3.product)) {
744
+ if (!syncBlock.data.sourceAri || !syncBlock.data.product) {
745
745
  var _this$fireAnalyticsEv14;
746
746
  (_this$fireAnalyticsEv14 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv14 === void 0 ? void 0 : _this$fireAnalyticsEv14.call(this, fetchErrorPayload('Sync block source ari or product not found'));
747
747
  return;
748
748
  }
749
- const parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data4 = syncBlock.data) === null || _syncBlock$data4 === void 0 ? void 0 : _syncBlock$data4.sourceAri, (_syncBlock$data5 = syncBlock.data) === null || _syncBlock$data5 === void 0 ? void 0 : _syncBlock$data5.product);
749
+ const parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data2 = syncBlock.data) === null || _syncBlock$data2 === void 0 ? void 0 : _syncBlock$data2.sourceAri, (_syncBlock$data3 = syncBlock.data) === null || _syncBlock$data3 === void 0 ? void 0 : _syncBlock$data3.product);
750
750
  if (!parentInfo) {
751
751
  throw new Error('Unable to retrive sync block parent info');
752
752
  }
@@ -41,7 +41,7 @@ export var isBlockContentResponse = function isBlockContentResponse(response) {
41
41
  * "status": "active",
42
42
  * "createdAt": "2025-10-08T10:30:00.000Z",
43
43
  * "createdBy": "557058:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
44
- * "updatedAt": "2025-10-08T10:30:00.000Z"
44
+ * "contentUpdatedAt": "2025-10-08T10:30:00.000Z"
45
45
  * }
46
46
  * ],
47
47
  * "errors": [
@@ -115,7 +115,7 @@ var BLOCK_SERVICE_API_URL = '/gateway/api/blocks/v1';
115
115
  var GRAPHQL_ENDPOINT = '/gateway/api/graphql';
116
116
  var GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_DOCUMENT_REFERENCE_BLOCKS';
117
117
  var buildGetDocumentReferenceBlocksQuery = function buildGetDocumentReferenceBlocksQuery(documentAri) {
118
- 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\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}");
118
+ 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}");
119
119
  };
120
120
  export var BlockError = /*#__PURE__*/function (_Error) {
121
121
  function BlockError(status) {
@@ -130,11 +130,11 @@ export var BlockError = /*#__PURE__*/function (_Error) {
130
130
  }( /*#__PURE__*/_wrapNativeSuper(Error));
131
131
  export var getSyncedBlockContent = /*#__PURE__*/function () {
132
132
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref2) {
133
- var blockAri, documentAri, queryParams, response;
133
+ var blockAri, queryParams, response;
134
134
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
135
135
  while (1) switch (_context2.prev = _context2.next) {
136
136
  case 0:
137
- blockAri = _ref2.blockAri, documentAri = _ref2.documentAri;
137
+ blockAri = _ref2.blockAri;
138
138
  // Disable sending documentAri for now. We'll add it back if we find a way to update references that follows the save & refresh principle.
139
139
  // Slack discussion here: https://atlassian.slack.com/archives/C09DZT1TBNW/p1767836775552099?thread_ts=1767836754.024889&cid=C09DZT1TBNW
140
140
  // const queryParams = documentAri ? `?documentAri=${encodeURIComponent(documentAri)}` : '';
@@ -88,7 +88,6 @@ export var blockAriToResourceId = function blockAriToResourceId(blockAri) {
88
88
  // convert BlockContentResponse to SyncBlockData
89
89
  // throws exception if JSON parsing fails
90
90
  // what's missing from BlockContentResponse to SyncBlockData:
91
- // - updatedAt
92
91
  // - sourceURL
93
92
  // - sourceTitle
94
93
  // - isSynced
@@ -105,9 +104,18 @@ export var convertToSyncBlockData = function convertToSyncBlockData(data, resour
105
104
  createdAt = undefined;
106
105
  }
107
106
  }
107
+ var contentUpdatedAt;
108
+ if (typeof data.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
109
+ try {
110
+ contentUpdatedAt = new Date(data.contentUpdatedAt).toISOString();
111
+ } catch (e) {
112
+ contentUpdatedAt = undefined;
113
+ }
114
+ }
108
115
  return {
109
116
  blockInstanceId: data.blockInstanceId,
110
117
  content: JSON.parse(data.content),
118
+ contentUpdatedAt: contentUpdatedAt,
111
119
  createdAt: createdAt,
112
120
  createdBy: data.createdBy,
113
121
  product: data.product,
@@ -198,7 +206,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
198
206
  key: "fetchData",
199
207
  value: function () {
200
208
  var _fetchData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(resourceId) {
201
- var blockAri, blockContentResponse, value, syncedBlockData;
209
+ var blockAri, blockContentResponse, value, syncedBlockData, contentUpdatedAt;
202
210
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
203
211
  while (1) switch (_context2.prev = _context2.next) {
204
212
  case 0:
@@ -226,39 +234,47 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
226
234
  case 8:
227
235
  // Parse the synced block content from the response's content
228
236
  syncedBlockData = JSON.parse(value);
237
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
238
+ try {
239
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
240
+ } catch (e) {
241
+ contentUpdatedAt = undefined;
242
+ }
243
+ }
229
244
  return _context2.abrupt("return", {
230
245
  data: {
231
246
  content: syncedBlockData,
232
247
  resourceId: blockAri,
233
248
  blockInstanceId: blockContentResponse.blockInstanceId,
234
249
  // this was the node's localId, but has become the resourceId.
250
+ contentUpdatedAt: contentUpdatedAt,
235
251
  sourceAri: blockContentResponse.sourceAri,
236
252
  product: blockContentResponse.product,
237
253
  status: blockContentResponse.status
238
254
  },
239
255
  resourceId: resourceId
240
256
  });
241
- case 12:
242
- _context2.prev = 12;
257
+ case 13:
258
+ _context2.prev = 13;
243
259
  _context2.t0 = _context2["catch"](1);
244
260
  if (!(_context2.t0 instanceof BlockError)) {
245
- _context2.next = 16;
261
+ _context2.next = 17;
246
262
  break;
247
263
  }
248
264
  return _context2.abrupt("return", {
249
265
  error: mapBlockError(_context2.t0),
250
266
  resourceId: resourceId
251
267
  });
252
- case 16:
268
+ case 17:
253
269
  return _context2.abrupt("return", {
254
270
  error: SyncBlockError.Errored,
255
271
  resourceId: resourceId
256
272
  });
257
- case 17:
273
+ case 18:
258
274
  case "end":
259
275
  return _context2.stop();
260
276
  }
261
- }, _callee2, this, [[1, 12]]);
277
+ }, _callee2, this, [[1, 13]]);
262
278
  }));
263
279
  function fetchData(_x2) {
264
280
  return _fetchData.apply(this, arguments);
@@ -351,7 +367,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
351
367
  value: (function () {
352
368
  var _batchFetchData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(blockNodeIdentifiers) {
353
369
  var _this2 = this;
354
- var blockIdentifiers, validResourceIds, processedResourceIds, response, results, _iterator, _step, blockContentResponse, resourceId, value, syncedBlockData, _iterator2, _step2, errorResponse, _resourceId, _iterator3, _step3, blockNodeIdentifier;
370
+ var blockIdentifiers, validResourceIds, processedResourceIds, response, results, _iterator, _step, blockContentResponse, resourceId, value, syncedBlockData, contentUpdatedAt, _iterator2, _step2, errorResponse, _resourceId, _iterator3, _step3, blockNodeIdentifier;
355
371
  return _regeneratorRuntime.wrap(function _callee4$(_context4) {
356
372
  while (1) switch (_context4.prev = _context4.next) {
357
373
  case 0:
@@ -423,10 +439,19 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
423
439
  case 24:
424
440
  try {
425
441
  syncedBlockData = JSON.parse(value);
442
+ contentUpdatedAt = void 0;
443
+ if (typeof blockContentResponse.contentUpdatedAt === 'number' && fg('platform_synced_block_dogfooding')) {
444
+ try {
445
+ contentUpdatedAt = new Date(blockContentResponse.contentUpdatedAt).toISOString();
446
+ } catch (e) {
447
+ contentUpdatedAt = undefined;
448
+ }
449
+ }
426
450
  results.push({
427
451
  data: {
428
452
  content: syncedBlockData,
429
453
  resourceId: blockContentResponse.blockAri,
454
+ contentUpdatedAt: contentUpdatedAt,
430
455
  blockInstanceId: blockContentResponse.blockInstanceId,
431
456
  sourceAri: blockContentResponse.sourceAri,
432
457
  product: blockContentResponse.product,
@@ -887,7 +887,7 @@ export var ReferenceSyncBlockStoreManager = /*#__PURE__*/function () {
887
887
  }, {
888
888
  key: "retrieveDynamicProviders",
889
889
  value: function retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
890
- var _syncBlock$data2, _syncBlock$data3, _syncBlock$data4, _syncBlock$data5;
890
+ var _syncBlock$data2, _syncBlock$data3;
891
891
  if (!this.dataProvider) {
892
892
  throw new Error('Data provider not set');
893
893
  }
@@ -898,15 +898,15 @@ export var ReferenceSyncBlockStoreManager = /*#__PURE__*/function () {
898
898
  return;
899
899
  }
900
900
  var syncBlock = this.getFromCache(resourceId);
901
- if (!syncBlock) {
901
+ if (!(syncBlock !== null && syncBlock !== void 0 && syncBlock.data)) {
902
902
  return;
903
903
  }
904
- if (!((_syncBlock$data2 = syncBlock.data) !== null && _syncBlock$data2 !== void 0 && _syncBlock$data2.sourceAri) || !((_syncBlock$data3 = syncBlock.data) !== null && _syncBlock$data3 !== void 0 && _syncBlock$data3.product)) {
904
+ if (!syncBlock.data.sourceAri || !syncBlock.data.product) {
905
905
  var _this$fireAnalyticsEv7;
906
906
  (_this$fireAnalyticsEv7 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv7 === void 0 || _this$fireAnalyticsEv7.call(this, fetchErrorPayload('Sync block source ari or product not found'));
907
907
  return;
908
908
  }
909
- var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data4 = syncBlock.data) === null || _syncBlock$data4 === void 0 ? void 0 : _syncBlock$data4.sourceAri, (_syncBlock$data5 = syncBlock.data) === null || _syncBlock$data5 === void 0 ? void 0 : _syncBlock$data5.product);
909
+ var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo((_syncBlock$data2 = syncBlock.data) === null || _syncBlock$data2 === void 0 ? void 0 : _syncBlock$data2.sourceAri, (_syncBlock$data3 = syncBlock.data) === null || _syncBlock$data3 === void 0 ? void 0 : _syncBlock$data3.product);
910
910
  if (!parentInfo) {
911
911
  throw new Error('Unable to retrive sync block parent info');
912
912
  }
@@ -3,6 +3,7 @@ export type BlockContentResponse = {
3
3
  blockAri: string;
4
4
  blockInstanceId: string;
5
5
  content: string;
6
+ contentUpdatedAt: number;
6
7
  createdAt: number;
7
8
  createdBy: string;
8
9
  product: SyncBlockProduct;
@@ -49,7 +50,7 @@ export declare const isBlockContentResponse: (response: BlockContentResponse | E
49
50
  * "status": "active",
50
51
  * "createdAt": "2025-10-08T10:30:00.000Z",
51
52
  * "createdBy": "557058:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
52
- * "updatedAt": "2025-10-08T10:30:00.000Z"
53
+ * "contentUpdatedAt": "2025-10-08T10:30:00.000Z"
53
54
  * }
54
55
  * ],
55
56
  * "errors": [
@@ -116,7 +117,7 @@ export declare class BlockError extends Error {
116
117
  readonly status: number;
117
118
  constructor(status: number);
118
119
  }
119
- export declare const getSyncedBlockContent: ({ blockAri, documentAri, }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
120
+ export declare const getSyncedBlockContent: ({ blockAri }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
120
121
  /**
121
122
  * Batch retrieves multiple synced blocks by their ARIs.
122
123
  *
@@ -29,6 +29,7 @@ export declare enum SyncBlockError {
29
29
  export interface SyncBlockData {
30
30
  blockInstanceId: BlockInstanceId;
31
31
  content: Array<ADFEntity>;
32
+ contentUpdatedAt?: string;
32
33
  createdAt?: string;
33
34
  createdBy?: string;
34
35
  isSynced?: boolean;
@@ -45,12 +46,12 @@ export interface SyncBlockData {
45
46
  sourceSubType?: string | null;
46
47
  sourceTitle?: string;
47
48
  sourceURL?: string;
48
- updatedAt?: string;
49
49
  status?: SyncBlockStatus;
50
50
  }
51
51
  export interface ReferenceSyncBlockResponse {
52
52
  blockAri: string;
53
53
  blockInstanceId?: BlockInstanceId;
54
+ contentUpdatedAt?: string;
54
55
  createdAt?: string;
55
56
  createdBy?: string;
56
57
  documentAri: string;
@@ -3,6 +3,7 @@ export type BlockContentResponse = {
3
3
  blockAri: string;
4
4
  blockInstanceId: string;
5
5
  content: string;
6
+ contentUpdatedAt: number;
6
7
  createdAt: number;
7
8
  createdBy: string;
8
9
  product: SyncBlockProduct;
@@ -49,7 +50,7 @@ export declare const isBlockContentResponse: (response: BlockContentResponse | E
49
50
  * "status": "active",
50
51
  * "createdAt": "2025-10-08T10:30:00.000Z",
51
52
  * "createdBy": "557058:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
52
- * "updatedAt": "2025-10-08T10:30:00.000Z"
53
+ * "contentUpdatedAt": "2025-10-08T10:30:00.000Z"
53
54
  * }
54
55
  * ],
55
56
  * "errors": [
@@ -116,7 +117,7 @@ export declare class BlockError extends Error {
116
117
  readonly status: number;
117
118
  constructor(status: number);
118
119
  }
119
- export declare const getSyncedBlockContent: ({ blockAri, documentAri, }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
120
+ export declare const getSyncedBlockContent: ({ blockAri }: GetSyncedBlockContentRequest) => Promise<BlockContentResponse>;
120
121
  /**
121
122
  * Batch retrieves multiple synced blocks by their ARIs.
122
123
  *
@@ -29,6 +29,7 @@ export declare enum SyncBlockError {
29
29
  export interface SyncBlockData {
30
30
  blockInstanceId: BlockInstanceId;
31
31
  content: Array<ADFEntity>;
32
+ contentUpdatedAt?: string;
32
33
  createdAt?: string;
33
34
  createdBy?: string;
34
35
  isSynced?: boolean;
@@ -45,12 +46,12 @@ export interface SyncBlockData {
45
46
  sourceSubType?: string | null;
46
47
  sourceTitle?: string;
47
48
  sourceURL?: string;
48
- updatedAt?: string;
49
49
  status?: SyncBlockStatus;
50
50
  }
51
51
  export interface ReferenceSyncBlockResponse {
52
52
  blockAri: string;
53
53
  blockInstanceId?: BlockInstanceId;
54
+ contentUpdatedAt?: string;
54
55
  createdAt?: string;
55
56
  createdBy?: string;
56
57
  documentAri: string;
package/package.json CHANGED
@@ -78,7 +78,7 @@
78
78
  }
79
79
  },
80
80
  "name": "@atlaskit/editor-synced-block-provider",
81
- "version": "3.13.0",
81
+ "version": "3.13.2",
82
82
  "description": "Synced Block Provider for @atlaskit/editor-plugin-synced-block",
83
83
  "author": "Atlassian Pty Ltd",
84
84
  "license": "Apache-2.0",