@atlaskit/editor-synced-block-provider 2.10.1 → 2.10.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.
Files changed (29) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/providers/confluence/confluenceContentAPI.js +21 -14
  3. package/dist/cjs/providers/syncBlockProvider.js +31 -1
  4. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +51 -10
  5. package/dist/cjs/store-manager/syncBlockStoreManager.js +1 -0
  6. package/dist/cjs/utils/ari.js +1 -1
  7. package/dist/es2019/providers/confluence/confluenceContentAPI.js +8 -2
  8. package/dist/es2019/providers/syncBlockProvider.js +31 -1
  9. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +51 -10
  10. package/dist/es2019/store-manager/syncBlockStoreManager.js +2 -0
  11. package/dist/es2019/utils/ari.js +1 -1
  12. package/dist/esm/providers/confluence/confluenceContentAPI.js +22 -15
  13. package/dist/esm/providers/syncBlockProvider.js +31 -1
  14. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +51 -10
  15. package/dist/esm/store-manager/syncBlockStoreManager.js +2 -0
  16. package/dist/esm/utils/ari.js +1 -1
  17. package/dist/types/common/types.d.ts +3 -1
  18. package/dist/types/index.d.ts +2 -2
  19. package/dist/types/providers/syncBlockProvider.d.ts +10 -1
  20. package/dist/types/providers/types.d.ts +20 -8
  21. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +1 -0
  22. package/dist/types/utils/blockService.d.ts +3 -3
  23. package/dist/types-ts4.5/common/types.d.ts +3 -1
  24. package/dist/types-ts4.5/index.d.ts +2 -2
  25. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +10 -1
  26. package/dist/types-ts4.5/providers/types.d.ts +20 -8
  27. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +1 -0
  28. package/dist/types-ts4.5/utils/blockService.d.ts +3 -3
  29. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 2.10.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`27e34de207285`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/27e34de207285) -
8
+ EDITOR-2771 Create media & emoji provider per each reference sync block
9
+ - Updated dependencies
10
+
3
11
  ## 2.10.1
4
12
 
5
13
  ### Patch Changes
@@ -17,6 +17,8 @@ var _ari = require("../../utils/ari");
17
17
  var _contentProperty3 = require("../../utils/contentProperty");
18
18
  var _errorHandling = require("../../utils/errorHandling");
19
19
  var _utils = require("../../utils/utils");
20
+ 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; }
21
+ 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; }
20
22
  /**
21
23
  * Configuration for Content API providers
22
24
  */
@@ -217,7 +219,7 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
217
219
  key: "writeData",
218
220
  value: function () {
219
221
  var _writeData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(data) {
220
- var match, resourceId, _match, pageId, pageType, localId, key, options, updatePayload, updateResult;
222
+ var match, resourceId, _match, pageId, pageType, localId, key, sourceAri, syncBlockDataWithSourceDocumentAri, options, updatePayload, updateResult;
221
223
  return _regenerator.default.wrap(function _callee3$(_context3) {
222
224
  while (1) switch (_context3.prev = _context3.next) {
223
225
  case 0:
@@ -238,28 +240,33 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
238
240
  // Update existing content property
239
241
  localId = (0, _ari.getLocalIdFromAri)(resourceId);
240
242
  key = getContentPropertyKey(this.config.contentPropertyKey, localId);
243
+ sourceAri = (0, _ari.getConfluencePageAri)(pageId, this.config.cloudId, pageType);
244
+ syncBlockDataWithSourceDocumentAri = _objectSpread(_objectSpread({}, data), {}, {
245
+ product: 'confluence-page',
246
+ sourceAri: sourceAri
247
+ });
241
248
  options = {
242
249
  pageId: pageId,
243
250
  key: key,
244
- value: data,
251
+ value: syncBlockDataWithSourceDocumentAri,
245
252
  cloudId: this.config.cloudId,
246
253
  pageType: pageType
247
254
  };
248
- _context3.next = 15;
255
+ _context3.next = 17;
249
256
  return (0, _contentProperty3.updateContentProperty)(options);
250
- case 15:
257
+ case 17:
251
258
  updatePayload = _context3.sent;
252
259
  updateResult = (0, _utils.isBlogPageType)(pageType) ? updatePayload.data.confluence.updateValueBlogPostProperty.blogPostProperty : updatePayload.data.confluence.updateValuePageProperty.pageProperty;
253
260
  if (!((updateResult === null || updateResult === void 0 ? void 0 : updateResult.key) === key)) {
254
- _context3.next = 21;
261
+ _context3.next = 23;
255
262
  break;
256
263
  }
257
264
  return _context3.abrupt("return", {
258
265
  resourceId: resourceId
259
266
  });
260
- case 21:
267
+ case 23:
261
268
  if (updateResult) {
262
- _context3.next = 25;
269
+ _context3.next = 27;
263
270
  break;
264
271
  }
265
272
  return _context3.abrupt("return", this.createNewContentProperty(pageId, key, data, pageType).then(function () {
@@ -271,24 +278,24 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
271
278
  error: error
272
279
  };
273
280
  }));
274
- case 25:
281
+ case 27:
275
282
  return _context3.abrupt("return", {
276
283
  error: "Failed to update ".concat(pageType, " content property")
277
284
  });
278
- case 26:
279
- _context3.next = 31;
280
- break;
281
285
  case 28:
282
- _context3.prev = 28;
286
+ _context3.next = 33;
287
+ break;
288
+ case 30:
289
+ _context3.prev = 30;
283
290
  _context3.t1 = _context3["catch"](9);
284
291
  return _context3.abrupt("return", {
285
292
  error: "Failed to write ".concat(pageType)
286
293
  });
287
- case 31:
294
+ case 33:
288
295
  case "end":
289
296
  return _context3.stop();
290
297
  }
291
- }, _callee3, this, [[1, 5], [9, 28]]);
298
+ }, _callee3, this, [[1, 5], [9, 30]]);
292
299
  }));
