@atlaskit/editor-synced-block-provider 2.10.5 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/clients/block-service/blockService.js +5 -4
  3. package/dist/cjs/clients/confluence/sourceInfo.js +20 -17
  4. package/dist/cjs/hooks/useFetchSyncBlockData.js +20 -11
  5. package/dist/cjs/hooks/useHandleContentChanges.js +1 -5
  6. package/dist/cjs/index.js +2 -2
  7. package/dist/cjs/providers/block-service/blockServiceAPI.js +17 -26
  8. package/dist/cjs/providers/confluence/confluenceContentAPI.js +0 -15
  9. package/dist/cjs/providers/syncBlockProvider.js +31 -41
  10. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +138 -63
  11. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +93 -43
  12. package/dist/cjs/store-manager/syncBlockStoreManager.js +3 -3
  13. package/dist/cjs/utils/errorHandling.js +31 -1
  14. package/dist/es2019/clients/block-service/blockService.js +5 -4
  15. package/dist/es2019/clients/confluence/sourceInfo.js +13 -8
  16. package/dist/es2019/hooks/useFetchSyncBlockData.js +15 -7
  17. package/dist/es2019/hooks/useHandleContentChanges.js +1 -5
  18. package/dist/es2019/index.js +1 -1
  19. package/dist/es2019/providers/block-service/blockServiceAPI.js +13 -20
  20. package/dist/es2019/providers/confluence/confluenceContentAPI.js +1 -14
  21. package/dist/es2019/providers/syncBlockProvider.js +31 -45
  22. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +124 -49
  23. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +65 -24
  24. package/dist/es2019/store-manager/syncBlockStoreManager.js +3 -3
  25. package/dist/es2019/utils/errorHandling.js +17 -1
  26. package/dist/esm/clients/block-service/blockService.js +5 -4
  27. package/dist/esm/clients/confluence/sourceInfo.js +19 -16
  28. package/dist/esm/hooks/useFetchSyncBlockData.js +20 -11
  29. package/dist/esm/hooks/useHandleContentChanges.js +1 -5
  30. package/dist/esm/index.js +1 -1
  31. package/dist/esm/providers/block-service/blockServiceAPI.js +17 -26
  32. package/dist/esm/providers/confluence/confluenceContentAPI.js +1 -16
  33. package/dist/esm/providers/syncBlockProvider.js +32 -42
  34. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +138 -63
  35. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +93 -43
  36. package/dist/esm/store-manager/syncBlockStoreManager.js +3 -3
  37. package/dist/esm/utils/errorHandling.js +30 -0
  38. package/dist/types/clients/block-service/blockService.d.ts +0 -2
  39. package/dist/types/clients/confluence/sourceInfo.d.ts +2 -1
  40. package/dist/types/hooks/useFetchSyncBlockData.d.ts +2 -1
  41. package/dist/types/index.d.ts +2 -2
  42. package/dist/types/providers/block-service/blockServiceAPI.d.ts +7 -5
  43. package/dist/types/providers/confluence/confluenceContentAPI.d.ts +2 -3
  44. package/dist/types/providers/syncBlockProvider.d.ts +12 -9
  45. package/dist/types/providers/types.d.ts +9 -9
  46. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +6 -2
  47. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +3 -1
  48. package/dist/types/store-manager/syncBlockStoreManager.d.ts +2 -1
  49. package/dist/types/utils/errorHandling.d.ts +10 -0
  50. package/dist/types-ts4.5/clients/block-service/blockService.d.ts +0 -2
  51. package/dist/types-ts4.5/clients/confluence/sourceInfo.d.ts +2 -1
  52. package/dist/types-ts4.5/hooks/useFetchSyncBlockData.d.ts +2 -1
  53. package/dist/types-ts4.5/index.d.ts +2 -2
  54. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +7 -5
  55. package/dist/types-ts4.5/providers/confluence/confluenceContentAPI.d.ts +2 -3
  56. package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +12 -9
  57. package/dist/types-ts4.5/providers/types.d.ts +9 -9
  58. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +6 -2
  59. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +3 -1
  60. package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +2 -1
  61. package/dist/types-ts4.5/utils/errorHandling.d.ts +10 -0
  62. package/package.json +2 -8
