@atlaskit/editor-synced-block-provider 2.3.0 → 2.3.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 (27) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/providers/confluence/confluenceContentAPI.js +50 -0
  3. package/dist/cjs/providers/in-memory/inMemory.js +7 -0
  4. package/dist/cjs/providers/syncBlockProvider.js +52 -15
  5. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +35 -11
  6. package/dist/cjs/utils/contentProperty.js +54 -1
  7. package/dist/es2019/providers/confluence/confluenceContentAPI.js +31 -1
  8. package/dist/es2019/providers/in-memory/inMemory.js +7 -0
  9. package/dist/es2019/providers/syncBlockProvider.js +14 -0
  10. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +16 -4
  11. package/dist/es2019/utils/contentProperty.js +54 -0
  12. package/dist/esm/providers/confluence/confluenceContentAPI.js +51 -1
  13. package/dist/esm/providers/in-memory/inMemory.js +7 -0
  14. package/dist/esm/providers/syncBlockProvider.js +52 -15
  15. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +35 -11
  16. package/dist/esm/utils/contentProperty.js +53 -0
  17. package/dist/types/providers/confluence/confluenceContentAPI.d.ts +2 -1
  18. package/dist/types/providers/syncBlockProvider.d.ts +2 -1
  19. package/dist/types/providers/types.d.ts +7 -0
  20. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +1 -1
  21. package/dist/types/utils/contentProperty.d.ts +35 -0
  22. package/dist/types-ts4.5/providers/confluence/confluenceContentAPI.d.ts +2 -1
  23. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +2 -1
  24. package/dist/types-ts4.5/providers/types.d.ts +7 -0
  25. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +1 -1
  26. package/dist/types-ts4.5/utils/contentProperty.d.ts +35 -0
  27. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 2.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`eb9f8e2ab6fb5`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/eb9f8e2ab6fb5) -
8
+ [EDITOR-2543] Save bodiedSyncBlock deletion to BE instantly
9
+
3
10
  ## 2.3.0
4
11
 
5
12
  ### Minor Changes
@@ -280,6 +280,56 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
280
280
  }
281
281
  return writeData;
282
282
  }()
283
+ }, {
284
+ key: "deleteData",
285
+ value: function () {
286
+ var _deleteData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(resourceId) {
287
+ var _getPageIdAndTypeFrom3, pageId, pageType, localId, key, options, deletePayload, deleteResult;
288
+ return _regenerator.default.wrap(function _callee4$(_context4) {
289
+ while (1) switch (_context4.prev = _context4.next) {
290
+ case 0:
291
+ _getPageIdAndTypeFrom3 = (0, _ari.getPageIdAndTypeFromAri)(resourceId), pageId = _getPageIdAndTypeFrom3.id, pageType = _getPageIdAndTypeFrom3.type;
292
+ localId = (0, _ari.getLocalIdFromAri)(resourceId);
293
+ key = getContentPropertyKey(this.config.contentPropertyKey, localId);
294
+ options = {
295
+ pageId: pageId,
296
+ key: key,
297
+ cloudId: this.config.cloudId,
298
+ pageType: pageType
299
+ };
300
+ _context4.prev = 4;
301
+ _context4.next = 7;
302
+ return (0, _contentProperty4.deleteContentProperty)(options);
303
+ case 7:
304
+ deletePayload = _context4.sent;
305
+ deleteResult = (0, _utils.isBlogPageType)(pageType) ? deletePayload.data.confluence.deleteBlogPostProperty : deletePayload.data.confluence.deletePageProperty;
306
+ _context4.next = 14;
307
+ break;
308
+ case 11:
309
+ _context4.prev = 11;
310
+ _context4.t0 = _context4["catch"](4);
311
+ return _context4.abrupt("return", {
312
+ resourceId: resourceId,
313
+ success: false,
314
+ error: "Fail to delete ".concat(pageType, " content property")
315
+ });
316
+ case 14:
317
+ return _context4.abrupt("return", {
318
+ resourceId: resourceId,
319
+ success: deleteResult.success,
320
+ error: deleteResult.errors.join()
321
+ });
322
+ case 15:
323
+ case "end":
324
+ return _context4.stop();
325
+ }
326
+ }, _callee4, this, [[4, 11]]);
327
+ }));
328
+ function deleteData(_x7) {
329
+ return _deleteData.apply(this, arguments);
330
+ }
331
+ return deleteData;
332
+ }()
283
333
  }]);
284
334
  }();
285
335
  /**
@@ -27,5 +27,12 @@ var inMemoryWriteProvider = exports.inMemoryWriteProvider = {
27
27
  inMemStore.set(uuid, data);
28
28
  return Promise.resolve(uuid);
29
29
  }
30
+ },
31
+ deleteData: function deleteData(resourceId) {
32
+ var success = inMemStore.delete(resourceId);
33
+ return Promise.resolve({
34
+ resourceId: resourceId,
35
+ success: success
36
+ });
30
37
  }
31
38
  };
@@ -90,6 +90,43 @@ var SyncBlockProvider = exports.SyncBlockProvider = /*#__PURE__*/function (_Sync
90
90
  });
91
91
  return Promise.all(resourceIds);
92
92
  }
93
+ }, {
94
+ key: "deleteNodesData",
95
+ value: function () {
96
+ var _deleteNodesData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(resourceIds) {
97
+ var _this4 = this;
98
+ var results;
99
+ return _regenerator.default.wrap(function _callee$(_context) {
100
+ while (1) switch (_context.prev = _context.next) {
101
+ case 0:
102
+ _context.next = 2;
103
+ return Promise.allSettled(resourceIds.map(function (resourceId) {
104
+ return _this4.writeProvider.deleteData(resourceId);
105
+ }));
106
+ case 2:
107
+ results = _context.sent;
108
+ return _context.abrupt("return", results.map(function (result, index) {
109
+ if (result.status === 'fulfilled') {
110
+ return result.value;
111
+ } else {
112
+ return {
113
+ resourceId: resourceIds[index],
114
+ success: false,
115
+ error: result.reason
116
+ };
117
+ }
118
+ }));
119
+ case 4:
120
+ case "end":
121
+ return _context.stop();
122
+ }
123
+ }, _callee);
124
+ }));
125
+ function deleteNodesData(_x) {
126
+ return _deleteNodesData.apply(this, arguments);
127
+ }
128
+ return deleteNodesData;
129
+ }()
93
130
  }, {
94
131
  key: "getSourceId",
95
132
  value: function getSourceId() {
@@ -123,12 +160,12 @@ var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = fu
123
160
  }, [fetchProvider, writeProvider, sourceId]);