293
300
  function writeData(_x6) {
294
301
  return _writeData.apply(this, arguments);
@@ -17,6 +17,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
17
17
  var _react = require("react");
18
18
  var _types = require("../common/types");
19
19
  var _types2 = require("../providers/types");
20
+ var _ari = require("../utils/ari");
20
21
  var _sourceInfo = require("../utils/sourceInfo");
21
22
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
22
23
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
@@ -217,7 +218,7 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
217
218
  }, {
218
219
  key: "retrieveSyncBlockSourceInfo",
219
220
  value: function retrieveSyncBlockSourceInfo(node) {
220
- // with content API, this is the concatenation of the page ARI and the block's localId.
221
+ // with content API, this is the concatenation of the page ARI and the block's localId.
221
222
  // with block service, this is the ARI of the block.
222
223
  // this can be cleaned up from the specific providers and placed here after platform_synced_blocks_block_service_provider
223
224
  var resourceId = node.attrs.resourceId;
@@ -250,6 +251,35 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
250
251
  value: function getSyncedBlockRendererProviderOptions() {
251
252
  return this.providerOptions;
252
253
  }
254
+
255
+ /**
256
+ * Retrieve the parent info for the sync block
257
+ *
258
+ * @param resourceId
259
+ * @param syncBlockInstance
260
+ *
261
+ * @returns The parent info for the sync block
262
+ */
263
+ }, {
264
+ key: "retrieveSyncBlockParentInfo",
265
+ value: function retrieveSyncBlockParentInfo(syncBlockInstance) {
266
+ if (!syncBlockInstance || !syncBlockInstance.data) {
267
+ return undefined;
268
+ }
269
+ var _syncBlockInstance$da = syncBlockInstance.data,
270
+ sourceAri = _syncBlockInstance$da.sourceAri,
271
+ resourceId = _syncBlockInstance$da.resourceId,
272
+ contentProduct = _syncBlockInstance$da.product;
273
+
274
+ // Temp solution to get the pageId from resource since the sourceDocumentAri is not available for older sync blocks
275
+ var pageARI = sourceAri || resourceId;
276
+ var _getPageIdAndTypeFrom = (0, _ari.getPageIdAndTypeFromAri)(pageARI),
277
+ contentId = _getPageIdAndTypeFrom.id;
278
+ return {
279
+ contentId: contentId,
280
+ contentProduct: contentProduct || 'confluence-page'
281
+ };
282
+ }
253
283
  }]);
254
284
  }(_types2.SyncBlockDataProvider);
255
285
  var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvider(fetchProvider, writeProvider, sourceId, providerOptions) {
@@ -348,20 +348,61 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
348
348
  return undefined;
349
349
  }
350
350
  var _this$dataProvider$ge = this.dataProvider.getSyncedBlockRendererProviderOptions(),
351
- parentDataProviders = _this$dataProvider$ge.parentDataProviders;
352
- if (!this.providerFactories.has(resourceId)) {
353
- // TODO: EDITOR-2771 - In follow up PR, create media & emoji providers per ref sync block
354
- // The media & emoji providers will be set later, once we get ref sync block data with page ID
355
- // So we need to keep the reference to the Provider Factory so we can then set media & emoji providers later
356
- this.providerFactories.set(resourceId, _providerFactory.ProviderFactory.create({
357
- emojiProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.emojiProvider,
358
- mediaProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mediaProvider,
351
+ parentDataProviders = _this$dataProvider$ge.parentDataProviders,
352
+ providerCreator = _this$dataProvider$ge.providerCreator;
353
+ var providerFactory = this.providerFactories.get(resourceId);
354
+ if (!providerFactory) {
355
+ providerFactory = _providerFactory.ProviderFactory.create({
359
356
  mentionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mentionProvider,
360
357
  profilecardProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.profilecardProvider,
361
358
  taskDecisionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.taskDecisionProvider
362
- }));
359
+ });
360
+ this.providerFactories.set(resourceId, providerFactory);
361
+ }
362
+ if (providerCreator) {
363
+ this.retrieveDynamicProviders(resourceId, providerFactory, providerCreator);
364
+ }
365
+ return providerFactory;
366
+ }
367
+ }, {
368
+ key: "retrieveDynamicProviders",
369
+ value: function retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
370
+ if (!this.dataProvider) {
371
+ return;
372
+ }
373
+ var hasMediaProvider = providerFactory.hasProvider('mediaProvider');
374
+ var hasEmojiProvider = providerFactory.hasProvider('emojiProvider');
375
+ if (hasMediaProvider && hasEmojiProvider) {
376
+ return;
377
+ }
378
+ var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo(this.syncBlockCache.get(resourceId));
379
+ if (!parentInfo) {
380
+ return;
381
+ }
382
+ var contentId = parentInfo.contentId,
383
+ contentProduct = parentInfo.contentProduct;
384
+ if (!hasMediaProvider) {
385
+ if (providerCreator.createMediaProvider && contentId && contentProduct) {
386
+ var mediaProvider = providerCreator.createMediaProvider({
387
+ contentProduct: contentProduct,
388
+ contentId: contentId
389
+ });
390
+ if (mediaProvider) {
391
+ providerFactory.setProvider('mediaProvider', mediaProvider);
392
+ }
393
+ }
394
+ }
395
+ if (!hasEmojiProvider) {
396
+ if (providerCreator.createEmojiProvider && contentId && contentProduct) {
397
+ var emojiProvider = providerCreator.createEmojiProvider({
398
+ contentProduct: contentProduct,
399
+ contentId: contentId
400
+ });
401
+ if (emojiProvider) {
402
+ providerFactory.setProvider('emojiProvider', emojiProvider);
403
+ }
404
+ }
363
405
  }
364
- return this.providerFactories.get(resourceId);
365
406
  }
366
407
  }, {
367
408
  key: "destroy",
@@ -10,6 +10,7 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
10
10
  var _utils = require("../utils/utils");
11
11
  var _referenceSyncBlockStoreManager = require("./referenceSyncBlockStoreManager");
12
12
  var _sourceSyncBlockStoreManager = require("./sourceSyncBlockStoreManager");
13
+ // eslint-disable-next-line no-restricted-imports
13
14
  // A store manager responsible for the lifecycle and state management of sync blocks in an editor instance.
14
15
  // Supports create, read, update, and delete operations for sync blocks.
15
16
  // Designed to manage local in-memory state and synchronize with an external data provider.
@@ -11,7 +11,7 @@ var getConfluencePageAri = exports.getConfluencePageAri = function getConfluence
11
11
  return "ari:cloud:confluence:".concat(cloudId, ":").concat(pageType, "/").concat(pageId);
12
12
  };
13
13
 