@@ -3,11 +3,41 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stringifyError = void 0;
6
+ exports.updateErrorPayload = exports.updateCacheErrorPayload = exports.stringifyError = exports.getSourceInfoErrorPayload = exports.getErrorPayload = exports.fetchErrorPayload = exports.deleteErrorPayload = exports.createErrorPayload = void 0;
7
+ var _analytics = require("@atlaskit/editor-common/analytics");
7
8
  var stringifyError = exports.stringifyError = function stringifyError(error) {
8
9
  try {
9
10
  return JSON.stringify(error);
10
11
  } catch (_unused) {
11
12
  return undefined;
12
13
  }
14
+ };
15
+ var getErrorPayload = exports.getErrorPayload = function getErrorPayload(actionSubjectId, error) {
16
+ return {
17
+ action: _analytics.ACTION.ERROR,
18
+ actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
19
+ actionSubjectId: actionSubjectId,
20
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL,
21
+ attributes: {
22
+ error: error
23
+ }
24
+ };
25
+ };
26
+ var fetchErrorPayload = exports.fetchErrorPayload = function fetchErrorPayload(error) {
27
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_FETCH, error);
28
+ };
29
+ var getSourceInfoErrorPayload = exports.getSourceInfoErrorPayload = function getSourceInfoErrorPayload(error) {
30
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO, error);
31
+ };
32
+ var updateErrorPayload = exports.updateErrorPayload = function updateErrorPayload(error) {
33
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_UPDATE, error);
34
+ };
35
+ var createErrorPayload = exports.createErrorPayload = function createErrorPayload(error) {
36
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_CREATE, error);
37
+ };
38
+ var deleteErrorPayload = exports.deleteErrorPayload = function deleteErrorPayload(error) {
39
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_DELETE, error);
40
+ };
41
+ var updateCacheErrorPayload = exports.updateCacheErrorPayload = function updateCacheErrorPayload(error) {
42
+ return getErrorPayload(_analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_UPDATE_CACHE, error);
13
43
  };