124
161
  };
125
162
  var fetchURLfromARI = /*#__PURE__*/function () {
126
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(ari, sourceLocalId) {
163
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(ari, sourceLocalId) {
127
164
  var response, _payload$data, payload, url;
128
- return _regenerator.default.wrap(function _callee$(_context) {
129
- while (1) switch (_context.prev = _context.next) {
165
+ return _regenerator.default.wrap(function _callee2$(_context2) {
166
+ while (1) switch (_context2.prev = _context2.next) {
130
167
  case 0:
131
- _context.next = 2;
168
+ _context2.next = 2;
132
169
  return fetch('/gateway/api/object-resolver/resolve/ari', {
133
170
  method: 'POST',
134
171
  headers: {
@@ -140,36 +177,36 @@ var fetchURLfromARI = /*#__PURE__*/function () {
140
177
  })
141
178
  });
142
179
  case 2:
143
- response = _context.sent;
180
+ response = _context2.sent;
144
181
  if (!response.ok) {
145
- _context.next = 12;
182
+ _context2.next = 12;
146
183
  break;
147
184
  }
148
- _context.next = 6;
185
+ _context2.next = 6;
149
186
  return response.json();
150
187
  case 6:
151
- payload = _context.sent;
188
+ payload = _context2.sent;
152
189
  url = payload === null || payload === void 0 || (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.url;
153
190
  if (!(typeof url === 'string')) {
154
- _context.next = 10;
191
+ _context2.next = 10;
155
192
  break;
156
193
  }
157
- return _context.abrupt("return", sourceLocalId ? url + "?block=".concat(sourceLocalId) : url);
194
+ return _context2.abrupt("return", sourceLocalId ? url + "?block=".concat(sourceLocalId) : url);
158
195
  case 10:
159
- _context.next = 13;
196
+ _context2.next = 13;
160
197
  break;
161
198
  case 12:
162
199
  //eslint-disable-next-line no-console
163
200
  console.error('Failed to fetch URL from ARI', response.statusText);
164
201
  case 13:
165
- return _context.abrupt("return", undefined);
202
+ return _context2.abrupt("return", undefined);
166
203
  case 14:
167
204
  case "end":
168
- return _context.stop();
205
+ return _context2.stop();
169
206
  }
170
- }, _callee);
207
+ }, _callee2);
171
208
  }));
172
- return function fetchURLfromARI(_x, _x2) {
209
+ return function fetchURLfromARI(_x2, _x3) {
173
210
  return _ref.apply(this, arguments);
174
211
  };
175
212
  }();
@@ -143,12 +143,12 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
143
143
  value: function () {
144
144
  var _deleteSyncBlocksWithConfirmation = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(tr, syncBlockIds) {
145
145
  var _this2 = this;
146
- var confirmed, _this$editorView;
146
+ var confirmed, _this$editorView, results;
147
147
  return _regenerator.default.wrap(function _callee2$(_context2) {
148
148
  while (1) switch (_context2.prev = _context2.next) {
149
149
  case 0:
150
150
  if (!this.confirmationCallback) {
151
- _context2.next = 7;
151
+ _context2.next = 19;
152
152
  break;
153
153
  }
154
154
  this.confirmationTransaction = tr;
@@ -156,20 +156,44 @@ var SourceSyncBlockStoreManager = exports.SourceSyncBlockStoreManager = /*#__PUR
156
156
  return this.confirmationCallback();
157
157
  case 4:
158
158
  confirmed = _context2.sent;
159
- if (confirmed) {
160
- (_this$editorView = this.editorView) === null || _this$editorView === void 0 || _this$editorView.dispatch(this.confirmationTransaction.setMeta('isConfirmedSyncBlockDeletion', true));
161
- // Need to update the BE on deletion
162
- syncBlockIds.forEach(function (_ref) {
163
- var localId = _ref.localId;
164
- return _this2.syncBlockCache.delete(localId);
165
- });
159
+ if (!confirmed) {
160
+ _context2.next = 18;
161
+ break;
162
+ }
163
+ (_this$editorView = this.editorView) === null || _this$editorView === void 0 || _this$editorView.dispatch(this.confirmationTransaction.setMeta('isConfirmedSyncBlockDeletion', true));
164
+ _context2.prev = 7;
165
+ if (this.dataProvider) {
166
+ _context2.next = 10;
167
+ break;
166
168
  }
169
+ throw new Error('Data provider not set');
170
+ case 10:
171
+ _context2.next = 12;
172
+ return this.dataProvider.deleteNodesData(syncBlockIds.map(function (attrs) {
173
+ return attrs.resourceId;
174
+ }));
175
+ case 12:
176
+ results = _context2.sent;
177
+ results.forEach(function (result) {
178
+ if (result.success) {
179
+ // Only delete when it's deleted successfully in backend
180
+ _this2.syncBlockCache.delete(result.resourceId);
181
+ } else {
182
+ // TODO: EDITOR-1921 - add error analytics with result.error
183
+ }
184
+ });
185
+ _context2.next = 18;
186
+ break;
187
+ case 16:
188
+ _context2.prev = 16;
189
+ _context2.t0 = _context2["catch"](7);
190
+ case 18:
167
191
  this.confirmationTransaction = undefined;
168
- case 7:
192
+ case 19:
169
193
  case "end":
170
194
  return _context2.stop();
171
195
  }
172
- }, _callee2, this);
196
+ }, _callee2, this, [[7, 16]]);
173
197
  }));
174
198
  function deleteSyncBlocksWithConfirmation(_x, _x2) {
175
199
  return _deleteSyncBlocksWithConfirmation.apply(this, arguments);
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.updateContentProperty = exports.getContentProperty = exports.createContentProperty = void 0;
7
+ exports.updateContentProperty = exports.getContentProperty = exports.deleteContentProperty = exports.createContentProperty = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
@@ -23,6 +23,7 @@ var GRAPHQL_ENDPOINT = '/gateway/api/graphql';
23
23
  var GET_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET';
24
24
  var CREATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_CREATE';
25
25
  var UPDATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_UPDATE';
26
+ var DELETE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_DELETE';
26
27
  /**
27
28
  * Query to get the page property by key
28
29
  * @param documentARI
@@ -74,6 +75,8 @@ var UPDATE_PAGE_QUERY = "mutation ".concat(UPDATE_OPERATION_NAME, " ($input: Con
74
75
  * @returns
75
76
  */
76
77
  var UPDATE_BLOG_QUERY = "mutation ".concat(UPDATE_OPERATION_NAME, " ($input: ConfluenceUpdateValueBlogPostPropertyInput!) {\n\tconfluence {\n\t\tupdateValueBlogPostProperty(input: $input) {\n\t\t\tblogPostProperty {\n\t\t\t\tkey,\n\t\t\t\tvalue\n\t\t\t}\n\t\t}\n\t}\n}");
78
+ var DELETE_PAGE_QUERY = "mutation ".concat(DELETE_OPERATION_NAME, " ($input: ConfluenceDeletePagePropertyInput!) {\n\t\t\t\t\t\tconfluence {\n\t\t\t\t\t\t\tdeletePageProperty(input: $input) {\n\t\t\t\t\t\t\t\tsuccess, errors {\n\t\t\t\t\t\t\t\t message\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}");
79
+ var DELETE_BLOG_QUERY = "mutation ".concat(DELETE_OPERATION_NAME, " ($input: ConfluenceDeleteBlogPostPropertyInput!) {\n\t\t\t\t\t\tconfluence {\n\t\t\t\t\t\t\tdeleteBlogPostProperty(input: $input) {\n\t\t\t\t\t\t\t\tsuccess, errors {\n\t\t\t\t\t\t\t\t message\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}");
77
80
  var getContentProperty = exports.getContentProperty = /*#__PURE__*/function () {
78
81
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
79
82
  var pageId, key, cloudId, pageType, documentARI, isBlog, bodyData, response;
@@ -231,4 +234,54 @@ var createContentProperty = exports.createContentProperty = /*#__PURE__*/functio
231
234
  return function createContentProperty(_x3) {
232
235
  return _ref6.apply(this, arguments);
233
236
  };
237
+ }();
238
+ var deleteContentProperty = exports.deleteContentProperty = /*#__PURE__*/function () {
239
+ var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(_ref7) {
240
+ var pageId, cloudId, pageType, key, documentARI, isBlog, bodyData, response;
241
+ return _regenerator.default.wrap(function _callee4$(_context4) {
242
+ while (1) switch (_context4.prev = _context4.next) {
243
+ case 0:
244
+ pageId = _ref7.pageId, cloudId = _ref7.cloudId, pageType = _ref7.pageType, key = _ref7.key;
245
+ documentARI = (0, _ari.getConfluencePageAri)(pageId, cloudId, pageType);
246
+ isBlog = (0, _utils.isBlogPageType)(pageType);
247
+ bodyData = {
248
+ query: isBlog ? DELETE_BLOG_QUERY : DELETE_PAGE_QUERY,
249
+ operationName: DELETE_OPERATION_NAME,
250
+ variables: {
251
+ input: _objectSpread(_objectSpread({}, isBlog ? {
252
+ blogPostId: documentARI
253
+ } : {
254
+ pageId: documentARI
255
+ }), {}, {
256
+ key: key
257
+ })
258
+ }
259
+ };
260
+ _context4.next = 6;
261
+ return fetch(GRAPHQL_ENDPOINT, {
262
+ method: 'POST',
263
+ headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
264
+ body: JSON.stringify(bodyData)
265
+ });
266
+ case 6:
267
+ response = _context4.sent;
268
+ if (response.ok) {
269
+ _context4.next = 9;
270
+ break;
271
+ }
272
+ throw new Error("Failed to delete content property: ".concat(response.statusText));
273
+ case 9:
274
+ _context4.next = 11;
275
+ return response.json();
276
+ case 11:
277
+ return _context4.abrupt("return", _context4.sent);
278
+ case 12:
279
+ case "end":
280
+ return _context4.stop();
281
+ }
282
+ }, _callee4);
283
+ }));
284
+ return function deleteContentProperty(_x4) {
285
+ return _ref8.apply(this, arguments);
286
+ };
234
287
  }();
@@ -2,7 +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 { getLocalIdFromAri, getPageIdAndTypeFromAri } from '../../utils/ari';
5
- import { getContentProperty, createContentProperty, updateContentProperty } from '../../utils/contentProperty';
5
+ import { getContentProperty, createContentProperty, updateContentProperty, deleteContentProperty } from '../../utils/contentProperty';
6
6
  import { isBlogPageType } from '../../utils/utils';
7
7
 
8
8
  /**
@@ -175,6 +175,36 @@ class ConfluenceADFWriteProvider {
175
175
  return this.createNewContentProperty(pageId, key, data, pageType);
176
176
  }
177
177
  }
178
+ async deleteData(resourceId) {
179
+ const {
180
+ id: pageId,
181
+ type: pageType
182
+ } = getPageIdAndTypeFromAri(resourceId);
183
+ const localId = getLocalIdFromAri(resourceId);
184
+ const key = getContentPropertyKey(this.config.contentPropertyKey, localId);
185
+ const options = {
186
+ pageId,
187
+ key,
188
+ cloudId: this.config.cloudId,
189
+ pageType
190
+ };
191
+ let deletePayload, deleteResult;
192
+ try {
193
+ deletePayload = await deleteContentProperty(options);
194
+ deleteResult = isBlogPageType(pageType) ? deletePayload.data.confluence.deleteBlogPostProperty : deletePayload.data.confluence.deletePageProperty;
195
+ } catch {
196
+ return {
197
+ resourceId,
198
+ success: false,
199
+ error: `Fail to delete ${pageType} content property`
200
+ };
201
+ }
202
+ return {
203
+ resourceId,
204
+ success: deleteResult.success,
205
+ error: deleteResult.errors.join()
206
+ };
207
+ }
178
208
  }
179
209
 
180
210
  /**
@@ -21,5 +21,12 @@ export const inMemoryWriteProvider = {
21
21
  inMemStore.set(uuid, data);
22
22
  return Promise.resolve(uuid);
23
23
  }
24
+ },
25
+ deleteData: resourceId => {
26
+ const success = inMemStore.delete(resourceId);
27
+ return Promise.resolve({
28
+ resourceId,
29
+ success
30
+ });
24
31
  }
25
32
  };
@@ -55,6 +55,20 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
55
55
  });
56
56
  return Promise.all(resourceIds);
57
57
  }
58
+ async deleteNodesData(resourceIds) {
59
+ const results = await Promise.allSettled(resourceIds.map(resourceId => this.writeProvider.deleteData(resourceId)));
60
+ return results.map((result, index) => {
61
+ if (result.status === 'fulfilled') {
62
+ return result.value;
63
+ } else {
64
+ return {
65
+ resourceId: resourceIds[index],
66
+ success: false,
67
+ error: result.reason
68
+ };
69
+ }
70
+ });
71
+ }
58
72
  getSourceId() {
59
73
  return this.sourceId;
60
74
  }
@@ -95,10 +95,22 @@ export class SourceSyncBlockStoreManager {
95
95
  if (confirmed) {
96
96
  var _this$editorView;
97
97
  (_this$editorView = this.editorView) === null || _this$editorView === void 0 ? void 0 : _this$editorView.dispatch(this.confirmationTransaction.setMeta('isConfirmedSyncBlockDeletion', true));
98
- // Need to update the BE on deletion
99
- syncBlockIds.forEach(({
100
- localId
101
- }) => this.syncBlockCache.delete(localId));
98
+ try {
99
+ if (!this.dataProvider) {
100
+ throw new Error('Data provider not set');
101
+ }
102
+ const results = await this.dataProvider.deleteNodesData(syncBlockIds.map(attrs => attrs.resourceId));
103
+ results.forEach(result => {
104
+ if (result.success) {
105
+ // Only delete when it's deleted successfully in backend
106
+ this.syncBlockCache.delete(result.resourceId);
107
+ } else {
108
+ // TODO: EDITOR-1921 - add error analytics with result.error
109
+ }
110
+ });
111
+ } catch (_error) {
112
+ // TODO: EDITOR-1921 - add error analytics
113
+ }
102
114
  }
103
115
  this.confirmationTransaction = undefined;
104
116
  }
@@ -11,6 +11,7 @@ const GRAPHQL_ENDPOINT = '/gateway/api/graphql';
11
11
  const GET_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET';
12
12
  const CREATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_CREATE';
13
13
  const UPDATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_UPDATE';
14
+ const DELETE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_DELETE';
14
15
  /**
15
16
  * Query to get the page property by key
16
17
  * @param documentARI
@@ -116,6 +117,24 @@ const UPDATE_BLOG_QUERY = `mutation ${UPDATE_OPERATION_NAME} ($input: Confluence
116
117
  }
117
118
  }
118
119
  }`;
120
+ const DELETE_PAGE_QUERY = `mutation ${DELETE_OPERATION_NAME} ($input: ConfluenceDeletePagePropertyInput!) {
121
+ confluence {
122
+ deletePageProperty(input: $input) {
123
+ success, errors {
124
+ message
125
+ }
126
+ }
127
+ }
128
+ }`;
129
+ const DELETE_BLOG_QUERY = `mutation ${DELETE_OPERATION_NAME} ($input: ConfluenceDeleteBlogPostPropertyInput!) {
130
+ confluence {
131
+ deleteBlogPostProperty(input: $input) {
132
+ success, errors {
133
+ message
134
+ }
135
+ }
136
+ }
137
+ }`;
119
138
  export const getContentProperty = async ({
120
139
  pageId,
121
140
  key,
@@ -234,4 +253,39 @@ export const createContentProperty = async ({
234
253
  throw new Error(`Failed to create content property: ${response.statusText}`);
235
254
  }
236
255
  return await response.json();
256
+ };
257
+ export const deleteContentProperty = async ({
258
+ pageId,
259
+ cloudId,
260
+ pageType,
261
+ key
262
+ }) => {
263
+ const documentARI = getConfluencePageAri(pageId, cloudId, pageType);
264
+ const isBlog = isBlogPageType(pageType);
265
+ const bodyData = {
266
+ query: isBlog ? DELETE_BLOG_QUERY : DELETE_PAGE_QUERY,
267
+ operationName: DELETE_OPERATION_NAME,
268
+ variables: {
269
+ input: {
270
+ ...(isBlog ? {
271
+ blogPostId: documentARI
272
+ } : {
273
+ pageId: documentARI
274
+ }),
275
+ key
276
+ }
277
+ }
278
+ };
279
+ const response = await fetch(GRAPHQL_ENDPOINT, {
280
+ method: 'POST',
281
+ headers: {
282
+ ...COMMON_HEADERS,
283
+ ...AGG_HEADERS
284
+ },
285
+ body: JSON.stringify(bodyData)
286
+ });
287
+ if (!response.ok) {
288
+ throw new Error(`Failed to delete content property: ${response.statusText}`);
289
+ }
290
+ return await response.json();
237
291
  };
@@ -7,7 +7,7 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
7
  import { useMemo } from 'react';
8
8
  import { SyncBlockError } from '../../common/types';
9
9
  import { getLocalIdFromAri, getPageIdAndTypeFromAri } from '../../utils/ari';
10
- import { getContentProperty, createContentProperty, updateContentProperty } from '../../utils/contentProperty';
10
+ import { getContentProperty, createContentProperty, updateContentProperty, deleteContentProperty } from '../../utils/contentProperty';
11
11
  import { isBlogPageType } from '../../utils/utils';
12
12
 
13
13
  /**
@@ -274,6 +274,56 @@ var ConfluenceADFWriteProvider = /*#__PURE__*/function () {
274
274
  }
275
275
  return writeData;
276
276
  }()
277
+ }, {
278
+ key: "deleteData",
279
+ value: function () {
280
+ var _deleteData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(resourceId) {
281
+ var _getPageIdAndTypeFrom3, pageId, pageType, localId, key, options, deletePayload, deleteResult;
282
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
283
+ while (1) switch (_context4.prev = _context4.next) {
284
+ case 0:
285
+ _getPageIdAndTypeFrom3 = getPageIdAndTypeFromAri(resourceId), pageId = _getPageIdAndTypeFrom3.id, pageType = _getPageIdAndTypeFrom3.type;
286
+ localId = getLocalIdFromAri(resourceId);
287
+ key = getContentPropertyKey(this.config.contentPropertyKey, localId);
288
+ options = {
289
+ pageId: pageId,
290
+ key: key,
291
+ cloudId: this.config.cloudId,
292
+ pageType: pageType
293
+ };
294
+ _context4.prev = 4;
295
+ _context4.next = 7;
296
+ return deleteContentProperty(options);
297
+ case 7:
298
+ deletePayload = _context4.sent;
299
+ deleteResult = isBlogPageType(pageType) ? deletePayload.data.confluence.deleteBlogPostProperty : deletePayload.data.confluence.deletePageProperty;
300
+ _context4.next = 14;
301
+ break;
302
+ case 11:
303
+ _context4.prev = 11;
304
+ _context4.t0 = _context4["catch"](4);
305
+ return _context4.abrupt("return", {
306
+ resourceId: resourceId,
307
+ success: false,
308
+ error: "Fail to delete ".concat(pageType, " content property")
309
+ });
310
+ case 14:
311
+ return _context4.abrupt("return", {
312
+ resourceId: resourceId,
313
+ success: deleteResult.success,
314
+ error: deleteResult.errors.join()
315
+ });
316
+ case 15:
317
+ case "end":
318
+ return _context4.stop();
319
+ }
320
+ }, _callee4, this, [[4, 11]]);
321
+ }));
322
+ function deleteData(_x7) {
323
+ return _deleteData.apply(this, arguments);
324
+ }
325
+ return deleteData;
326
+ }()
277
327
  }]);