14
- // For extracting from Page ARI and also the content property's version of resourceId
14
+ // For extracting from Page ARI and also the content property's version of resourceId
15
15
  var getPageIdAndTypeFromAri = exports.getPageIdAndTypeFromAri = function getPageIdAndTypeFromAri(ari) {
16
16
  var match = ari.match(/ari:cloud:confluence:[^:]+:(page|blogpost)\/(\d+)/);
17
17
  if (match !== null && match !== void 0 && match[2]) {
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { useMemo } from 'react';
3
3
  import { SyncBlockError } from '../../common/types';
4
- import { getLocalIdFromAri, getPageARIFromResourceId, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId } from '../../utils/ari';
4
+ import { getConfluencePageAri, getPageARIFromResourceId, getLocalIdFromAri, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId } from '../../utils/ari';
5
5
  import { getContentProperty, createContentProperty, updateContentProperty, deleteContentProperty } from '../../utils/contentProperty';
6
6
  import { stringifyError } from '../../utils/errorHandling';
7
7
  import { isBlogPageType } from '../../utils/utils';
@@ -166,10 +166,16 @@ class ConfluenceADFWriteProvider {
166
166
  // Update existing content property
167
167
  const localId = getLocalIdFromAri(resourceId);
168
168
  const key = getContentPropertyKey(this.config.contentPropertyKey, localId);
169
+ const sourceAri = getConfluencePageAri(pageId, this.config.cloudId, pageType);
170
+ const syncBlockDataWithSourceDocumentAri = {
171
+ ...data,
172
+ product: 'confluence-page',
173
+ sourceAri
174
+ };
169
175
  const options = {
170
176
  pageId,
171
177
  key,
172
- value: data,
178
+ value: syncBlockDataWithSourceDocumentAri,
173
179
  cloudId: this.config.cloudId,
174
180
  pageType
175
181
  };
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { useMemo } from 'react';
3
3
  import { SyncBlockError } from '../common/types';
4
4
  import { SyncBlockDataProvider } from '../providers/types';
5
+ import { getPageIdAndTypeFromAri } from '../utils/ari';
5
6
  import { fetchSourceInfo } from '../utils/sourceInfo';
6
7
  export class SyncBlockProvider extends SyncBlockDataProvider {
7
8
  // the source document ARI; that the source sync block is on.
@@ -137,7 +138,7 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
137
138
  * @returns The source info
138
139
  */
139
140
  retrieveSyncBlockSourceInfo(node) {
140
- // with content API, this is the concatenation of the page ARI and the block's localId.
141
+ // with content API, this is the concatenation of the page ARI and the block's localId.
141
142
  // with block service, this is the ARI of the block.
142
143
  // this can be cleaned up from the specific providers and placed here after platform_synced_blocks_block_service_provider
143
144
  const {
@@ -168,6 +169,35 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
168
169
  getSyncedBlockRendererProviderOptions() {
169
170
  return this.providerOptions;
170
171
  }
172
+
173
+ /**
174
+ * Retrieve the parent info for the sync block
175
+ *
176
+ * @param resourceId
177
+ * @param syncBlockInstance
178
+ *
179
+ * @returns The parent info for the sync block
180
+ */
181
+ retrieveSyncBlockParentInfo(syncBlockInstance) {
182
+ if (!syncBlockInstance || !syncBlockInstance.data) {
183
+ return undefined;
184
+ }
185
+ const {
186
+ sourceAri,
187
+ resourceId,
188
+ product: contentProduct
189
+ } = syncBlockInstance.data;
190
+
191
+ // Temp solution to get the pageId from resource since the sourceDocumentAri is not available for older sync blocks
192
+ const pageARI = sourceAri || resourceId;
193
+ const {
194
+ id: contentId
195
+ } = getPageIdAndTypeFromAri(pageARI);
196
+ return {
197
+ contentId,
198
+ contentProduct: contentProduct || 'confluence-page'
199
+ };
200
+ }
171
201
  }
172
202
  export const useMemoizedSyncedBlockProvider = (fetchProvider, writeProvider, sourceId, providerOptions) => {
173
203
  return useMemo(() => {
@@ -235,21 +235,62 @@ export class ReferenceSyncBlockStoreManager {
235
235
  return undefined;
236
236
  }
237
237
  const {
238
- parentDataProviders
238
+ parentDataProviders,
239
+ providerCreator
239
240
  } = this.dataProvider.getSyncedBlockRendererProviderOptions();
240
- if (!this.providerFactories.has(resourceId)) {
241
- // TODO: EDITOR-2771 - In follow up PR, create media & emoji providers per ref sync block
242
- // The media & emoji providers will be set later, once we get ref sync block data with page ID
243
- // So we need to keep the reference to the Provider Factory so we can then set media & emoji providers later
244
- this.providerFactories.set(resourceId, ProviderFactory.create({
245
- emojiProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.emojiProvider,
246
- mediaProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mediaProvider,
241
+ let providerFactory = this.providerFactories.get(resourceId);
242
+ if (!providerFactory) {
243
+ providerFactory = ProviderFactory.create({
247
244
  mentionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mentionProvider,
248
245
  profilecardProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.profilecardProvider,
249
246
  taskDecisionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.taskDecisionProvider
250
- }));
247
+ });
248
+ this.providerFactories.set(resourceId, providerFactory);
249
+ }
250
+ if (providerCreator) {
251
+ this.retrieveDynamicProviders(resourceId, providerFactory, providerCreator);
252
+ }
253
+ return providerFactory;
254
+ }
255
+ retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
256
+ if (!this.dataProvider) {
257
+ return;
258
+ }
259
+ const hasMediaProvider = providerFactory.hasProvider('mediaProvider');
260
+ const hasEmojiProvider = providerFactory.hasProvider('emojiProvider');
261
+ if (hasMediaProvider && hasEmojiProvider) {
262
+ return;
263
+ }
264
+ const parentInfo = this.dataProvider.retrieveSyncBlockParentInfo(this.syncBlockCache.get(resourceId));
265
+ if (!parentInfo) {
266
+ return;
267
+ }
268
+ const {
269
+ contentId,
270
+ contentProduct
271
+ } = parentInfo;
272
+ if (!hasMediaProvider) {
273
+ if (providerCreator.createMediaProvider && contentId && contentProduct) {
274
+ const mediaProvider = providerCreator.createMediaProvider({
275
+ contentProduct,
276
+ contentId
277
+ });
278
+ if (mediaProvider) {
279
+ providerFactory.setProvider('mediaProvider', mediaProvider);
280
+ }
281
+ }
282
+ }
283
+ if (!hasEmojiProvider) {
284
+ if (providerCreator.createEmojiProvider && contentId && contentProduct) {
285
+ const emojiProvider = providerCreator.createEmojiProvider({
286
+ contentProduct,
287
+ contentId
288
+ });
289
+ if (emojiProvider) {
290
+ providerFactory.setProvider('emojiProvider', emojiProvider);
291
+ }
292
+ }
251
293
  }
252
- return this.providerFactories.get(resourceId);
253
294
  }
254
295
  destroy() {
255
296
  this.syncBlockCache.clear();
@@ -1,3 +1,5 @@
1
+ // eslint-disable-next-line no-restricted-imports
2
+
1
3
  import { convertPMNodeToSyncBlockNode } from '../utils/utils';
2
4
  import { ReferenceSyncBlockStoreManager } from './referenceSyncBlockStoreManager';
3
5
  import { SourceSyncBlockStoreManager } from './sourceSyncBlockStoreManager';
@@ -2,7 +2,7 @@
2
2
 
3
3
  export const getConfluencePageAri = (pageId, cloudId, pageType = 'page') => `ari:cloud:confluence:${cloudId}:${pageType}/${pageId}`;
4
4
 
5
- // For extracting from Page ARI and also the content property's version of resourceId
5
+ // For extracting from Page ARI and also the content property's version of resourceId
6
6
  export const getPageIdAndTypeFromAri = ari => {
7
7
  const match = ari.match(/ari:cloud:confluence:[^:]+:(page|blogpost)\/(\d+)/);
8
8
  if (match !== null && match !== void 0 && match[2]) {
@@ -3,10 +3,12 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
4
  import _createClass from "@babel/runtime/helpers/createClass";
5
5
  import _typeof from "@babel/runtime/helpers/typeof";
6
+ 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; }
7
+ 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) { _defineProperty(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; }
6
8
  import _regeneratorRuntime from "@babel/runtime/regenerator";
7
9
  import { useMemo } from 'react';
8
10
  import { SyncBlockError } from '../../common/types';
9
- import { getLocalIdFromAri, getPageARIFromResourceId, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId } from '../../utils/ari';
11
+ import { getConfluencePageAri, getPageARIFromResourceId, getLocalIdFromAri, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId } from '../../utils/ari';
10
12
  import { getContentProperty, createContentProperty, updateContentProperty, deleteContentProperty } from '../../utils/contentProperty';
11
13
  import { stringifyError } from '../../utils/errorHandling';
12
14
  import { isBlogPageType } from '../../utils/utils';
@@ -211,7 +213,7 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
211
213
  key: "writeData",
212
214
  value: function () {
213
215
  var _writeData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(data) {
214
- var match, resourceId, _match, pageId, pageType, localId, key, options, updatePayload, updateResult;
216
+ var match, resourceId, _match, pageId, pageType, localId, key, sourceAri, syncBlockDataWithSourceDocumentAri, options, updatePayload, updateResult;
215
217
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
216
218
  while (1) switch (_context3.prev = _context3.next) {
217
219
  case 0:
@@ -232,28 +234,33 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
232
234
  // Update existing content property
233
235
  localId = getLocalIdFromAri(resourceId);
234
236
  key = getContentPropertyKey(this.config.contentPropertyKey, localId);
237
+ sourceAri = getConfluencePageAri(pageId, this.config.cloudId, pageType);
238
+ syncBlockDataWithSourceDocumentAri = _objectSpread(_objectSpread({}, data), {}, {
239
+ product: 'confluence-page',
240
+ sourceAri: sourceAri
241
+ });
235
242
  options = {
236
243
  pageId: pageId,
237
244
  key: key,
238
- value: data,
245
+ value: syncBlockDataWithSourceDocumentAri,
239
246
  cloudId: this.config.cloudId,
240
247
  pageType: pageType
241
248
  };
242
- _context3.next = 15;
249
+ _context3.next = 17;
243
250
  return updateContentProperty(options);
244
- case 15:
251
+ case 17:
245
252
  updatePayload = _context3.sent;
246
253
  updateResult = isBlogPageType(pageType) ? updatePayload.data.confluence.updateValueBlogPostProperty.blogPostProperty : updatePayload.data.confluence.updateValuePageProperty.pageProperty;
247
254
  if (!((updateResult === null || updateResult === void 0 ? void 0 : updateResult.key) === key)) {
248
- _context3.next = 21;
255
+ _context3.next = 23;
249
256
  break;
250
257
  }
251
258
  return _context3.abrupt("return", {
252
259
  resourceId: resourceId
253
260
  });
254
- case 21:
261
+ case 23:
255
262
  if (updateResult) {
256
- _context3.next = 25;
263
+ _context3.next = 27;
257
264
  break;
258
265
  }
259
266
  return _context3.abrupt("return", this.createNewContentProperty(pageId, key, data, pageType).then(function () {
@@ -265,24 +272,24 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
265
272
  error: error
266
273
  };
267
274
  }));
268
- case 25:
275
+ case 27:
269
276
  return _context3.abrupt("return", {
270
277
  error: "Failed to update ".concat(pageType, " content property")
271
278
  });
272
- case 26:
273
- _context3.next = 31;
274
- break;
275
279
  case 28:
276
- _context3.prev = 28;
280
+ _context3.next = 33;
281
+ break;
282
+ case 30:
283
+ _context3.prev = 30;
277
284
  _context3.t1 = _context3["catch"](9);
278
285
  return _context3.abrupt("return", {
279
286
  error: "Failed to write ".concat(pageType)
280
287
  });
281
- case 31:
288
+ case 33:
282
289
  case "end":
283
290
  return _context3.stop();
284
291
  }
285
- }, _callee3, this, [[1, 5], [9, 28]]);
292
+ }, _callee3, this, [[1, 5], [9, 30]]);
286
293
  }));
287
294
  function writeData(_x6) {
288
295
  return _writeData.apply(this, arguments);
@@ -12,6 +12,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
12
12
  import { useMemo } from 'react';
13
13
  import { SyncBlockError } from '../common/types';
14
14
  import { SyncBlockDataProvider } from '../providers/types';
15
+ import { getPageIdAndTypeFromAri } from '../utils/ari';
15
16
  import { fetchSourceInfo } from '../utils/sourceInfo';
16
17
  export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
17
18
  // the source document ARI; that the source sync block is on.
@@ -210,7 +211,7 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
210
211
  }, {
211
212
  key: "retrieveSyncBlockSourceInfo",
212
213
  value: function retrieveSyncBlockSourceInfo(node) {
213
- // with content API, this is the concatenation of the page ARI and the block's localId.
214
+ // with content API, this is the concatenation of the page ARI and the block's localId.
214
215
  // with block service, this is the ARI of the block.
215
216
  // this can be cleaned up from the specific providers and placed here after platform_synced_blocks_block_service_provider
216
217
  var resourceId = node.attrs.resourceId;
@@ -243,6 +244,35 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
243
244
  value: function getSyncedBlockRendererProviderOptions() {
244
245
  return this.providerOptions;
245
246
  }
247
+
248
+ /**
249
+ * Retrieve the parent info for the sync block
250
+ *
251
+ * @param resourceId
252
+ * @param syncBlockInstance
253
+ *
254
+ * @returns The parent info for the sync block
255
+ */
256
+ }, {
257
+ key: "retrieveSyncBlockParentInfo",
258
+ value: function retrieveSyncBlockParentInfo(syncBlockInstance) {
259
+ if (!syncBlockInstance || !syncBlockInstance.data) {
260
+ return undefined;
261
+ }
262
+ var _syncBlockInstance$da = syncBlockInstance.data,
263
+ sourceAri = _syncBlockInstance$da.sourceAri,
264
+ resourceId = _syncBlockInstance$da.resourceId,
265
+ contentProduct = _syncBlockInstance$da.product;
266
+
267
+ // Temp solution to get the pageId from resource since the sourceDocumentAri is not available for older sync blocks
268
+ var pageARI = sourceAri || resourceId;
269
+ var _getPageIdAndTypeFrom = getPageIdAndTypeFromAri(pageARI),
270
+ contentId = _getPageIdAndTypeFrom.id;
271
+ return {
272
+ contentId: contentId,
273
+ contentProduct: contentProduct || 'confluence-page'
274
+ };
275
+ }
246
276
  }]);
247
277
  }(SyncBlockDataProvider);
248
278
  export var useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvider(fetchProvider, writeProvider, sourceId, providerOptions) {
@@ -341,20 +341,61 @@ export var ReferenceSyncBlockStoreManager = /*#__PURE__*/function () {
341
341
  return undefined;
342
342
  }
343
343
  var _this$dataProvider$ge = this.dataProvider.getSyncedBlockRendererProviderOptions(),
344
- parentDataProviders = _this$dataProvider$ge.parentDataProviders;
345
- if (!this.providerFactories.has(resourceId)) {
346
- // TODO: EDITOR-2771 - In follow up PR, create media & emoji providers per ref sync block
347
- // The media & emoji providers will be set later, once we get ref sync block data with page ID
348
- // So we need to keep the reference to the Provider Factory so we can then set media & emoji providers later
349
- this.providerFactories.set(resourceId, ProviderFactory.create({
350
- emojiProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.emojiProvider,
351
- mediaProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mediaProvider,
344
+ parentDataProviders = _this$dataProvider$ge.parentDataProviders,
345
+ providerCreator = _this$dataProvider$ge.providerCreator;
346
+ var providerFactory = this.providerFactories.get(resourceId);
347
+ if (!providerFactory) {
348
+ providerFactory = ProviderFactory.create({
352
349
  mentionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mentionProvider,
353
350
  profilecardProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.profilecardProvider,
354
351
  taskDecisionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.taskDecisionProvider
355
- }));
352
+ });
353
+ this.providerFactories.set(resourceId, providerFactory);
354
+ }
355
+ if (providerCreator) {
356
+ this.retrieveDynamicProviders(resourceId, providerFactory, providerCreator);
357
+ }
358
+ return providerFactory;
359
+ }
360
+ }, {
361
+ key: "retrieveDynamicProviders",
362
+ value: function retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
363
+ if (!this.dataProvider) {
364
+ return;
365
+ }
366
+ var hasMediaProvider = providerFactory.hasProvider('mediaProvider');
367
+ var hasEmojiProvider = providerFactory.hasProvider('emojiProvider');
368
+ if (hasMediaProvider && hasEmojiProvider) {
369
+ return;
370
+ }
371
+ var parentInfo = this.dataProvider.retrieveSyncBlockParentInfo(this.syncBlockCache.get(resourceId));
372
+ if (!parentInfo) {
373
+ return;
374
+ }
375
+ var contentId = parentInfo.contentId,
376
+ contentProduct = parentInfo.contentProduct;
377
+ if (!hasMediaProvider) {
378
+ if (providerCreator.createMediaProvider && contentId && contentProduct) {
379
+ var mediaProvider = providerCreator.createMediaProvider({
380
+ contentProduct: contentProduct,
381
+ contentId: contentId
382
+ });
383
+ if (mediaProvider) {
384
+ providerFactory.setProvider('mediaProvider', mediaProvider);
385
+ }
386
+ }
387
+ }
388
+ if (!hasEmojiProvider) {
389
+ if (providerCreator.createEmojiProvider && contentId && contentProduct) {
390
+ var emojiProvider = providerCreator.createEmojiProvider({
391
+ contentProduct: contentProduct,
392
+ contentId: contentId
393
+ });
394
+ if (emojiProvider) {
395
+ providerFactory.setProvider('emojiProvider', emojiProvider);
396
+ }
397
+ }
356
398
  }
357
- return this.providerFactories.get(resourceId);
358
399
  }
359
400
  }, {
360
401
  key: "destroy",
@@ -1,5 +1,7 @@
1
1
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
2
  import _createClass from "@babel/runtime/helpers/createClass";
3
+ // eslint-disable-next-line no-restricted-imports
4
+
3
5
  import { convertPMNodeToSyncBlockNode } from '../utils/utils';
4
6
  import { ReferenceSyncBlockStoreManager } from './referenceSyncBlockStoreManager';
5
7
  import { SourceSyncBlockStoreManager } from './sourceSyncBlockStoreManager';
@@ -5,7 +5,7 @@ export var getConfluencePageAri = function getConfluencePageAri(pageId, cloudId)
5
5
  return "ari:cloud:confluence:".concat(cloudId, ":").concat(pageType, "/").concat(pageId);
6
6
  };