@@ -12,7 +12,7 @@ export class BlockError extends Error {
12
12
  export const getSyncedBlockContent = async ({
13
13
  blockAri
14
14
  }) => {
15
- const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${blockAri}`, {
15
+ const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${encodeURIComponent(blockAri)}`, {
16
16
  method: 'GET',
17
17
  headers: COMMON_HEADERS
18
18
  });
@@ -24,7 +24,7 @@ export const getSyncedBlockContent = async ({
24
24
  export const deleteSyncedBlock = async ({
25
25
  blockAri
26
26
  }) => {
27
- const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${blockAri}`, {
27
+ const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${encodeURIComponent(blockAri)}`, {
28
28
  method: 'DELETE',
29
29
  headers: COMMON_HEADERS
30
30
  });
@@ -36,7 +36,7 @@ export const updateSyncedBlock = async ({
36
36
  blockAri,
37
37
  content
38
38
  }) => {
39
- const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${blockAri}`, {
39
+ const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${encodeURIComponent(blockAri)}`, {
40
40
  method: 'PUT',
41
41
  headers: COMMON_HEADERS,
42
42
  body: JSON.stringify({
@@ -54,10 +54,11 @@ export const createSyncedBlock = async ({
54
54
  product,
55
55
  content
56
56
  }) => {
57
- const response = await fetch(`${BLOCK_SERVICE_API_URL}/block/${blockAri}`, {
57
+ const response = await fetch(`${BLOCK_SERVICE_API_URL}/block`, {
58
58
  method: 'POST',
59
59
  headers: COMMON_HEADERS,
60
60
  body: JSON.stringify({
61
+ blockAri,
61
62
  blockInstanceId,
62
63
  sourceAri,
63
64
  product,
@@ -1,5 +1,7 @@
1
1
  /* eslint-disable require-unicode-regexp */
2
2
 
3
+ import { logException } from '@atlaskit/editor-common/monitoring';
4
+ import { getSourceInfoErrorPayload } from '../../utils/errorHandling';
3
5
  import { getPageIdAndTypeFromConfluencePageAri } from './ari';
4
6
  import { isBlogPageType } from './utils';
5
7
  const COMMON_HEADERS = {
@@ -52,7 +54,7 @@ const getConfluenceSourceInfo = async ari => {
52
54
  }
53
55
  return await response.json();
54
56
  };
55
- export const fetchConfluenceSourceInfo = async (pageAri, localId) => {
57
+ export const fetchConfluencePageInfo = async (pageAri, localId, fireAnalyticsEvent) => {
56
58
  try {
57
59
  var _response$data, _response$data$conten, _response$data$conten2, _contentData$space;
58
60
  const {
@@ -60,15 +62,12 @@ export const fetchConfluenceSourceInfo = async (pageAri, localId) => {
60
62
  } = getPageIdAndTypeFromConfluencePageAri(pageAri);
61
63
  const response = await getConfluenceSourceInfo(pageAri);
62
64
  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];
63
- if (!contentData) {
64
- throw new Error(`Failed to get content data`);
65
- }
66
- const title = contentData.title;
65
+ const title = contentData === null || contentData === void 0 ? void 0 : contentData.title;
67
66
  let url;
68
67
  const {
69
68
  base
70
- } = contentData.links || {};
71
- if (base && (_contentData$space = contentData.space) !== null && _contentData$space !== void 0 && _contentData$space.key && contentData.id) {
69
+ } = (contentData === null || contentData === void 0 ? void 0 : contentData.links) || {};
70
+ if (base && contentData !== null && contentData !== void 0 && (_contentData$space = contentData.space) !== null && _contentData$space !== void 0 && _contentData$space.key && contentData !== null && contentData !== void 0 && contentData.id) {
72
71
  if (isBlogPageType(pageType)) {
73
72
  url = `${base}/spaces/${contentData.space.key}/blog/edit-v2/${contentData.id}`;
74
73
  } else if (contentData.subType === 'live') {
@@ -78,12 +77,18 @@ export const fetchConfluenceSourceInfo = async (pageAri, localId) => {
78
77
  }
79
78
  }
80
79
  url = url && localId ? `${url}#block-${localId}` : url;
80
+ if (!title || !url) {
81
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(getSourceInfoErrorPayload('Failed to get confluence page source info'));
82
+ }
81
83
  return Promise.resolve({
82
84
  title,
83
85
  url
84
86
  });
85
87
  } catch (error) {
86
- // TODO: EDITOR-1921 - add error analytics
88
+ logException(error, {
89
+ location: 'editor-synced-block-provider/sourceInfo'
90
+ });
91
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(getSourceInfoErrorPayload(error.message));
87
92
  return Promise.resolve(undefined);
88
93
  }
89
94
  };
@@ -1,22 +1,30 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
+ import { logException } from '@atlaskit/editor-common/monitoring';
2
3
  import { SyncBlockError } from '../common/types';
4
+ import { fetchErrorPayload } from '../utils/errorHandling';
3
5
  import { createSyncBlockNode } from '../utils/utils';
4
- export const useFetchSyncBlockData = (manager, resourceId, localId) => {
6
+ export const useFetchSyncBlockData = (manager, resourceId, localId, fireAnalyticsEvent) => {
5
7
  const [syncBlockInstance, setSyncBlockInstance] = useState(null);
6
8
  const [isLoading, setIsLoading] = useState(true);
7
9
  const reloadData = useCallback(async () => {
8
10
  if (isLoading) {
9
11
  return;
10
12
  }
11
- const syncBlockNode = resourceId && localId ? createSyncBlockNode(localId, resourceId) : null;
12
- if (!syncBlockNode) {
13
- return;
14
- }
15
- setIsLoading(true);
16
13
  try {
14
+ const syncBlockNode = resourceId && localId ? createSyncBlockNode(localId, resourceId) : null;
15
+ if (!syncBlockNode) {
16
+ throw new Error('Failed to create sync block node from resourceid and localid');
17
+ }
18
+ setIsLoading(true);
19
+
17
20
  // Fetch sync block data, the `subscribeToSyncBlock` will update the state once data is fetched
18
21
  await manager.referenceManager.fetchSyncBlocksData([syncBlockNode]);
19
22
  } catch (error) {
23
+ logException(error, {
24
+ location: 'editor-synced-block-provider/useFetchSyncBlockData'
25
+ });
26
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(fetchErrorPayload(error.message));
27
+
20
28
  // Set error state if fetching fails
21
29
  setSyncBlockInstance({
22
30
  resourceId: resourceId || '',
@@ -24,7 +32,7 @@ export const useFetchSyncBlockData = (manager, resourceId, localId) => {
24
32
  });
25
33
  }
26
34
  setIsLoading(false);
27
- }, [isLoading, localId, manager.referenceManager, resourceId]);
35
+ }, [isLoading, localId, manager.referenceManager, resourceId, fireAnalyticsEvent]);
28
36
  useEffect(() => {
29
37
  const unsubscribe = manager.referenceManager.subscribeToSyncBlock(resourceId || '', localId || '', data => {
30
38
  setSyncBlockInstance(data);
@@ -1,10 +1,6 @@
1
1
  import { useEffect } from 'react';
2
2
  export const useHandleContentChanges = (manager, syncBlockNode) => {
3
3
  useEffect(() => {
4
- try {
5
- manager.sourceManager.updateSyncBlockData(syncBlockNode);
6
- } catch {
7
- //TODO: EDITOR-1921 - add error analytics
8
- }
4
+ manager.sourceManager.updateSyncBlockData(syncBlockNode);
9
5
  }, [manager, syncBlockNode]);
10
6
  };
@@ -15,7 +15,7 @@ export { getConfluencePageAri, getLocalIdFromConfluencePageAri, getPageARIFromCo
15
15
  // providers
16
16
  export { useMemoizedBlockServiceAPIProviders } from './providers/block-service/blockServiceAPI';
17
17
  export { createContentAPIProvidersWithDefaultKey, useMemoizedContentAPIProviders } from './providers/confluence/confluenceContentAPI';
18
- export { fetchConfluenceSourceInfo } from './clients/confluence/sourceInfo';
18
+ export { fetchConfluencePageInfo } from './clients/confluence/sourceInfo';
19
19
  export { SyncBlockProvider as SyncedBlockProvider, useMemoizedSyncedBlockProvider } from './providers/syncBlockProvider';
20
20
  // store managers
21
21
  export { ReferenceSyncBlockStoreManager } from './store-manager/referenceSyncBlockStoreManager';
@@ -56,24 +56,17 @@ class BlockServiceADFFetchProvider {
56
56
  };
57
57
  }
58
58
  }
59
- retrieveSourceInfoFetchData(resourceId, pageARI) {
60
- let sourceLocalId;
61
- try {
62
- sourceLocalId = getLocalIdFromBlockResourceId(resourceId);
63
- } catch (error) {
64
- // EDITOR-1921: log analytic here, safe to continue
65
- }
66
- return {
67
- pageARI,
68
- sourceLocalId
69
- };
70
- }
71
59
  }
72
60
 
73
61
  /**
74
62
  * ADFWriteProvider implementation that writes synced block data to Block Service API
75
63
  */
76
64
  class BlockServiceADFWriteProvider {
65
+ constructor(sourceAri, product) {
66
+ this.sourceAri = sourceAri;
67
+ this.product = product;
68
+ }
69
+
77
70
  // it will first try to update and if it can't (404) then it will try to create
78
71
  async writeData(data) {
79
72
  const {
@@ -95,8 +88,8 @@ class BlockServiceADFWriteProvider {
95
88
  await createSyncedBlock({
96
89
  blockAri: resourceId,
97
90
  blockInstanceId: data.blockInstanceId,
98
- sourceAri: resourceId,
99
- product: 'confluence-page',
91
+ sourceAri: this.sourceAri,
92
+ product: this.product,
100
93
  content: JSON.stringify(data.content)
101
94
  });
102
95
  } else {
@@ -139,22 +132,22 @@ class BlockServiceADFWriteProvider {
139
132
  };
140
133
  }
141
134
  }
142
- generateResourceId(sourceId, localId) {
143
- return blockResourceIdFromSourceAndLocalId(sourceId, localId);
135
+ generateResourceId(sourceAri, localId) {
136
+ return blockResourceIdFromSourceAndLocalId(sourceAri, localId);
144
137
  }
145
138
  }
146
139
 
147
140
  /**
148
141
  * Factory function to create both providers with shared configuration
149
142
  */
150
- const createBlockServiceAPIProviders = () => {
143
+ const createBlockServiceAPIProviders = (sourceAri, product) => {
151
144
  const fetchProvider = new BlockServiceADFFetchProvider();
152
- const writeProvider = new BlockServiceADFWriteProvider();
145
+ const writeProvider = new BlockServiceADFWriteProvider(sourceAri, product);
153
146
  return {
154
147
  fetchProvider,
155
148
  writeProvider
156
149
  };
157
150
  };
158
- export const useMemoizedBlockServiceAPIProviders = () => {
159
- return useMemo(createBlockServiceAPIProviders, []);
151
+ export const useMemoizedBlockServiceAPIProviders = (sourceAri, product) => {
152
+ return useMemo(() => createBlockServiceAPIProviders(sourceAri, product), [sourceAri, product]);
160
153
  };
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { useMemo } from 'react';
3
- import { getConfluencePageAri, getPageARIFromContentPropertyResourceId, getLocalIdFromConfluencePageAri, getPageIdAndTypeFromConfluencePageAri, resourceIdFromConfluencePageSourceIdAndLocalId } from '../../clients/confluence/ari';
3
+ import { getConfluencePageAri, getLocalIdFromConfluencePageAri, getPageIdAndTypeFromConfluencePageAri, resourceIdFromConfluencePageSourceIdAndLocalId } from '../../clients/confluence/ari';
4
4
  import { getContentProperty, createContentProperty, updateContentProperty, deleteContentProperty } from '../../clients/confluence/contentProperty';
5
5
  import { isBlogPageType } from '../../clients/confluence/utils';
6
6
  import { SyncBlockError } from '../../common/types';
@@ -108,19 +108,6 @@ class ConfluenceADFFetchProvider {
108
108
  };
109
109
  }
110
110
  }
111
- retrieveSourceInfoFetchData(resourceId) {
112
- const pageARI = getPageARIFromContentPropertyResourceId(resourceId);
113
- let sourceLocalId;
114
- try {
115
- sourceLocalId = getLocalIdFromConfluencePageAri(resourceId);
116
- } catch (error) {
117
- // EDITOR-1921: log analytic here, safe to continue
118
- }
119
- return {
120
- pageARI,
121
- sourceLocalId
122
- };
123
- }
124
111
  }
125
112
 
126
113
  /**
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { useMemo } from 'react';
3
3
  import { getPageIdAndTypeFromConfluencePageAri } from '../clients/confluence/ari';
4
- import { fetchConfluenceSourceInfo } from '../clients/confluence/sourceInfo';
4
+ import { fetchConfluencePageInfo } from '../clients/confluence/sourceInfo';
5
5
  import { SyncBlockError } from '../common/types';
6
6
  import { SyncBlockDataProvider } from '../providers/types';
7
7
  export class SyncBlockProvider extends SyncBlockDataProvider {
@@ -61,7 +61,7 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
61
61
  return data;
62
62
  }, () => {
63
63
  return {
64
- status: SyncBlockError.Errored,
64
+ error: SyncBlockError.Errored,
65
65
  resourceId
66
66
  };
67
67
  });
@@ -131,34 +131,26 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
131
131
  }
132
132
 
133
133
  /**
134
- * Retrieve the source info from the source id
134
+ * Fetch the source info from the source id
135
135
  *
136
- * @param node
136
+ * @param params
137
+ * @param params.sourceAri - The source ARI
138
+ * @param params.sourceProduct - The source product. e.g. 'confluence-page', 'jira-work-item'
137
139
  *
138
140
  * @returns The source info
139
141
  */
140
- retrieveSyncBlockSourceInfo(node) {
141
- // with content API, this is the concatenation of the page ARI and the block's localId.
142
- // with block service, this is the ARI of the block.
143
- // this can be cleaned up from the specific providers and placed here after platform_synced_blocks_block_service_provider
144
- const {
145
- resourceId
146
- } = node.attrs;
147
- let pageARI;
148
- let sourceLocalId;
149
- if (resourceId && typeof resourceId === 'string') {
150
- try {
151
- const fetchData = this.fetchProvider.retrieveSourceInfoFetchData(resourceId, this.sourceId);
152
- pageARI = fetchData.pageARI;
153
- sourceLocalId = fetchData.sourceLocalId;
154
- } catch (error) {
155
- return Promise.reject(error);
156
- }
142
+ fetchSyncBlockSourceInfo(localId, sourceAri, sourceProduct, fireAnalyticsEvent) {
143
+ if (!sourceAri || !sourceProduct) {
144
+ return Promise.reject(new Error('Source ari or source product is undefined'));
145
+ }
146
+ switch (sourceProduct) {
147
+ case 'confluence-page':
148
+ return fetchConfluencePageInfo(sourceAri, localId, fireAnalyticsEvent);
149
+ case 'jira-work-item':
150
+ return Promise.reject(new Error('Jira work item source product not supported'));
151
+ default:
152
+ return Promise.reject(new Error(`${sourceProduct} source product not supported`));
157
153
  }
158
-
159
- // TODO: EDITOR-3312 - based on the source sync block product,
160
- // execute fetchConfluenceSourceInfo or fetchJiraItemSourceInfo or similar...
161
- return pageARI ? fetchConfluenceSourceInfo(pageARI, sourceLocalId) : Promise.resolve(undefined);
162
154
  }
163
155
  generateResourceId(sourceId, localId) {
164
156
  return this.writeProvider.generateResourceId(sourceId, localId);
@@ -176,32 +168,26 @@ export class SyncBlockProvider extends SyncBlockDataProvider {
176
168
  /**
177
169
  * Retrieve the parent info for the sync block
178
170
  *
179
- * @param resourceId
180
- * @param syncBlockInstance
171
+ * @param sourceAri - The source ARI
172
+ * @param sourceProduct - The source product. e.g. 'confluence-page', 'jira-work-item'
181
173
  *
182
174
  * @returns The parent info for the sync block
183
175
  */
184
- retrieveSyncBlockParentInfo(syncBlockInstance) {
185
- if (!syncBlockInstance || !syncBlockInstance.data) {
176
+ retrieveSyncBlockParentInfo(sourceAri, sourceProduct) {
177
+ if (!sourceAri || !sourceProduct) {
186
178
  return undefined;
187
179
  }
188
- const {
189
- sourceAri,
190
- product
191
- } = syncBlockInstance.data;
192
- if (!sourceAri || !product) {
193
- return undefined;
180
+ switch (sourceProduct) {
181
+ case 'confluence-page':
182
+ return {
183
+ contentId: getPageIdAndTypeFromConfluencePageAri(sourceAri).id,
184
+ contentProduct: sourceProduct
185
+ };
186
+ case 'jira-work-item':
187
+ throw new Error('Jira work item source product not supported');
188
+ default:
189
+ throw new Error(`${sourceProduct} source product not supported`);
194
190
  }
195
-
196
- // TODO: EDITOR-3312 - based on the source sync block product,
197
- // execute getPageIdAndTypeFromConfluencePageAri or getJiraItemIdAndTypeFromJiraItemAri or similar...
198
- const {
199
- id: contentId
200
- } = getPageIdAndTypeFromConfluencePageAri(sourceAri);
201
- return {
202
- contentId,
203
- contentProduct: product
204
- };
205
191
  }
206
192
  }
207
193
  export const useMemoizedSyncedBlockProvider = (fetchProvider, writeProvider, sourceId, providerOptions) => {