278
328
  }();
279
329
  /**
@@ -21,5 +21,12 @@ export var inMemoryWriteProvider = {
21
21
  inMemStore.set(uuid, data);
22
22
  return Promise.resolve(uuid);
23
23
  }
24
+ },
25
+ deleteData: function deleteData(resourceId) {
26
+ var success = inMemStore.delete(resourceId);
27
+ return Promise.resolve({
28
+ resourceId: resourceId,
29
+ success: success
30
+ });
24
31
  }
25
32
  };
@@ -83,6 +83,43 @@ export var SyncBlockProvider = /*#__PURE__*/function (_SyncBlockDataProvide) {
83
83
  });
84
84
  return Promise.all(resourceIds);
85
85
  }
86
+ }, {
87
+ key: "deleteNodesData",
88
+ value: function () {
89
+ var _deleteNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(resourceIds) {
90
+ var _this4 = this;
91
+ var results;
92
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
93
+ while (1) switch (_context.prev = _context.next) {
94
+ case 0:
95
+ _context.next = 2;
96
+ return Promise.allSettled(resourceIds.map(function (resourceId) {
97
+ return _this4.writeProvider.deleteData(resourceId);
98
+ }));
99
+ case 2:
100
+ results = _context.sent;
101
+ return _context.abrupt("return", results.map(function (result, index) {
102
+ if (result.status === 'fulfilled') {
103
+ return result.value;
104
+ } else {
105
+ return {
106
+ resourceId: resourceIds[index],
107
+ success: false,
108
+ error: result.reason
109
+ };
110
+ }
111
+ }));
112
+ case 4:
113
+ case "end":
114
+ return _context.stop();
115
+ }
116
+ }, _callee);
117
+ }));
118
+ function deleteNodesData(_x) {
119
+ return _deleteNodesData.apply(this, arguments);
120
+ }
121
+ return deleteNodesData;
122
+ }()
86
123
  }, {
87
124
  key: "getSourceId",
88
125
  value: function getSourceId() {
@@ -116,12 +153,12 @@ export var useMemoizedSyncedBlockProvider = function useMemoizedSyncedBlockProvi
116
153
  }, [fetchProvider, writeProvider, sourceId]);
