@atlaskit/editor-synced-block-provider 3.1.0 → 3.2.1

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 (55) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/clients/block-service/ari.js +13 -16
  3. package/dist/cjs/clients/block-service/blockService.js +37 -14
  4. package/dist/cjs/clients/confluence/ari.js +7 -40
  5. package/dist/cjs/clients/confluence/sourceInfo.js +3 -1
  6. package/dist/cjs/clients/jira/ari.js +5 -2
  7. package/dist/cjs/index.js +2 -27
  8. package/dist/cjs/providers/block-service/blockServiceAPI.js +71 -28
  9. package/dist/cjs/providers/syncBlockProvider.js +57 -38
  10. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +5 -8
  11. package/dist/es2019/clients/block-service/ari.js +15 -16
  12. package/dist/es2019/clients/block-service/blockService.js +39 -7
  13. package/dist/es2019/clients/confluence/ari.js +11 -37
  14. package/dist/es2019/clients/confluence/sourceInfo.js +3 -1
  15. package/dist/es2019/clients/jira/ari.js +9 -2
  16. package/dist/es2019/index.js +2 -3
  17. package/dist/es2019/providers/block-service/blockServiceAPI.js +75 -28
  18. package/dist/es2019/providers/syncBlockProvider.js +45 -25
  19. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +5 -8
  20. package/dist/esm/clients/block-service/ari.js +13 -16
  21. package/dist/esm/clients/block-service/blockService.js +37 -14
  22. package/dist/esm/clients/confluence/ari.js +6 -39
  23. package/dist/esm/clients/confluence/sourceInfo.js +3 -1
  24. package/dist/esm/clients/jira/ari.js +5 -2
  25. package/dist/esm/index.js +2 -3
  26. package/dist/esm/providers/block-service/blockServiceAPI.js +70 -27
  27. package/dist/esm/providers/syncBlockProvider.js +57 -38
  28. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +4 -8
  29. package/dist/types/clients/block-service/ari.d.ts +14 -4
  30. package/dist/types/clients/block-service/blockService.d.ts +1 -2
  31. package/dist/types/clients/confluence/ari.d.ts +8 -21
  32. package/dist/types/clients/jira/ari.d.ts +7 -2
  33. package/dist/types/index.d.ts +5 -6
  34. package/dist/types/providers/block-service/blockServiceAPI.d.ts +31 -6
  35. package/dist/types/providers/syncBlockProvider.d.ts +14 -13
  36. package/dist/types/providers/types.d.ts +9 -6
  37. package/dist/types-ts4.5/clients/block-service/ari.d.ts +14 -4
  38. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +1 -2
  39. package/dist/types-ts4.5/clients/confluence/ari.d.ts +8 -21
  40. package/dist/types-ts4.5/clients/jira/ari.d.ts +7 -2
  41. package/dist/types-ts4.5/index.d.ts +5 -6
  42. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +31 -6
  43. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +14 -13
  44. package/dist/types-ts4.5/providers/types.d.ts +9 -6
  45. package/package.json +1 -1
  46. package/dist/cjs/clients/confluence/contentProperty.js +0 -284
  47. package/dist/cjs/providers/confluence/confluenceContentAPI.js +0 -446
  48. package/dist/es2019/clients/confluence/contentProperty.js +0 -288
  49. package/dist/es2019/providers/confluence/confluenceContentAPI.js +0 -310
  50. package/dist/esm/clients/confluence/contentProperty.js +0 -277
  51. package/dist/esm/providers/confluence/confluenceContentAPI.js +0 -440
  52. package/dist/types/clients/confluence/contentProperty.d.ts +0 -139
  53. package/dist/types/providers/confluence/confluenceContentAPI.d.ts +0 -44
  54. package/dist/types-ts4.5/clients/confluence/contentProperty.d.ts +0 -139
  55. package/dist/types-ts4.5/providers/confluence/confluenceContentAPI.d.ts +0 -44
@@ -18,28 +18,24 @@ var _react = require("react");
18
18
  var _ari = require("../clients/confluence/ari");
19
19
  var _sourceInfo = require("../clients/confluence/sourceInfo");
20
20
  var _types = require("../common/types");
21
- var _types2 = require("../providers/types");
21
+ var _types2 = require("./types");
22
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)); }
23
23
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
24
24
  var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