7
7
 
8
- // For extracting from Page ARI and also the content property's version of resourceId
8
+ // For extracting from Page ARI and also the content property's version of resourceId
9
9
  export var getPageIdAndTypeFromAri = function getPageIdAndTypeFromAri(ari) {
10
10
  var match = ari.match(/ari:cloud:confluence:[^:]+:(page|blogpost)\/(\d+)/);
11
11
  if (match !== null && match !== void 0 && match[2]) {
@@ -2,6 +2,7 @@ import type { ADFEntity } from '@atlaskit/adf-utils/types';
2
2
  import type { JSONNode } from '@atlaskit/editor-json-transformer/types';
3
3
  export type BlockInstanceId = string;
4
4
  export type ResourceId = string;
5
+ export type SyncBlockProduct = 'confluence-page' | 'jira-work-item';
5
6
  export type SyncBlockAttrs = {
6
7
  localId: BlockInstanceId;
7
8
  resourceId: ResourceId;
@@ -22,8 +23,9 @@ export interface SyncBlockData {
22
23
  createdAt?: string;
23
24
  createdBy?: string;
24
25
  isSynced?: boolean;
26
+ product?: SyncBlockProduct;
25
27
  resourceId: ResourceId;
26
- sourceDocumentAri?: string;
28
+ sourceAri?: string;
27
29
  sourceTitle?: string;
28
30
  sourceURL?: string;
29
31
  updatedAt?: string;
@@ -4,11 +4,11 @@ export type { SyncBlockData, SyncBlockNode } from './common/types';
4
4
  export { useFetchSyncBlockData, type UseFetchSyncBlockDataResult, } from './hooks/useFetchSyncBlockData';
5
5
  export { useFetchSyncBlockTitle } from './hooks/useFetchSyncBlockTitle';
6
6
  export { useHandleContentChanges } from './hooks/useHandleContentChanges';
7
- export { blockResourceIdFromSourceAndLocalId, getLocalIdFromResourceId } from './providers/block-service/ari';
7
+ export { blockResourceIdFromSourceAndLocalId, getLocalIdFromResourceId, } from './providers/block-service/ari';
8
8
  export { useMemoizedBlockServiceAPIProviders } from './providers/block-service/blockServiceAPI';
9
9
  export { createContentAPIProvidersWithDefaultKey, useMemoizedContentAPIProviders, } from './providers/confluence/confluenceContentAPI';
10
10
  export { SyncBlockProvider as SyncedBlockProvider, useMemoizedSyncedBlockProvider, } from './providers/syncBlockProvider';
11
- export type { ADFFetchProvider, ADFWriteProvider, SyncBlockDataProvider, SyncBlockInstance, } from './providers/types';
11
+ export type { ADFFetchProvider, ADFWriteProvider, SyncBlockDataProvider, SyncBlockInstance, MediaEmojiProviderOptions, SyncedBlockRendererProviderOptions, SyncBlockRendererProviderCreator, } from './providers/types';
12
12
  export { ReferenceSyncBlockStoreManager } from './store-manager/referenceSyncBlockStoreManager';
13
13
  export { SyncBlockStoreManager } from './store-manager/syncBlockStoreManager';
14
14
  export { getConfluencePageAri, getLocalIdFromAri, getPageARIFromResourceId, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId, } from './utils/ari';
@@ -1,6 +1,6 @@
1
1
  import type { JSONNode } from '@atlaskit/editor-json-transformer/types';
2
2
  import { type SyncBlockData, type SyncBlockNode } from '../common/types';
3
- import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type SyncBlockInstance, type SyncBlockSourceInfo, type SyncedBlockRendererProviderOptions, type WriteSyncBlockResult } from '../providers/types';
3
+ import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type SyncBlockInstance, type SyncBlockParentInfo, type SyncBlockSourceInfo, type SyncedBlockRendererProviderOptions, type WriteSyncBlockResult } from '../providers/types';
4
4
  export declare class SyncBlockProvider extends SyncBlockDataProvider {
5
5
  name: string;
6
6
  private fetchProvider;
@@ -79,5 +79,14 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
79
79
  * @returns The synced block renderer provider options
80
80
  */
81
81
  getSyncedBlockRendererProviderOptions(): SyncedBlockRendererProviderOptions;
82
+ /**
83
+ * Retrieve the parent info for the sync block
84
+ *
85
+ * @param resourceId
86
+ * @param syncBlockInstance
87
+ *
88
+ * @returns The parent info for the sync block
89
+ */
90
+ retrieveSyncBlockParentInfo(syncBlockInstance: SyncBlockInstance | undefined): SyncBlockParentInfo | undefined;
82
91
  }
83
92
  export declare const useMemoizedSyncedBlockProvider: (fetchProvider: ADFFetchProvider, writeProvider: ADFWriteProvider, sourceId: string, providerOptions: SyncedBlockRendererProviderOptions) => SyncBlockProvider;
@@ -1,7 +1,9 @@
1
- import type { SyncedBlockRendererDataProviders, MediaProvider } from '@atlaskit/editor-common/provider-factory';
1
+ import type { MediaProvider, ProfilecardProvider } from '@atlaskit/editor-common/provider-factory';
2
2
  import type { EmojiProvider } from '@atlaskit/emoji';
3
+ import type { MentionProvider } from '@atlaskit/mention/types';
3
4
  import { NodeDataProvider } from '@atlaskit/node-data-provider';
4
- import type { SyncBlockData, ResourceId, SyncBlockError, SyncBlockNode } from '../common/types';
5
+ import type { TaskDecisionProvider } from '@atlaskit/task-decision/types';
6
+ import type { SyncBlockData, ResourceId, SyncBlockError, SyncBlockNode, SyncBlockProduct } from '../common/types';
5
7
  /**
6
8
  * The instance of a sync block, containing its data and metadata.
7
9
  * Mainly used for representing the state of a sync block after fetching from a data provider.
@@ -21,6 +23,10 @@ export type SyncBlockSourceInfo = {
21
23
  title?: string;
22
24
  url?: string;
23
25
  };
26
+ export type SyncBlockParentInfo = {
27
+ contentId: string;
28
+ contentProduct: SyncBlockProduct;
29
+ };
24
30
  export type WriteSyncBlockResult = {
25
31
  error?: string;
26
32
  resourceId?: string;
@@ -40,15 +46,20 @@ export interface ADFWriteProvider {
40
46
  }
41
47
  export type MediaEmojiProviderOptions = {
42
48
  contentId: string;
43
- contentType: string;
44
- spaceKey?: string | null;
49
+ contentProduct: SyncBlockProduct;
50
+ };
51
+ export type SyncedBlockRendererDataProviders = {
52
+ mentionProvider?: Promise<MentionProvider>;
53
+ profilecardProvider?: Promise<ProfilecardProvider>;
54
+ taskDecisionProvider?: Promise<TaskDecisionProvider>;
55
+ };
56
+ export type SyncBlockRendererProviderCreator = {
57
+ createEmojiProvider: ((options: MediaEmojiProviderOptions) => Promise<EmojiProvider>) | undefined;
58
+ createMediaProvider: ((options: MediaEmojiProviderOptions) => Promise<MediaProvider>) | undefined;
45
59
  };
46
60
  export type SyncedBlockRendererProviderOptions = {
47
61
  parentDataProviders?: SyncedBlockRendererDataProviders;
48
- providerCreator?: {
49
- createEmojiProvider: ((options: MediaEmojiProviderOptions) => Promise<EmojiProvider>) | undefined;
50
- createMediaProvider: ((options: MediaEmojiProviderOptions) => Promise<MediaProvider>) | undefined;
51
- };
62
+ providerCreator?: SyncBlockRendererProviderCreator;
52
63
  };
53
64
  export declare abstract class SyncBlockDataProvider extends NodeDataProvider<SyncBlockNode, SyncBlockInstance> {
54
65
  abstract writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<WriteSyncBlockResult>>;
@@ -56,6 +67,7 @@ export declare abstract class SyncBlockDataProvider extends NodeDataProvider<Syn
56
67
  abstract getSourceId(): ResourceId;
57
68
  abstract retrieveSyncBlockSourceInfo(node: SyncBlockNode): Promise<SyncBlockSourceInfo | undefined>;
58
69
  abstract getSyncedBlockRendererProviderOptions(): SyncedBlockRendererProviderOptions;
70
+ abstract retrieveSyncBlockParentInfo(syncBlockInstance: SyncBlockInstance | undefined): SyncBlockParentInfo | undefined;
59
71
  /**
60
72
  * Generates a resource ID from a source ID and local ID.
61
73
  * @param sourceId - The source document ID (e.g., page ARI)
@@ -32,5 +32,6 @@ export declare class ReferenceSyncBlockStoreManager {
32
32
  */
33
33
  getSyncBlockURL(resourceId: ResourceId): string | undefined;
34
34
  getProviderFactory(resourceId: ResourceId): ProviderFactory | undefined;
35
+ private retrieveDynamicProviders;
35
36
  destroy(): void;
36
37
  }
@@ -1,4 +1,4 @@
1
- export type BlockProduct = 'confluence-page' | 'jira-work-item';
1
+ import type { SyncBlockProduct } from '../common/types';
2
2
  export type BlockContentResponse = {
3
3
  blockAri: string;
4
4
  blockInstanceId: string;
@@ -7,7 +7,7 @@ export type BlockContentResponse = {
7
7
  createdAt: number;
8
8
  createdBy: string;
9
9
  isSynced: boolean;
10
- product: BlockProduct;
10
+ product: SyncBlockProduct;
11
11
  sourceAri: string;
12
12
  status: 'active' | 'deleted';
13
13
  version: number;
@@ -26,7 +26,7 @@ export type CreateSyncedBlockRequest = {
26
26
  blockAri: string;
27
27
  blockInstanceId: string;
28
28
  content: string;
29
- product: string;
29
+ product: SyncBlockProduct;
30
30
  sourceAri: string;
31
31
  };
32
32
  export declare class BlockError extends Error {
@@ -2,6 +2,7 @@ import type { ADFEntity } from '@atlaskit/adf-utils/types';
2
2
  import type { JSONNode } from '@atlaskit/editor-json-transformer/types';
3
3
  export type BlockInstanceId = string;
4
4
  export type ResourceId = string;
5
+ export type SyncBlockProduct = 'confluence-page' | 'jira-work-item';
5
6
  export type SyncBlockAttrs = {
6
7
  localId: BlockInstanceId;
7
8
  resourceId: ResourceId;
@@ -22,8 +23,9 @@ export interface SyncBlockData {
22
23
  createdAt?: string;
23
24
  createdBy?: string;
24
25
  isSynced?: boolean;
26
+ product?: SyncBlockProduct;
25
27
  resourceId: ResourceId;
26
- sourceDocumentAri?: string;
28
+ sourceAri?: string;
27
29
  sourceTitle?: string;
28
30
  sourceURL?: string;
29
31
  updatedAt?: string;
@@ -4,11 +4,11 @@ export type { SyncBlockData, SyncBlockNode } from './common/types';
4
4
  export { useFetchSyncBlockData, type UseFetchSyncBlockDataResult, } from './hooks/useFetchSyncBlockData';
5
5
  export { useFetchSyncBlockTitle } from './hooks/useFetchSyncBlockTitle';
6
6
  export { useHandleContentChanges } from './hooks/useHandleContentChanges';
7
- export { blockResourceIdFromSourceAndLocalId, getLocalIdFromResourceId } from './providers/block-service/ari';
7
+ export { blockResourceIdFromSourceAndLocalId, getLocalIdFromResourceId, } from './providers/block-service/ari';
8
8
  export { useMemoizedBlockServiceAPIProviders } from './providers/block-service/blockServiceAPI';
9
9
  export { createContentAPIProvidersWithDefaultKey, useMemoizedContentAPIProviders, } from './providers/confluence/confluenceContentAPI';
10
10
  export { SyncBlockProvider as SyncedBlockProvider, useMemoizedSyncedBlockProvider, } from './providers/syncBlockProvider';
11
- export type { ADFFetchProvider, ADFWriteProvider, SyncBlockDataProvider, SyncBlockInstance, } from './providers/types';
11
+ export type { ADFFetchProvider, ADFWriteProvider, SyncBlockDataProvider, SyncBlockInstance, MediaEmojiProviderOptions, SyncedBlockRendererProviderOptions, SyncBlockRendererProviderCreator, } from './providers/types';
12
12
  export { ReferenceSyncBlockStoreManager } from './store-manager/referenceSyncBlockStoreManager';
13
13
  export { SyncBlockStoreManager } from './store-manager/syncBlockStoreManager';
14
14
  export { getConfluencePageAri, getLocalIdFromAri, getPageARIFromResourceId, getPageIdAndTypeFromAri, resourceIdFromSourceAndLocalId, } from './utils/ari';
@@ -1,6 +1,6 @@
1
1
  import type { JSONNode } from '@atlaskit/editor-json-transformer/types';
2
2
  import { type SyncBlockData, type SyncBlockNode } from '../common/types';
3
- import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type SyncBlockInstance, type SyncBlockSourceInfo, type SyncedBlockRendererProviderOptions, type WriteSyncBlockResult } from '../providers/types';
3
+ import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type SyncBlockInstance, type SyncBlockParentInfo, type SyncBlockSourceInfo, type SyncedBlockRendererProviderOptions, type WriteSyncBlockResult } from '../providers/types';
4
4
  export declare class SyncBlockProvider extends SyncBlockDataProvider {
5
5
  name: string;
6
6
  private fetchProvider;
@@ -79,5 +79,14 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
79
79
  * @returns The synced block renderer provider options
80
80
  */
81
81
  getSyncedBlockRendererProviderOptions(): SyncedBlockRendererProviderOptions;
82
+ /**
83
+ * Retrieve the parent info for the sync block
84
+ *
85
+ * @param resourceId
86
+ * @param syncBlockInstance
87
+ *
88
+ * @returns The parent info for the sync block
89
+ */
90
+ retrieveSyncBlockParentInfo(syncBlockInstance: SyncBlockInstance | undefined): SyncBlockParentInfo | undefined;
82
91
  }
83
92
  export declare const useMemoizedSyncedBlockProvider: (fetchProvider: ADFFetchProvider, writeProvider: ADFWriteProvider, sourceId: string, providerOptions: SyncedBlockRendererProviderOptions) => SyncBlockProvider;
@@ -1,7 +1,9 @@
1
- import type { SyncedBlockRendererDataProviders, MediaProvider } from '@atlaskit/editor-common/provider-factory';
1
+ import type { MediaProvider, ProfilecardProvider } from '@atlaskit/editor-common/provider-factory';
2
2
  import type { EmojiProvider } from '@atlaskit/emoji';
3
+ import type { MentionProvider } from '@atlaskit/mention/types';
3
4
  import { NodeDataProvider } from '@atlaskit/node-data-provider';
4
- import type { SyncBlockData, ResourceId, SyncBlockError, SyncBlockNode } from '../common/types';
5
+ import type { TaskDecisionProvider } from '@atlaskit/task-decision/types';
6
+ import type { SyncBlockData, ResourceId, SyncBlockError, SyncBlockNode, SyncBlockProduct } from '../common/types';
5
7
  /**
6
8
  * The instance of a sync block, containing its data and metadata.
7
9
  * Mainly used for representing the state of a sync block after fetching from a data provider.
@@ -21,6 +23,10 @@ export type SyncBlockSourceInfo = {
21
23
  title?: string;
22
24
  url?: string;
23
25
  };
26
+ export type SyncBlockParentInfo = {
27
+ contentId: string;
28
+ contentProduct: SyncBlockProduct;
29
+ };
24
30
  export type WriteSyncBlockResult = {
25
31
  error?: string;
26
32
  resourceId?: string;
@@ -40,15 +46,20 @@ export interface ADFWriteProvider {
40
46
  }
41
47
  export type MediaEmojiProviderOptions = {
42
48
  contentId: string;
43
- contentType: string;
44
- spaceKey?: string | null;
49
+ contentProduct: SyncBlockProduct;
50
+ };
51
+ export type SyncedBlockRendererDataProviders = {
52
+ mentionProvider?: Promise<MentionProvider>;
53
+ profilecardProvider?: Promise<ProfilecardProvider>;
54
+ taskDecisionProvider?: Promise<TaskDecisionProvider>;
55
+ };
56
+ export type SyncBlockRendererProviderCreator = {
57
+ createEmojiProvider: ((options: MediaEmojiProviderOptions) => Promise<EmojiProvider>) | undefined;
58
+ createMediaProvider: ((options: MediaEmojiProviderOptions) => Promise<MediaProvider>) | undefined;
45
59
  };
46
60
  export type SyncedBlockRendererProviderOptions = {
47
61
  parentDataProviders?: SyncedBlockRendererDataProviders;
48
- providerCreator?: {
49
- createEmojiProvider: ((options: MediaEmojiProviderOptions) => Promise<EmojiProvider>) | undefined;
50
- createMediaProvider: ((options: MediaEmojiProviderOptions) => Promise<MediaProvider>) | undefined;
51
- };
62
+ providerCreator?: SyncBlockRendererProviderCreator;
52
63
  };
53
64
  export declare abstract class SyncBlockDataProvider extends NodeDataProvider<SyncBlockNode, SyncBlockInstance> {
54
65
  abstract writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<WriteSyncBlockResult>>;
@@ -56,6 +67,7 @@ export declare abstract class SyncBlockDataProvider extends NodeDataProvider<Syn
56
67
  abstract getSourceId(): ResourceId;
57
68
  abstract retrieveSyncBlockSourceInfo(node: SyncBlockNode): Promise<SyncBlockSourceInfo | undefined>;
58
69
  abstract getSyncedBlockRendererProviderOptions(): SyncedBlockRendererProviderOptions;
70
+ abstract retrieveSyncBlockParentInfo(syncBlockInstance: SyncBlockInstance | undefined): SyncBlockParentInfo | undefined;
59
71
  /**
60
72
  * Generates a resource ID from a source ID and local ID.
61
73
  * @param sourceId - The source document ID (e.g., page ARI)
@@ -32,5 +32,6 @@ export declare class ReferenceSyncBlockStoreManager {
32
32
  */
33
33
  getSyncBlockURL(resourceId: ResourceId): string | undefined;
34
34
  getProviderFactory(resourceId: ResourceId): ProviderFactory | undefined;
35
+ private retrieveDynamicProviders;
35
36
  destroy(): void;
36
37
  }
@@ -1,4 +1,4 @@
1
- export type BlockProduct = 'confluence-page' | 'jira-work-item';
1
+ import type { SyncBlockProduct } from '../common/types';
2
2
  export type BlockContentResponse = {
3
3
  blockAri: string;
4
4
  blockInstanceId: string;
@@ -7,7 +7,7 @@ export type BlockContentResponse = {
7
7
  createdAt: number;
8
8
  createdBy: string;
9
9
  isSynced: boolean;
10
- product: BlockProduct;
10
+ product: SyncBlockProduct;
11
11
  sourceAri: string;
12
12
  status: 'active' | 'deleted';
13
13
  version: number;
@@ -26,7 +26,7 @@ export type CreateSyncedBlockRequest = {
26
26
  blockAri: string;
27
27
  blockInstanceId: string;
28
28
  content: string;
29
- product: string;
29
+ product: SyncBlockProduct;
30
30
  sourceAri: string;
31
31
  };
32
32
  export declare class BlockError extends Error {
package/package.json CHANGED
@@ -26,12 +26,12 @@
26
26
  "dependencies": {
27
27
  "@atlaskit/adf-schema": "^51.4.0",
28
28
  "@atlaskit/adf-utils": "^19.26.0",
29
- "@atlaskit/css": "^0.15.0",
29
+ "@atlaskit/css": "^0.16.0",
30
30
  "@atlaskit/editor-json-transformer": "^8.31.0",
31
31
  "@atlaskit/editor-prosemirror": "7.0.0",
32
32
  "@atlaskit/node-data-provider": "^7.5.0",
33
- "@atlaskit/primitives": "^16.1.0",
34
- "@atlaskit/tokens": "^8.0.0",
33
+ "@atlaskit/primitives": "^16.2.0",
34
+ "@atlaskit/tokens": "^8.1.0",
35
35
  "@babel/runtime": "^7.0.0",
36
36
  "@compiled/react": "^0.18.6",
37
37
  "uuid": "^3.1.0"
@@ -83,7 +83,7 @@
83
83
  }
84
84
  },
85
85
  "name": "@atlaskit/editor-synced-block-provider",
86
- "version": "2.10.1",
86
+ "version": "2.10.2",
87
87
  "description": "Synced Block Provider for @atlaskit/editor-plugin-synced-block",
88
88
  "author": "Atlassian Pty Ltd",
89
89
  "license": "Apache-2.0",