117
154
  };
118
155
  var fetchURLfromARI = /*#__PURE__*/function () {
119
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(ari, sourceLocalId) {
156
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(ari, sourceLocalId) {
120
157
  var response, _payload$data, payload, url;
121
- return _regeneratorRuntime.wrap(function _callee$(_context) {
122
- while (1) switch (_context.prev = _context.next) {
158
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
159
+ while (1) switch (_context2.prev = _context2.next) {
123
160
  case 0:
124
- _context.next = 2;
161
+ _context2.next = 2;
125
162
  return fetch('/gateway/api/object-resolver/resolve/ari', {
126
163
  method: 'POST',
127
164
  headers: {
@@ -133,36 +170,36 @@ var fetchURLfromARI = /*#__PURE__*/function () {
133
170
  })
134
171
  });
135
172
  case 2:
136
- response = _context.sent;
173
+ response = _context2.sent;
137
174
  if (!response.ok) {
138
- _context.next = 12;
175
+ _context2.next = 12;
139
176
  break;
140
177
  }
141
- _context.next = 6;
178
+ _context2.next = 6;
142
179
  return response.json();
143
180
  case 6:
144
- payload = _context.sent;
181
+ payload = _context2.sent;
145
182
  url = payload === null || payload === void 0 || (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.url;
146
183
  if (!(typeof url === 'string')) {
147
- _context.next = 10;
184
+ _context2.next = 10;
148
185
  break;
149
186
  }
150
- return _context.abrupt("return", sourceLocalId ? url + "?block=".concat(sourceLocalId) : url);
187
+ return _context2.abrupt("return", sourceLocalId ? url + "?block=".concat(sourceLocalId) : url);
151
188
  case 10:
152
- _context.next = 13;
189
+ _context2.next = 13;
153
190
  break;
154
191
  case 12:
155
192
  //eslint-disable-next-line no-console
156
193
  console.error('Failed to fetch URL from ARI', response.statusText);
157
194
  case 13:
158
- return _context.abrupt("return", undefined);
195
+ return _context2.abrupt("return", undefined);
159
196
  case 14:
160
197
  case "end":
161
- return _context.stop();
198
+ return _context2.stop();
162
199
  }
163
- }, _callee);
200
+ }, _callee2);
164
201
  }));