25
- // the source document ARI; that the source sync block is on.
26
-
27
25
  /**
28
26
  * Constructor for the SyncBlockProvider
29
27
  *
30
28
  * @param fetchProvider
31
29
  * @param writeProvider
32
- * @param sourceId
33
30
  * @param nestedRendererDataProviders
34
31
  */
35
- function SyncBlockProvider(fetchProvider, writeProvider, sourceId) {
32
+ function SyncBlockProvider(fetchProvider, writeProvider) {
36
33
  var _this;
37
34
  (0, _classCallCheck2.default)(this, SyncBlockProvider);
38
35
  _this = _callSuper(this, SyncBlockProvider);
39
36
  (0, _defineProperty2.default)(_this, "name", 'syncBlockProvider');
40
37
  _this.fetchProvider = fetchProvider;
41
38
  _this.writeProvider = writeProvider;
42
- _this.sourceId = sourceId;
43
39
  _this.providerOptions = {};
44
40
  return _this;
45
41
  }
@@ -49,11 +45,6 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
49
45
  value: function setProviderOptions(providerOptions) {
50
46
  this.providerOptions = providerOptions;
51
47
  }
52
- }, {
53
- key: "getProduct",
54
- value: function getProduct() {
55
- return this.writeProvider.product;
56
- }
57
48
 
58
49
  /**
59
50
  * Check if the node is supported by the provider
@@ -132,14 +123,24 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
132
123
  return _regenerator.default.wrap(function _callee$(_context) {
133
124
  while (1) switch (_context.prev = _context.next) {
134
125
  case 0:
135
- _context.next = 2;
126
+ if (this.writeProvider) {
127
+ _context.next = 2;
128
+ break;
129
+ }
130
+ return _context.abrupt("return", Promise.reject(new Error('Write provider not set')));
131
+ case 2:
132
+ _context.next = 4;
136
133
  return Promise.allSettled(nodes.map(function (_node, index) {
134
+ var _this3$writeProvider;
135
+ if (!_this3.writeProvider) {
136
+ return Promise.reject('Write provider not set');
137
+ }
137
138
  if (!data[index].content) {
138
139
  return Promise.reject('No Synced Block content to write');
139
140
  }
140
- return _this3.writeProvider.writeData(data[index]);
141
+ return (_this3$writeProvider = _this3.writeProvider) === null || _this3$writeProvider === void 0 ? void 0 : _this3$writeProvider.writeData(data[index]);
141
142
  }));
142
- case 2:
143
+ case 4:
143
144
  results = _context.sent;
144
145
  return _context.abrupt("return", results.map(function (result) {
145
146
  if (result.status === 'fulfilled') {
@@ -150,11 +151,11 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
150
151
  };
151
152
  }
152
153
  }));
153
- case 4:
154
+ case 6:
154
155
  case "end":
155
156
  return _context.stop();
156
157
  }
157
- }, _callee);
158
+ }, _callee, this);
158
159
  }));
159
160
  function writeNodesData(_x, _x2) {
160
161
  return _writeNodesData.apply(this, arguments);
@@ -164,6 +165,9 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
164
165
  }, {
165
166
  key: "createNodeData",
166
167
  value: function createNodeData(data) {
168
+ if (!this.writeProvider) {
169
+ return Promise.reject(new Error('Write provider not set'));
170
+ }
167
171
  return this.writeProvider.createData(data).then(function (result) {
168
172
  return result;
169
173
  }, function (error) {
@@ -189,11 +193,20 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
189
193
  return _regenerator.default.wrap(function _callee2$(_context2) {
190
194
  while (1) switch (_context2.prev = _context2.next) {
191
195
  case 0:
192
- _context2.next = 2;
196
+ if (this.writeProvider) {
197
+ _context2.next = 2;
198
+ break;
199
+ }
200
+ return _context2.abrupt("return", Promise.reject(new Error('Write provider not set')));
201
+ case 2:
202
+ _context2.next = 4;
193
203
  return Promise.allSettled(resourceIds.map(function (resourceId) {
204
+ if (!_this4.writeProvider) {
205
+ return Promise.reject('Write provider not set');
206
+ }
194
207
  return _this4.writeProvider.deleteData(resourceId);
195
208
  }));
196
- case 2:
209
+ case 4:
197
210
  results = _context2.sent;
198
211
  return _context2.abrupt("return", results.map(function (result, index) {
199
212
  if (result.status === 'fulfilled') {
@@ -206,29 +219,17 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
206
219
  };
207
220
  }
208
221
  }));
209
- case 4:
222
+ case 6:
210
223
  case "end":
211
224
  return _context2.stop();
212
225
  }
213
- }, _callee2);
226
+ }, _callee2, this);
214
227
  }));
215
228
  function deleteNodesData(_x3) {
216
229
  return _deleteNodesData.apply(this, arguments);
217
230
  }
218
231
  return deleteNodesData;
219
232
  }()
220
- /**
221
- * Get the source id
222
- *
223
- * @returns The source id
224
- */
225
- )
226
- }, {
227
- key: "getSourceId",
228
- value: function getSourceId() {
229
- return this.sourceId;
230
- }
231
-
232
233
  /**
233
234
  * Fetch the source info from the source id
234
235
  *
@@ -238,6 +239,7 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
238
239
  *
239
240
  * @returns The source info
240
241
  */
242
+ )
241
243
  }, {
242
244
  key: "fetchSyncBlockSourceInfo",
243
245
  value: function fetchSyncBlockSourceInfo(localId, sourceAri, sourceProduct, fireAnalyticsEvent) {
@@ -255,12 +257,20 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
255
257
  }
256
258
  }, {
257
259
  key: "generateResourceId",
258
- value: function generateResourceId(sourceId, localId) {
259
- return this.writeProvider.generateResourceId(sourceId, localId);
260
+ value: function generateResourceId() {
261
+ var localId = crypto.randomUUID();
262
+ var resourceId = crypto.randomUUID();
263
+ return {
264
+ localId: localId,
265
+ resourceId: resourceId
266
+ };
260
267
  }
261
268
  }, {
262
269
  key: "generateResourceIdForReference",
263
270
  value: function generateResourceIdForReference(sourceId) {
271
+ if (!this.writeProvider) {
272
+ throw new Error('Write provider not set');
273
+ }
264
274
  return this.writeProvider.generateResourceIdForReference(sourceId);
265
275
  }
266
276
 
@@ -292,7 +302,9 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
292
302
  switch (sourceProduct) {
293
303
  case 'confluence-page':
294
304
  return {
295
- contentId: (0, _ari.getPageIdAndTypeFromConfluencePageAri)(sourceAri).id,
305
+ contentId: (0, _ari.getPageIdAndTypeFromConfluencePageAri)({
306
+ ari: sourceAri
307
+ }).id,
296
308
  contentProduct: sourceProduct
297
309
  };
298
310
  case 'jira-work-item':
@@ -304,14 +316,21 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
304
316
  }, {
305
317
  key: "updateReferenceData",
306
318
  value: function updateReferenceData(blocks, noContent) {
319
+ if (!this.writeProvider) {
320
+ throw new Error('Write provider not set');
321
+ }
307
322
  return this.writeProvider.updateReferenceData(blocks, noContent);
308
323
  }
309
324
  }]);
310
325
  }(_types2.SyncBlockDataProvider);
311
- var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvider(fetchProvider, writeProvider, sourceId, providerOptions, getSSRData) {
326
+ var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvider(_ref) {
327
+ var fetchProvider = _ref.fetchProvider,
328
+ writeProvider = _ref.writeProvider,
329
+ providerOptions = _ref.providerOptions,
330
+ getSSRData = _ref.getSSRData;
312
331
  var syncBlockProvider = (0, _react.useMemo)(function () {
313
- return new SyncBlockProvider(fetchProvider, writeProvider, sourceId);
314
- }, [fetchProvider, writeProvider, sourceId]);
332
+ return new SyncBlockProvider(fetchProvider, writeProvider);
333
+ }, [fetchProvider, writeProvider]);
315
334
  syncBlockProvider.setProviderOptions(providerOptions);
316
335
  var ssrData = getSSRData ? getSSRData() : undefined;
317
336
  if (ssrData) {
@@ -10,13 +10,12 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
- var _uuid = _interopRequireDefault(require("uuid"));
14
13
  var _monitoring = require("@atlaskit/editor-common/monitoring");
15
14
  var _types = require("../common/types");
16
15
  var _errorHandling = require("../utils/errorHandling");
17
16
  var _utils = require("../utils/utils");
18
17
  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; }