165
- return function fetchURLfromARI(_x, _x2) {
202
+ return function fetchURLfromARI(_x2, _x3) {
166
203
  return _ref.apply(this, arguments);
167
204
  };
168
205
  }();
@@ -136,12 +136,12 @@ export var SourceSyncBlockStoreManager = /*#__PURE__*/function () {
136
136
  value: function () {
137
137
  var _deleteSyncBlocksWithConfirmation = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(tr, syncBlockIds) {
138
138
  var _this2 = this;
139
- var confirmed, _this$editorView;
139
+ var confirmed, _this$editorView, results;
140
140
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
141
141
  while (1) switch (_context2.prev = _context2.next) {
142
142
  case 0:
143
143
  if (!this.confirmationCallback) {
144
- _context2.next = 7;
144
+ _context2.next = 19;
145
145
  break;
146
146
  }
147
147
  this.confirmationTransaction = tr;
@@ -149,20 +149,44 @@ export var SourceSyncBlockStoreManager = /*#__PURE__*/function () {
149
149
  return this.confirmationCallback();
150
150
  case 4:
151
151
  confirmed = _context2.sent;
152
- if (confirmed) {
153
- (_this$editorView = this.editorView) === null || _this$editorView === void 0 || _this$editorView.dispatch(this.confirmationTransaction.setMeta('isConfirmedSyncBlockDeletion', true));
154
- // Need to update the BE on deletion
155
- syncBlockIds.forEach(function (_ref) {
156
- var localId = _ref.localId;
157
- return _this2.syncBlockCache.delete(localId);
158
- });
152
+ if (!confirmed) {
153
+ _context2.next = 18;
154
+ break;
155
+ }
156
+ (_this$editorView = this.editorView) === null || _this$editorView === void 0 || _this$editorView.dispatch(this.confirmationTransaction.setMeta('isConfirmedSyncBlockDeletion', true));
157
+ _context2.prev = 7;
158
+ if (this.dataProvider) {
159
+ _context2.next = 10;
160
+ break;
159
161
  }
162
+ throw new Error('Data provider not set');
163
+ case 10:
164
+ _context2.next = 12;
165
+ return this.dataProvider.deleteNodesData(syncBlockIds.map(function (attrs) {
166
+ return attrs.resourceId;
167
+ }));
168
+ case 12:
169
+ results = _context2.sent;
170
+ results.forEach(function (result) {
171
+ if (result.success) {
172
+ // Only delete when it's deleted successfully in backend
173
+ _this2.syncBlockCache.delete(result.resourceId);
174
+ } else {
175
+ // TODO: EDITOR-1921 - add error analytics with result.error
176
+ }
177
+ });
178
+ _context2.next = 18;
179
+ break;
180
+ case 16:
181
+ _context2.prev = 16;
182
+ _context2.t0 = _context2["catch"](7);
183
+ case 18:
160
184
  this.confirmationTransaction = undefined;
161
- case 7:
185
+ case 19:
162
186
  case "end":
163
187
  return _context2.stop();
164
188
  }
165
- }, _callee2, this);
189
+ }, _callee2, this, [[7, 16]]);
166
190
  }));
167
191
  function deleteSyncBlocksWithConfirmation(_x, _x2) {
168
192
  return _deleteSyncBlocksWithConfirmation.apply(this, arguments);
@@ -16,6 +16,7 @@ var GRAPHQL_ENDPOINT = '/gateway/api/graphql';
16
16
  var GET_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET';
17
17
  var CREATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_CREATE';
18
18
  var UPDATE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_UPDATE';
19
+ var DELETE_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_DELETE';
19
20
  /**
20
21
  * Query to get the page property by key
21
22
  * @param documentARI
@@ -67,6 +68,8 @@ var UPDATE_PAGE_QUERY = "mutation ".concat(UPDATE_OPERATION_NAME, " ($input: Con
67
68
  * @returns
68
69
  */
69
70
  var UPDATE_BLOG_QUERY = "mutation ".concat(UPDATE_OPERATION_NAME, " ($input: ConfluenceUpdateValueBlogPostPropertyInput!) {\n\tconfluence {\n\t\tupdateValueBlogPostProperty(input: $input) {\n\t\t\tblogPostProperty {\n\t\t\t\tkey,\n\t\t\t\tvalue\n\t\t\t}\n\t\t}\n\t}\n}");
71
+ var DELETE_PAGE_QUERY = "mutation ".concat(DELETE_OPERATION_NAME, " ($input: ConfluenceDeletePagePropertyInput!) {\n\t\t\t\t\t\tconfluence {\n\t\t\t\t\t\t\tdeletePageProperty(input: $input) {\n\t\t\t\t\t\t\t\tsuccess, errors {\n\t\t\t\t\t\t\t\t message\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}");
72
+ var DELETE_BLOG_QUERY = "mutation ".concat(DELETE_OPERATION_NAME, " ($input: ConfluenceDeleteBlogPostPropertyInput!) {\n\t\t\t\t\t\tconfluence {\n\t\t\t\t\t\t\tdeleteBlogPostProperty(input: $input) {\n\t\t\t\t\t\t\t\tsuccess, errors {\n\t\t\t\t\t\t\t\t message\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}");
70
73
  export var getContentProperty = /*#__PURE__*/function () {
71
74
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
72
75
  var pageId, key, cloudId, pageType, documentARI, isBlog, bodyData, response;
@@ -224,4 +227,54 @@ export var createContentProperty = /*#__PURE__*/function () {
224
227
  return function createContentProperty(_x3) {
225
228
  return _ref6.apply(this, arguments);
226
229
  };
230
+ }();
231
+ export var deleteContentProperty = /*#__PURE__*/function () {
232
+ var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref7) {
233
+ var pageId, cloudId, pageType, key, documentARI, isBlog, bodyData, response;
234
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
235
+ while (1) switch (_context4.prev = _context4.next) {
236
+ case 0:
237
+ pageId = _ref7.pageId, cloudId = _ref7.cloudId, pageType = _ref7.pageType, key = _ref7.key;
238
+ documentARI = getConfluencePageAri(pageId, cloudId, pageType);
239
+ isBlog = isBlogPageType(pageType);
240
+ bodyData = {
241
+ query: isBlog ? DELETE_BLOG_QUERY : DELETE_PAGE_QUERY,
242
+ operationName: DELETE_OPERATION_NAME,
243
+ variables: {
244
+ input: _objectSpread(_objectSpread({}, isBlog ? {
245
+ blogPostId: documentARI
246
+ } : {
247
+ pageId: documentARI
248
+ }), {}, {
249
+ key: key
250
+ })
251
+ }
252
+ };
253
+ _context4.next = 6;
254
+ return fetch(GRAPHQL_ENDPOINT, {
255
+ method: 'POST',
256
+ headers: _objectSpread(_objectSpread({}, COMMON_HEADERS), AGG_HEADERS),
257
+ body: JSON.stringify(bodyData)
258
+ });
259
+ case 6:
260
+ response = _context4.sent;
261
+ if (response.ok) {
262
+ _context4.next = 9;
263
+ break;
264
+ }
265
+ throw new Error("Failed to delete content property: ".concat(response.statusText));
266
+ case 9:
267
+ _context4.next = 11;
268
+ return response.json();
269
+ case 11:
270
+ return _context4.abrupt("return", _context4.sent);
271
+ case 12:
272
+ case "end":
273
+ return _context4.stop();
274
+ }
275
+ }, _callee4);
276
+ }));
277
+ return function deleteContentProperty(_x4) {
278
+ return _ref8.apply(this, arguments);
279
+ };
227
280
  }();