19
- 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-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
18
+ 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
19
  // A store manager responsible for the lifecycle and state management of source sync blocks in an editor instance.
21
20
  // Designed to manage local in-memory state and synchronize with an external data provider.
22
21
  // Supports create, flush, and delete operations for source sync blocks.
@@ -237,14 +236,12 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
237
236
  }, {
238
237
  key: "generateBodiedSyncBlockAttrs",
239
238
  value: function generateBodiedSyncBlockAttrs() {
240
- var _this$dataProvider;
241
- // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
242
- var localId = (0, _uuid.default)();
243
- var sourceId = (_this$dataProvider = this.dataProvider) === null || _this$dataProvider === void 0 ? void 0 : _this$dataProvider.getSourceId();
244
- if (!this.dataProvider || !sourceId) {
239
+ if (!this.dataProvider) {
245
240
  throw new Error('Data provider not set or source id not set');
246
241
  }
247
- var resourceId = this.dataProvider.generateResourceId(sourceId, localId);
242
+ var _this$dataProvider$ge = this.dataProvider.generateResourceId(),
243
+ resourceId = _this$dataProvider$ge.resourceId,
244
+ localId = _this$dataProvider$ge.localId;
248
245
  return {
249
246
  resourceId: resourceId,
250
247
  localId: localId
@@ -2,32 +2,31 @@
2
2
 
3
3
  /**
4
4
  * Generates the block ARI from the source page ARI and the source block's resource ID.
5
- * @param sourceAri - the ARI of the document. E.G ari:cloud:confluence:cloudId:page/pageId
5
+ * @param cloudId - the cloudId of the block. E.G the cloudId of the confluence page, or the cloudId of the Jira instance
6
+ * @param parentId - the parentId of the block. E.G the pageId for a confluence page, or the issueId for a Jira work item
6
7
  * @param resourceId - the resource ID of the block node. A randomly generated UUID
8
+ * @param product - the product of the block. E.G 'confluence-page', 'jira-work-item'
7
9
  * @returns the block ARI. E.G ari:cloud:blocks:<cloudId>:synced-block/<product>/<pageId>/<resourceId>
8
10
  */
9
- export const generateBlockAri = (sourceAri, resourceId, product) => {
10
- const match = sourceAri.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/(\d+)/);
11
- if (!(match !== null && match !== void 0 && match[1])) {
12
- throw new Error(`Invalid source ARI: ${sourceAri}`);
13
- }
14
- const cloudId = match[1];
15
- const pageId = match[3];
16
- return `ari:cloud:blocks:${cloudId}:synced-block/${product}/${pageId}/${resourceId}`;
11
+ export const generateBlockAri = ({
12
+ cloudId,
13
+ parentId,
14
+ product,
15
+ resourceId
16
+ }) => {
17
+ return `ari:cloud:blocks:${cloudId}:synced-block/${product}/${parentId}/${resourceId}`;
17
18
  };
18
19
 
19
20
  /**
20
21
  * Generates the block ARI from the reference synced block ARI and the resource ID
21
- * @param sourceAri - the ARI of the document. E.G ari:cloud:confluence:cloudId:page/pageId
22
+ * @param cloudId - the cloudId of the block. E.G the cloudId of the confluence page, or the cloudId of the Jira instance
22
23
  * @param resourceId - the resource ID of the reference synced block. E.G confluence-page/pageId/sourceResourceId
23
24
  * @returns the block ARI. E.G ari:cloud:blocks:<cloudId>:synced-block/<product>/<pageId>/<resourceId>
24
25
  */
25
- export const generateBlockAriFromReference = (sourceAri, resourceId) => {
26
- const match = sourceAri.match(/ari:cloud:confluence:([^:]+):(page|blogpost)\/(\d+)/);
27
- if (!(match !== null && match !== void 0 && match[1])) {
28
- throw new Error(`Invalid source ARI: ${sourceAri}`);
29
- }
30
- const cloudId = match[1];
26
+ export const generateBlockAriFromReference = ({
27
+ cloudId,
28
+ resourceId
29
+ }) => {
31
30
  return `ari:cloud:blocks:${cloudId}:synced-block/${resourceId}`;
32
31
  };
33
32
 
@@ -3,11 +3,10 @@ export const isBlockContentResponse = response => {
3
3
  const content = response.content;
4
4
  return typeof content === 'string';
5
5
  };
6
-
7
6
  /**
8
7
  * Retrieves all synced blocks referenced in a document.
9
8
  *
10
- * Calls the Block Service API endpoint: `/v1/block/document/reference/{documentAri}`
9
+ * Calls the Block Service GraphQL API: `blockService_getDocumentReferenceBlocks`
11
10
  *
12
11
  * @param documentAri - The ARI of the document to fetch synced blocks for
13
12
  * @returns A promise containing arrays of successfully fetched blocks and any errors encountered
@@ -44,23 +43,56 @@ export const isBlockContentResponse = response => {
44
43
  * ]
45
44
  * }
46
45
  * ```
47
- * Check https://block-service.dev.atl-paas.net/ for latest API documentation.
48
46
  */
49
47
  export const getReferenceSyncedBlocks = async documentAri => {
50
- const response = await fetchWithRetry(`${BLOCK_SERVICE_API_URL}/block/document/reference/${encodeURIComponent(documentAri)}`, {
51
- method: 'GET',
52
- headers: COMMON_HEADERS
48
+ const bodyData = {
49
+ query: buildGetDocumentReferenceBlocksQuery(documentAri),
50
+ operationName: GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME
51
+ };
52
+ const response = await fetchWithRetry(GRAPHQL_ENDPOINT, {
53
+ method: 'POST',
54
+ headers: COMMON_HEADERS,
55
+ body: JSON.stringify(bodyData)
53
56
  });
54
57
  if (!response.ok) {
55
58
  throw new BlockError(response.status);
56
59
  }
57
- return await response.json();
60
+ const result = await response.json();
61
+ if (result.errors && result.errors.length > 0) {
62
+ throw new Error(result.errors.map(e => e.message).join(', '));
63
+ }
64
+ if (!result.data) {
65
+ throw new Error('No data returned from GraphQL query');
66
+ }
67
+ return result.data.blockService_getDocumentReferenceBlocks;
58
68
  };
59
69
  const COMMON_HEADERS = {
60
70
  'Content-Type': 'application/json',
61
71
  Accept: 'application/json'
62
72
  };
63
73
  const BLOCK_SERVICE_API_URL = '/gateway/api/blocks/v1';
74
+ const GRAPHQL_ENDPOINT = '/gateway/api/graphql';
75
+ const GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_DOCUMENT_REFERENCE_BLOCKS';
76
+ const buildGetDocumentReferenceBlocksQuery = documentAri => `query ${GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME} {
77
+ blockService_getDocumentReferenceBlocks(documentAri: "${documentAri}") {
78
+ blocks {
79
+ blockAri
80
+ blockInstanceId
81
+ content
82
+ createdAt
83
+ createdBy
84
+ product
85
+ sourceAri
86
+ status
87
+ version
88
+ }
89
+ errors {
90
+ blockAri
91
+ code
92
+ reason
93
+ }
94
+ }
95
+ }`;
64
96
  export class BlockError extends Error {
65
97
  constructor(status) {
66
98
  super(`Block error`);
@@ -11,14 +11,22 @@
11
11
  * @param pageType - the type of the page
12
12
  * @returns the Confluence page ARI
13
13
  */
14
- export const getConfluencePageAri = (pageId, cloudId, pageType = 'page') => `ari:cloud:confluence:${cloudId}:${pageType}/${pageId}`;
14
+ export const getConfluencePageAri = ({
15
+ pageId,
16
+ cloudId,
17
+ pageType
18
+ }) => {
19
+ return `ari:cloud:confluence:${cloudId}:${pageType}/${pageId}`;
20
+ };
15
21
 
16
22
  /**
17
23
  * Extracts the page ID and type from the Confluence page ARI
18
24
  * @param ari - the Confluence page ARI
19
25
  * @returns the page ID and type
20
26
  */
21
- export const getPageIdAndTypeFromConfluencePageAri = ari => {
27
+ export const getPageIdAndTypeFromConfluencePageAri = ({
28
+ ari
29
+ }) => {
22
30
  const match = ari.match(/ari:cloud:confluence:[^:]+:(page|blogpost)\/(\d+)/);
23
31
  if (match !== null && match !== void 0 && match[2]) {
24
32
  return {
@@ -27,38 +35,4 @@ export const getPageIdAndTypeFromConfluencePageAri = ari => {
27
35
  };
28
36
  }
29
37
  throw new Error(`Invalid page ARI: ${ari}`);
30
- };
31
-
32
- /**
33
- * Extracts the local ID from the Confluence page content property resource ID
34
- * @param resourceId - the Confluence page content property resource ID
35
- * @returns the local ID
36
- */
37
- export const getLocalIdFromContentPropertyResourceId = resourceId => {
38
- const match = resourceId.match(/ari:cloud:confluence:[^:]+:(page|blogpost)\/\d+\/([a-zA-Z0-9-]+)/);
39
- if (match !== null && match !== void 0 && match[2]) {
40
- return match[2];
41
- }
42
- throw new Error(`Invalid resourceId: ${resourceId}`);
43
- };
44
-
45
- /**
46
- * Extracts the Confluence page ARI from the Confluence content property resource ID
47
- * @param resourceId - the Confluence content property resource ID
48
- * @returns the Confluence page ARI
49
- */
50
- export const getPageAriFromContentPropertyResourceId = resourceId => {
51
- const match = resourceId.match(/(ari:cloud:confluence:[^:]+:(page|blogpost)\/\d+)\/([a-zA-Z0-9-]+)$/);
52
- if (match !== null && match !== void 0 && match[1]) {
53
- return match[1];
54
- }
55
- throw new Error(`Invalid resourceId: ${resourceId}`);
56
- };
57
-
58
- /**
59
- * Generates the Confluence page content property resource ID from the source ID and local ID
60
- * @param sourceId - the source ID
61
- * @param localId - the local ID
62
- * @returns the Confluence page content property resource ID
63
- */
64
- export const resourceIdFromConfluencePageSourceIdAndLocalId = (sourceId, localId) => `${sourceId}/${localId}`;
38
+ };
@@ -60,7 +60,9 @@ export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEve
60
60
  var _response$data, _response$data$conten, _response$data$conten2, _contentData$space;
61
61
  const {
62
62
  type: pageType
63
- } = getPageIdAndTypeFromConfluencePageAri(pageAri);
63
+ } = getPageIdAndTypeFromConfluencePageAri({
64
+ ari: pageAri
65
+ });
64
66
  const response = await getConfluenceSourceInfo(pageAri);
65
67
  const contentData = (_response$data = response.data) === null || _response$data === void 0 ? void 0 : (_response$data$conten = _response$data.content) === null || _response$data$conten === void 0 ? void 0 : (_response$data$conten2 = _response$data$conten.nodes) === null || _response$data$conten2 === void 0 ? void 0 : _response$data$conten2[0];
66
68
  const title = contentData === null || contentData === void 0 ? void 0 : contentData.title;
@@ -6,14 +6,21 @@
6
6
  * @param cloudId - the cloud ID
7
7
  * @returns the Jira work item ARI
8
8
  */
9
- export const getJiraWorkItemAri = (workItemId, cloudId) => `ari:cloud:jira:${cloudId}:issue/${workItemId}`;
9
+ export const getJiraWorkItemAri = ({
10
+ cloudId,
11
+ workItemId
12
+ }) => {
13
+ return `ari:cloud:jira:${cloudId}:issue/${workItemId}`;
14
+ };
10
15
 
11
16
  /**
12
17
  * Extracts the Jira work item ID from the Jira work item ARI
13
18
  * @param ari - the Jira work item ARI
14
19
  * @returns the Jira work item ID
15
20
  */
16
- export const getJiraWorkItemIdFromAri = ari => {
21
+ export const getJiraWorkItemIdFromAri = ({
22
+ ari
23
+ }) => {
17
24
  const match = ari.match(/ari:cloud:jira:([^:]+):issue\/(\d+)/);
18
25
  if (match !== null && match !== void 0 && match[2]) {
19
26
  return match[2];
@@ -10,12 +10,11 @@ export { useHandleContentChanges } from './hooks/useHandleContentChanges';
10
10
 
11
11
  // clients
12
12
  export { generateBlockAri, generateBlockAriFromReference, getLocalIdFromBlockResourceId } from './clients/block-service/ari';
13
- export { getConfluencePageAri, getLocalIdFromContentPropertyResourceId, getPageAriFromContentPropertyResourceId, getPageIdAndTypeFromConfluencePageAri, resourceIdFromConfluencePageSourceIdAndLocalId } from './clients/confluence/ari';
13
+ export { getConfluencePageAri, getPageIdAndTypeFromConfluencePageAri } from './clients/confluence/ari';
14
14
  export { getJiraWorkItemAri, getJiraWorkItemIdFromAri } from './clients/jira/ari';
15
15
 
16
16
  // providers
17
- export { useMemoizedBlockServiceAPIProviders } from './providers/block-service/blockServiceAPI';
18
- export { createContentAPIProvidersWithDefaultKey, useMemoizedContentAPIProviders } from './providers/confluence/confluenceContentAPI';
17
+ export { useMemoizedBlockServiceAPIProviders, useMemoizedBlockServiceFetchOnlyAPIProvider } from './providers/block-service/blockServiceAPI';
19
18
  export { fetchConfluencePageInfo } from './clients/confluence/sourceInfo';
20
19
  export { SyncBlockProvider as SyncedBlockProvider, useMemoizedSyncedBlockProvider } from './providers/syncBlockProvider';
21
20
 
@@ -77,19 +77,23 @@ export const fetchReferences = async documentAri => {
77
77
  }));
78
78
  return [...blocksInstances, ...errorInstances];
79
79
  };
80
-
81
80
  /**
82
81
  * ADFFetchProvider implementation that fetches synced block data from Block Service API
83
82
  */
84
83
  class BlockServiceADFFetchProvider {
85
- constructor(sourceAri) {
86
- this.sourceAri = sourceAri;
84
+ constructor({
85
+ cloudId
86
+ }) {
87
+ this.cloudId = cloudId;
87
88
  }
88
89
 
89
90
  // resourceId of the reference synced block.
90
91
  // the ARI must be constructed to call the block service API
91
92
  async fetchData(resourceId) {
92
- const blockAri = generateBlockAriFromReference(this.sourceAri, resourceId);
93
+ const blockAri = generateBlockAriFromReference({
94
+ cloudId: this.cloudId,
95
+ resourceId
96
+ });
93
97
  try {
94
98
  const blockContentResponse = await getSyncedBlockContent({
95
99
  blockAri
@@ -129,15 +133,21 @@ class BlockServiceADFFetchProvider {
129
133
  }
130
134
  }
131
135
  }
132
-
133
136
  /**
134
137
  * ADFWriteProvider implementation that writes synced block data to Block Service API
135
138
  */
136
139
  class BlockServiceADFWriteProvider {
137
- constructor(sourceAri, product, sourceDocumentId, getVersion) {
138
- this.sourceAri = sourceAri;
140
+ constructor({
141
+ cloudId,
142
+ parentAri,
143
+ parentId,
144
+ product,
145
+ getVersion
146
+ }) {
147
+ this.cloudId = cloudId;
148
+ this.parentAri = parentAri;
149
+ this.parentId = parentId;
139
150
  this.product = product;
140
- this.sourceDocumentId = sourceDocumentId;
141
151
  this.getVersion = getVersion;
142
152
  }
143
153
 
@@ -146,7 +156,12 @@ class BlockServiceADFWriteProvider {
146
156
  const {
147
157
  resourceId
148
158
  } = data;
149
- const blockAri = generateBlockAri(this.sourceAri, resourceId, this.product);
159
+ const blockAri = generateBlockAri({
160
+ cloudId: this.cloudId,
161
+ parentId: this.parentId,
162
+ product: this.product,
163
+ resourceId
164
+ });
150
165
  const stepVersion = this.getVersion ? this.getVersion() : undefined;
151
166
  try {
152
167
  // Try update existing block's content
@@ -175,13 +190,18 @@ class BlockServiceADFWriteProvider {
175
190
  const {
176
191
  resourceId
177
192
  } = data;
178
- const blockAri = generateBlockAri(this.sourceAri, resourceId, this.product);
193
+ const blockAri = generateBlockAri({
194
+ cloudId: this.cloudId,
195
+ parentId: this.parentId,
196
+ product: this.product,
197
+ resourceId
198
+ });
179
199
  const stepVersion = this.getVersion ? this.getVersion() : undefined;
180
200
  try {
181
201
  await createSyncedBlock({
182
202
  blockAri,
183
203
  blockInstanceId: data.blockInstanceId,
184
- sourceAri: this.sourceAri,
204
+ sourceAri: this.parentAri,
185
205
  product: this.product,
186
206
  content: JSON.stringify(data.content),
187
207
  stepVersion
@@ -205,7 +225,12 @@ class BlockServiceADFWriteProvider {
205
225
 
206
226
  // soft deletes the source synced block
207
227
  async deleteData(resourceId) {
208
- const blockAri = generateBlockAri(this.sourceAri, resourceId, this.product);
228
+ const blockAri = generateBlockAri({
229
+ cloudId: this.cloudId,
230
+ parentId: this.parentId,
231
+ product: this.product,
232
+ resourceId
233
+ });
209
234
  try {
210
235
  await deleteSyncedBlock({
211
236
  blockAri
@@ -241,7 +266,7 @@ class BlockServiceADFWriteProvider {
241
266
 
242
267
  // the sourceId is the resourceId of the source synced block.
243
268
  generateResourceIdForReference(sourceId) {
244
- return `${this.product}/${this.sourceDocumentId}/${sourceId}`;
269
+ return `${this.product}/${this.parentId}/${sourceId}`;
245
270
  }
246
271
  generateResourceId() {
247
272
  return crypto.randomUUID();
@@ -249,9 +274,12 @@ class BlockServiceADFWriteProvider {
249
274
  async updateReferenceData(blocks, noContent) {
250
275
  try {
251
276
  await updateReferenceSyncedBlockOnDocument({
252
- documentAri: this.sourceAri,
277
+ documentAri: this.parentAri,
253
278
  blocks: blocks.map(block => ({
254
- blockAri: generateBlockAriFromReference(this.sourceAri, block.resourceId),
279
+ blockAri: generateBlockAriFromReference({
280
+ cloudId: this.cloudId,
281
+ resourceId: block.resourceId
282
+ }),
255
283
  blockInstanceId: block.localId
256
284
  })),
257
285
  noContent
@@ -273,18 +301,37 @@ class BlockServiceADFWriteProvider {
273
301
  }
274
302
  }
275
303
  }
276
-
277
- /**
278
- * Factory function to create both providers with shared configuration
279
- */
280
- const createBlockServiceAPIProviders = (sourceAri, product, sourceDocumentId, getVersion) => {
281
- const fetchProvider = new BlockServiceADFFetchProvider(sourceAri);
282
- const writeProvider = new BlockServiceADFWriteProvider(sourceAri, product, sourceDocumentId, getVersion);
283
- return {
284
- fetchProvider,
285
- writeProvider
286
- };
304
+ export const useMemoizedBlockServiceAPIProviders = ({
305
+ cloudId,
306
+ parentAri,
307
+ parentId,
308
+ product,
309
+ getVersion
310
+ }) => {
311
+ return useMemo(() => {
312
+ return {
313
+ fetchProvider: new BlockServiceADFFetchProvider({
314
+ cloudId
315
+ }),
316
+ writeProvider: new BlockServiceADFWriteProvider({
317
+ cloudId,
318
+ parentAri,
319
+ parentId,
320
+ product,
321
+ getVersion
322
+ })
323
+ };
324
+ }, [cloudId, parentAri, parentId, product, getVersion]);
287
325
  };
288
- export const useMemoizedBlockServiceAPIProviders = (sourceAri, product, sourceDocumentId, getVersion) => {
289
- return useMemo(() => createBlockServiceAPIProviders(sourceAri, product, sourceDocumentId, getVersion), [sourceAri, product, sourceDocumentId, getVersion]);
326
+ export const useMemoizedBlockServiceFetchOnlyAPIProvider = ({
327
+ cloudId
328
+ }) => {
329
+ return useMemo(() => {
330
+ return {
331
+ fetchProvider: new BlockServiceADFFetchProvider({
332
+ cloudId
333
+ }),
334
+ writeProvider: undefined
335
+ };
336
+ }, [cloudId]);
290
337
  };