@@ -1,5 +1,5 @@
1
1
  import { type SyncBlockData } from '../../common/types';
2
- import type { ADFFetchProvider, ADFWriteProvider, FetchSyncBlockDataResult } from '../types';
2
+ import type { ADFFetchProvider, ADFWriteProvider, DeleteSyncBlockResult, FetchSyncBlockDataResult } from '../types';
3
3
  /**
4
4
  * Configuration for Content API providers
5
5
  */
@@ -23,6 +23,7 @@ declare class ConfluenceADFWriteProvider implements ADFWriteProvider {
23
23
  constructor(config: ContentAPIConfig);
24
24
  private createNewContentProperty;
25
25
  writeData(data: SyncBlockData): Promise<string>;
26
+ deleteData(resourceId: string): Promise<DeleteSyncBlockResult>;
26
27
  }
27
28
  /**
28
29
  * Convenience function to create providers with default content property key
@@ -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 FetchSyncBlockDataResult } from '../providers/types';
3
+ import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type FetchSyncBlockDataResult } from '../providers/types';
4
4
  export declare class SyncBlockProvider extends SyncBlockDataProvider {
5
5
  name: string;
6
6
  private fetchProvider;
@@ -18,6 +18,7 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
18
18
  * @returns the resource ids of the nodes that were written
19
19
  */
20
20
  writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<string | undefined>>;
21
+ deleteNodesData(resourceIds: string[]): Promise<Array<DeleteSyncBlockResult>>;
21
22
  getSourceId(): string;
22
23
  retrieveSyncBlockSourceUrl(node: SyncBlockNode): Promise<string | undefined>;
23
24
  }
@@ -5,14 +5,21 @@ export type FetchSyncBlockDataResult = {
5
5
  error?: SyncBlockError;
6
6
  resourceId?: string;
7
7
  };
8
+ export type DeleteSyncBlockResult = {
9
+ error?: string;
10
+ resourceId: string;
11
+ success: boolean;
12
+ };
8
13
  export interface ADFFetchProvider {
9
14
  fetchData: (resourceId: ResourceId) => Promise<FetchSyncBlockDataResult>;
10
15
  }
11
16
  export interface ADFWriteProvider {
17
+ deleteData: (resourceId: string) => Promise<DeleteSyncBlockResult>;
12
18
  writeData: (data: SyncBlockData) => Promise<string>;
13
19
  }
14
20
  export declare abstract class SyncBlockDataProvider extends NodeDataProvider<SyncBlockNode, FetchSyncBlockDataResult> {
15
21
  abstract writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<ResourceId | undefined>>;
22
+ abstract deleteNodesData(resourceIds: string[]): Promise<Array<DeleteSyncBlockResult>>;
16
23
  abstract getSourceId(): ResourceId;
17
24
  abstract retrieveSyncBlockSourceUrl(node: SyncBlockNode): Promise<string | undefined>;
18
25
  }
@@ -1,4 +1,4 @@
1
- import { type Node as PMNode } from '@atlaskit/editor-prosemirror/model';
1
+ import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
2
2
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
3
3
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
4
4
  import type { SyncBlockAttrs, SyncBlockNode } from '../common/types';
@@ -22,6 +22,12 @@ type UpdateContentPropertyOptions = {
22
22
  signal?: AbortSignal;
23
23
  value: SyncBlockData;
24
24
  };
25
+ type DeleteContentPropertyOptions = {
26
+ cloudId: string;
27
+ key: string;
28
+ pageId: string;
29
+ pageType: PAGE_TYPE;
30
+ };
25
31
  export type GetContentPropertyResult = {
26
32
  data: {
27
33
  confluence: {
@@ -98,7 +104,36 @@ export type CreateBlogPostContentPropertyResult = {
98
104
  };
99
105
  };
100
106
  };
107
+ export type DeletePageContentPropertyResult = {
108
+ data: {
109
+ confluence: {
110
+ deletePageProperty: {
111
+ errors: [
112
+ {
113
+ message: string;
114
+ }
115
+ ];
116
+ success: boolean;
117
+ };
118
+ };
119
+ };
120
+ };
121
+ export type DeleteBlogPostPropertyResult = {
122
+ data: {
123
+ confluence: {
124
+ deleteBlogPostProperty: {
125
+ errors: [
126
+ {
127
+ message: string;
128
+ }
129
+ ];
130
+ success: boolean;
131
+ };
132
+ };
133
+ };
134
+ };
101
135
  export declare const getContentProperty: <T extends GetContentPropertyResult | GetBlogPostContentPropertyResult>({ pageId, key, cloudId, pageType, }: GetContentPropertyOptions) => Promise<T>;
102
136
  export declare const updateContentProperty: <T extends UpdateContentPropertyResult | UpdateBlogPostContentPropertyResult>({ pageId, key, value, cloudId, pageType, }: UpdateContentPropertyOptions) => Promise<T>;
103
137
  export declare const createContentProperty: <T extends CreateContentPropertyResult | CreateBlogPostContentPropertyResult>({ pageId, key, value, cloudId, pageType, }: CreateContentPropertyOptions) => Promise<T>;
138
+ export declare const deleteContentProperty: <T extends DeletePageContentPropertyResult | DeleteBlogPostPropertyResult>({ pageId, cloudId, pageType, key, }: DeleteContentPropertyOptions) => Promise<T>;
104
139
  export {};
@@ -1,5 +1,5 @@
1
1
  import { type SyncBlockData } from '../../common/types';
2
- import type { ADFFetchProvider, ADFWriteProvider, FetchSyncBlockDataResult } from '../types';
2
+ import type { ADFFetchProvider, ADFWriteProvider, DeleteSyncBlockResult, FetchSyncBlockDataResult } from '../types';
3
3
  /**
4
4
  * Configuration for Content API providers
5
5
  */
@@ -23,6 +23,7 @@ declare class ConfluenceADFWriteProvider implements ADFWriteProvider {
23
23
  constructor(config: ContentAPIConfig);
24
24
  private createNewContentProperty;
25
25
  writeData(data: SyncBlockData): Promise<string>;
26
+ deleteData(resourceId: string): Promise<DeleteSyncBlockResult>;
26
27
  }
27
28
  /**
28
29
  * Convenience function to create providers with default content property key
@@ -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 FetchSyncBlockDataResult } from '../providers/types';
3
+ import { SyncBlockDataProvider, type ADFFetchProvider, type ADFWriteProvider, type DeleteSyncBlockResult, type FetchSyncBlockDataResult } from '../providers/types';
4
4
  export declare class SyncBlockProvider extends SyncBlockDataProvider {
5
5
  name: string;
6
6
  private fetchProvider;
@@ -18,6 +18,7 @@ export declare class SyncBlockProvider extends SyncBlockDataProvider {
18
18
  * @returns the resource ids of the nodes that were written
19
19
  */
20
20
  writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<string | undefined>>;
21
+ deleteNodesData(resourceIds: string[]): Promise<Array<DeleteSyncBlockResult>>;
21
22
  getSourceId(): string;
22
23
  retrieveSyncBlockSourceUrl(node: SyncBlockNode): Promise<string | undefined>;
23
24
  }
@@ -5,14 +5,21 @@ export type FetchSyncBlockDataResult = {
5
5
  error?: SyncBlockError;
6
6
  resourceId?: string;
7
7
  };
8
+ export type DeleteSyncBlockResult = {
9
+ error?: string;
10
+ resourceId: string;
11
+ success: boolean;
12
+ };
8
13
  export interface ADFFetchProvider {
9
14
  fetchData: (resourceId: ResourceId) => Promise<FetchSyncBlockDataResult>;
10
15
  }
11
16
  export interface ADFWriteProvider {
17
+ deleteData: (resourceId: string) => Promise<DeleteSyncBlockResult>;
12
18
  writeData: (data: SyncBlockData) => Promise<string>;
13
19
  }
14
20
  export declare abstract class SyncBlockDataProvider extends NodeDataProvider<SyncBlockNode, FetchSyncBlockDataResult> {
15
21
  abstract writeNodesData(nodes: SyncBlockNode[], data: SyncBlockData[]): Promise<Array<ResourceId | undefined>>;
22
+ abstract deleteNodesData(resourceIds: string[]): Promise<Array<DeleteSyncBlockResult>>;
16
23
  abstract getSourceId(): ResourceId;
17
24
  abstract retrieveSyncBlockSourceUrl(node: SyncBlockNode): Promise<string | undefined>;
18
25
  }
@@ -1,4 +1,4 @@
1
- import { type Node as PMNode } from '@atlaskit/editor-prosemirror/model';
1
+ import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
2
2
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
3
3
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
4
4
  import type { SyncBlockAttrs, SyncBlockNode } from '../common/types';
@@ -22,6 +22,12 @@ type UpdateContentPropertyOptions = {
22
22
  signal?: AbortSignal;
23
23
  value: SyncBlockData;
24
24
  };
25
+ type DeleteContentPropertyOptions = {
26
+ cloudId: string;
27
+ key: string;
28
+ pageId: string;
29
+ pageType: PAGE_TYPE;
30
+ };
25
31
  export type GetContentPropertyResult = {
26
32
  data: {
27
33
  confluence: {
@@ -98,7 +104,36 @@ export type CreateBlogPostContentPropertyResult = {
98
104
  };
99
105
  };
100
106
  };
107
+ export type DeletePageContentPropertyResult = {
108
+ data: {
109
+ confluence: {
110
+ deletePageProperty: {
111
+ errors: [
112
+ {
113
+ message: string;
114
+ }
115
+ ];
116
+ success: boolean;
117
+ };
118
+ };
119
+ };
120
+ };
121
+ export type DeleteBlogPostPropertyResult = {
122
+ data: {
123
+ confluence: {
124
+ deleteBlogPostProperty: {
125
+ errors: [
126
+ {
127
+ message: string;
128
+ }
129
+ ];
130
+ success: boolean;
131
+ };
132
+ };
133
+ };
134
+ };
101
135
  export declare const getContentProperty: <T extends GetContentPropertyResult | GetBlogPostContentPropertyResult>({ pageId, key, cloudId, pageType, }: GetContentPropertyOptions) => Promise<T>;
102
136
  export declare const updateContentProperty: <T extends UpdateContentPropertyResult | UpdateBlogPostContentPropertyResult>({ pageId, key, value, cloudId, pageType, }: UpdateContentPropertyOptions) => Promise<T>;
103
137
  export declare const createContentProperty: <T extends CreateContentPropertyResult | CreateBlogPostContentPropertyResult>({ pageId, key, value, cloudId, pageType, }: CreateContentPropertyOptions) => Promise<T>;
138
+ export declare const deleteContentProperty: <T extends DeletePageContentPropertyResult | DeleteBlogPostPropertyResult>({ pageId, cloudId, pageType, key, }: DeleteContentPropertyOptions) => Promise<T>;
104
139
  export {};
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  }
83
83
  },
84
84
  "name": "@atlaskit/editor-synced-block-provider",
85
- "version": "2.3.0",
85
+ "version": "2.3.1",
86
86
  "description": "Synced Block Provider for @atlaskit/editor-plugin-synced-block",
87
87
  "author": "Atlassian Pty Ltd",
88
88
  "license": "Apache-2.0",