@atlaskit/editor-synced-block-provider 3.30.4 → 3.30.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/clients/block-service/blockService.js +23 -16
- package/dist/cjs/clients/confluence/fetchMediaToken.js +7 -5
- package/dist/cjs/hooks/useFetchSyncBlockTitle.js +40 -2
- package/dist/cjs/hooks/useHandleContentChanges.js +3 -0
- package/dist/cjs/providers/syncBlockProvider.js +32 -2
- package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +55 -85
- package/dist/cjs/store-manager/syncBlockStoreManager.js +20 -5
- package/dist/cjs/utils/experienceTracking.js +10 -10
- package/dist/cjs/utils/resourceId.js +2 -2
- package/dist/cjs/utils/retry.js +33 -7
- package/dist/cjs/utils/utils.js +1 -1
- package/dist/cjs/utils/validValue.js +2 -1
- package/dist/es2019/clients/block-service/blockService.js +20 -13
- package/dist/es2019/clients/confluence/fetchMediaToken.js +5 -3
- package/dist/es2019/hooks/useFetchSyncBlockTitle.js +36 -3
- package/dist/es2019/hooks/useHandleContentChanges.js +3 -0
- package/dist/es2019/providers/syncBlockProvider.js +30 -3
- package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +44 -62
- package/dist/es2019/store-manager/syncBlockStoreManager.js +19 -6
- package/dist/es2019/utils/experienceTracking.js +10 -10
- package/dist/es2019/utils/resourceId.js +2 -2
- package/dist/es2019/utils/retry.js +26 -6
- package/dist/es2019/utils/utils.js +1 -1
- package/dist/es2019/utils/validValue.js +2 -1
- package/dist/esm/clients/block-service/blockService.js +23 -16
- package/dist/esm/clients/confluence/fetchMediaToken.js +7 -5
- package/dist/esm/hooks/useFetchSyncBlockTitle.js +41 -3
- package/dist/esm/hooks/useHandleContentChanges.js +3 -0
- package/dist/esm/providers/syncBlockProvider.js +33 -3
- package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +55 -85
- package/dist/esm/store-manager/syncBlockStoreManager.js +21 -6
- package/dist/esm/utils/experienceTracking.js +10 -10
- package/dist/esm/utils/resourceId.js +2 -2
- package/dist/esm/utils/retry.js +33 -7
- package/dist/esm/utils/utils.js +1 -1
- package/dist/esm/utils/validValue.js +2 -1
- package/dist/types/providers/syncBlockProvider.d.ts +1 -1
- package/dist/types/store-manager/syncBlockStoreManager.d.ts +1 -1
- package/dist/types/utils/experienceTracking.d.ts +10 -10
- package/dist/types-ts4.5/providers/syncBlockProvider.d.ts +1 -1
- package/dist/types-ts4.5/store-manager/syncBlockStoreManager.d.ts +1 -1
- package/dist/types-ts4.5/utils/experienceTracking.d.ts +10 -10
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/editor-synced-block-provider
|
|
2
2
|
|
|
3
|
+
## 3.30.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`e18437c28f9ab`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e18437c28f9ab) -
|
|
8
|
+
Improve synced blocks robustness.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
|
|
11
|
+
## 3.30.5
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [`85444e8a5672a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/85444e8a5672a) -
|
|
16
|
+
EDITOR-5526 clean up platform_synced_block_patch_2
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 3.30.4
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -130,7 +130,7 @@ var BATCH_RETRIEVE_BLOCKS_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_BATCH_RETRIEVE_B
|
|
|
130
130
|
var GET_BLOCK_REFERENCES_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_REFERENCES';
|
|
131
131
|
var GET_BLOCK_OPERATION_NAME = 'EDITOR_SYNCED_BLOCK_GET_BLOCK';
|
|
132
132
|
var buildGetDocumentReferenceBlocksQuery = function buildGetDocumentReferenceBlocksQuery(documentAri) {
|
|
133
|
-
return "query ".concat(GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME, " {\n\tblockService_getDocumentReferenceBlocks(documentAri: \""
|
|
133
|
+
return "query ".concat(GET_DOCUMENT_REFERENCE_BLOCKS_OPERATION_NAME, " {\n\tblockService_getDocumentReferenceBlocks(documentAri: ").concat((0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? JSON.stringify(documentAri) : "\"".concat(documentAri, "\""), ") {\n\t\tblocks {\n\t\t\tblockAri\n\t\t\tblockInstanceId\n\t\t\tcontent\n\t\t\tcontentUpdatedAt\n\t\t\tcreatedAt\n\t\t\tcreatedBy\n\t\t\tproduct\n\t\t\tsourceAri\n\t\t\tstatus\n\t\t\tversion\n\t\t}\n\t\terrors {\n\t\t\tblockAri\n\t\t\tcode\n\t\t\treason\n\t\t}\n\t}\n}");
|
|
134
134
|
};
|
|
135
135
|
var buildGetBlockQuery = function buildGetBlockQuery(blockAri) {
|
|
136
136
|
return "query ".concat(GET_BLOCK_OPERATION_NAME, " {\n\tblockService_getBlock(blockAri: ").concat(JSON.stringify(blockAri), ") {\n\t\tblockAri\n\t\tblockInstanceId\n\t\tcontent\n\t\tcontentUpdatedAt\n\t\tcreatedAt\n\t\tcreatedBy\n\t\tdeletionReason\n\t\tproduct\n\t\tsourceAri\n\t\tstatus\n\t\tversion\n\t}\n}");
|
|
@@ -161,11 +161,17 @@ var buildDeleteBlockMutation = function buildDeleteBlockMutation(blockAri, delet
|
|
|
161
161
|
* 'jira-work-item' -> 'JIRA_WORK_ITEM'
|
|
162
162
|
*/
|
|
163
163
|
var convertProductToGraphQLEnum = function convertProductToGraphQLEnum(product) {
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
switch (product) {
|
|
165
|
+
case 'confluence-page':
|
|
166
|
+
return 'CONFLUENCE_PAGE';
|
|
167
|
+
case 'jira-work-item':
|
|
168
|
+
return 'JIRA_WORK_ITEM';
|
|
169
|
+
default:
|
|
170
|
+
{
|
|
171
|
+
var exhaustiveCheck = product;
|
|
172
|
+
throw new Error("Unsupported product: ".concat(exhaustiveCheck));
|
|
173
|
+
}
|
|
166
174
|
}
|
|
167
|
-
// product must be 'jira-work-item' at this point
|
|
168
|
-
return 'JIRA_WORK_ITEM';
|
|
169
175
|
};
|
|
170
176
|
var buildCreateBlockMutation = function buildCreateBlockMutation(blockAri, blockInstanceId, content, product, sourceAri, stepVersion, status) {
|
|
171
177
|
var inputParts = ["blockAri: ".concat(JSON.stringify(blockAri)), "blockInstanceId: ".concat(JSON.stringify(blockInstanceId)), "content: ".concat(JSON.stringify(content)), "product: ".concat(convertProductToGraphQLEnum(product)), "sourceAri: ".concat(JSON.stringify(sourceAri))];
|
|
@@ -336,8 +342,8 @@ var batchRetrieveSyncedBlocks = exports.batchRetrieveSyncedBlocks = /*#__PURE__*
|
|
|
336
342
|
}();
|
|
337
343
|
var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
|
|
338
344
|
var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(_ref6) {
|
|
339
|
-
var _result$data3;
|
|
340
|
-
var blockAri, deleteReason, bodyData, url, response, result;
|
|
345
|
+
var _result$data3, _result$data4;
|
|
346
|
+
var blockAri, deleteReason, bodyData, url, response, result, isDeleted;
|
|
341
347
|
return _regenerator.default.wrap(function _callee4$(_context4) {
|
|
342
348
|
while (1) switch (_context4.prev = _context4.next) {
|
|
343
349
|
case 0:
|
|
@@ -373,12 +379,13 @@ var deleteSyncedBlock = exports.deleteSyncedBlock = /*#__PURE__*/function () {
|
|
|
373
379
|
return e.message;
|
|
374
380
|
}).join(', '));
|
|
375
381
|
case 13:
|
|
376
|
-
|
|
377
|
-
|
|
382
|
+
isDeleted = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? (_result$data3 = result.data) === null || _result$data3 === void 0 || (_result$data3 = _result$data3.blockService_deleteBlock) === null || _result$data3 === void 0 ? void 0 : _result$data3.deleted : (_result$data4 = result.data) === null || _result$data4 === void 0 ? void 0 : _result$data4.blockService_deleteBlock.deleted;
|
|
383
|
+
if (isDeleted) {
|
|
384
|
+
_context4.next = 16;
|
|
378
385
|
break;
|
|
379
386
|
}
|
|
380
387
|
throw new Error('Block deletion failed; deleted flag is false');
|
|
381
|
-
case
|
|
388
|
+
case 16:
|
|
382
389
|
case "end":
|
|
383
390
|
return _context4.stop();
|
|
384
391
|
}
|
|
@@ -437,7 +444,7 @@ var updateSyncedBlock = exports.updateSyncedBlock = /*#__PURE__*/function () {
|
|
|
437
444
|
}();
|
|
438
445
|
var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
|
|
439
446
|
var _ref1 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(_ref0) {
|
|
440
|
-
var _result$
|
|
447
|
+
var _result$data5;
|
|
441
448
|
var blockAri, blockInstanceId, sourceAri, product, content, stepVersion, status, bodyData, url, response, result;
|
|
442
449
|
return _regenerator.default.wrap(function _callee6$(_context6) {
|
|
443
450
|
while (1) switch (_context6.prev = _context6.next) {
|
|
@@ -474,7 +481,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
|
|
|
474
481
|
return e.message;
|
|
475
482
|
}).join(', '));
|
|
476
483
|
case 13:
|
|
477
|
-
if ((_result$
|
|
484
|
+
if ((_result$data5 = result.data) !== null && _result$data5 !== void 0 && _result$data5.blockService_createBlock) {
|
|
478
485
|
_context6.next = 15;
|
|
479
486
|
break;
|
|
480
487
|
}
|
|
@@ -493,7 +500,7 @@ var createSyncedBlock = exports.createSyncedBlock = /*#__PURE__*/function () {
|
|
|
493
500
|
}();
|
|
494
501
|
var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnDocument = /*#__PURE__*/function () {
|
|
495
502
|
var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(_ref10) {
|
|
496
|
-
var documentAri, blocks, _ref10$noContent, noContent, bodyData, url, response, result, _result$
|
|
503
|
+
var documentAri, blocks, _ref10$noContent, noContent, bodyData, url, response, result, _result$data6;
|
|
497
504
|
return _regenerator.default.wrap(function _callee7$(_context7) {
|
|
498
505
|
while (1) switch (_context7.prev = _context7.next) {
|
|
499
506
|
case 0:
|
|
@@ -534,7 +541,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
|
|
|
534
541
|
_context7.next = 17;
|
|
535
542
|
break;
|
|
536
543
|
}
|
|
537
|
-
if ((_result$
|
|
544
|
+
if ((_result$data6 = result.data) !== null && _result$data6 !== void 0 && _result$data6.blockService_updateDocumentReferences) {
|
|
538
545
|
_context7.next = 16;
|
|
539
546
|
break;
|
|
540
547
|
}
|
|
@@ -553,7 +560,7 @@ var updateReferenceSyncedBlockOnDocument = exports.updateReferenceSyncedBlockOnD
|
|
|
553
560
|
}();
|
|
554
561
|
var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlockAri = /*#__PURE__*/function () {
|
|
555
562
|
var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(_ref12) {
|
|
556
|
-
var _result$
|
|
563
|
+
var _result$data7;
|
|
557
564
|
var blockAri, bodyData, url, response, result, graphqlResponse;
|
|
558
565
|
return _regenerator.default.wrap(function _callee8$(_context8) {
|
|
559
566
|
while (1) switch (_context8.prev = _context8.next) {
|
|
@@ -590,7 +597,7 @@ var getReferenceSyncedBlocksByBlockAri = exports.getReferenceSyncedBlocksByBlock
|
|
|
590
597
|
return e.message;
|
|
591
598
|
}).join(', '));
|
|
592
599
|
case 13:
|
|
593
|
-
if ((_result$
|
|
600
|
+
if ((_result$data7 = result.data) !== null && _result$data7 !== void 0 && _result$data7.blockService_getReferences) {
|
|
594
601
|
_context8.next = 15;
|
|
595
602
|
break;
|
|
596
603
|
}
|
|
@@ -9,6 +9,7 @@ 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"));
|
|
11
11
|
var _monitoring = require("@atlaskit/editor-common/monitoring");
|
|
12
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
12
13
|
var _retry = require("../../utils/retry");
|
|
13
14
|
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; }
|
|
14
15
|
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; }
|
|
@@ -66,7 +67,7 @@ var getContentMediaSession = /*#__PURE__*/function () {
|
|
|
66
67
|
}();
|
|
67
68
|
var fetchMediaToken = exports.fetchMediaToken = /*#__PURE__*/function () {
|
|
68
69
|
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(contentId) {
|
|
69
|
-
var _response$data, _contentData$token, response, contentData, token, configuration, collection;
|
|
70
|
+
var _response$data, _contentData$token, response, contentData, token, configuration, collection, errorMsg;
|
|
70
71
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
71
72
|
while (1) switch (_context2.prev = _context2.next) {
|
|
72
73
|
case 0:
|
|
@@ -85,19 +86,20 @@ var fetchMediaToken = exports.fetchMediaToken = /*#__PURE__*/function () {
|
|
|
85
86
|
}
|
|
86
87
|
throw new Error('Failed to get content media session data');
|
|
87
88
|
case 10:
|
|
88
|
-
return _context2.abrupt("return",
|
|
89
|
+
return _context2.abrupt("return", {
|
|
89
90
|
config: configuration,
|
|
90
91
|
token: token,
|
|
91
92
|
collectionId: collection
|
|
92
|
-
})
|
|
93
|
+
});
|
|
93
94
|
case 13:
|
|
94
95
|
_context2.prev = 13;
|
|
95
96
|
_context2.t0 = _context2["catch"](0);
|
|
96
97
|
(0, _monitoring.logException)(_context2.t0, {
|
|
97
98
|
location: 'editor-synced-block-provider/fetchMediaToken'
|
|
98
99
|
});
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
errorMsg = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4') ? _context2.t0 instanceof Error ? _context2.t0.message : String(_context2.t0) : String(_context2.t0);
|
|
101
|
+
throw new Error("Failed to get content media session: ".concat(errorMsg));
|
|
102
|
+
case 18:
|
|
101
103
|
case "end":
|
|
102
104
|
return _context2.stop();
|
|
103
105
|
}
|
|
@@ -7,7 +7,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.useFetchSyncBlockTitle = void 0;
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
9
|
var _react = require("react");
|
|
10
|
-
var
|
|
10
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
11
|
+
var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
|
|
12
|
+
var useFetchSyncBlockTitleBase = function useFetchSyncBlockTitleBase(manager, syncBlockNode) {
|
|
11
13
|
// Initialize state from cache to prevent flickering during re-renders
|
|
12
14
|
var _useState = (0, _react.useState)(function () {
|
|
13
15
|
var _cachedData$data;
|
|
@@ -33,4 +35,40 @@ var useFetchSyncBlockTitle = exports.useFetchSyncBlockTitle = function useFetchS
|
|
|
33
35
|
};
|
|
34
36
|
}, [manager, syncBlockNode]);
|
|
35
37
|
return sourceTitle;
|
|
36
|
-
};
|
|
38
|
+
};
|
|
39
|
+
var useFetchSyncBlockTitlePatched = function useFetchSyncBlockTitlePatched(manager, syncBlockNode) {
|
|
40
|
+
var _syncBlockNode$attrs, _syncBlockNode$attrs2;
|
|
41
|
+
var nodeRef = (0, _react.useRef)(syncBlockNode);
|
|
42
|
+
nodeRef.current = syncBlockNode;
|
|
43
|
+
var nodeTypeName = syncBlockNode.type.name;
|
|
44
|
+
var resourceId = (_syncBlockNode$attrs = syncBlockNode.attrs) === null || _syncBlockNode$attrs === void 0 ? void 0 : _syncBlockNode$attrs.resourceId;
|
|
45
|
+
var localId = (_syncBlockNode$attrs2 = syncBlockNode.attrs) === null || _syncBlockNode$attrs2 === void 0 ? void 0 : _syncBlockNode$attrs2.localId;
|
|
46
|
+
|
|
47
|
+
// Initialize state from cache to prevent flickering during re-renders
|
|
48
|
+
var _useState3 = (0, _react.useState)(function () {
|
|
49
|
+
var _cachedData$data2;
|
|
50
|
+
if (nodeTypeName !== 'syncBlock') {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
if (!resourceId) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
var cachedData = manager.referenceManager.getFromCache(resourceId);
|
|
57
|
+
return cachedData === null || cachedData === void 0 || (_cachedData$data2 = cachedData.data) === null || _cachedData$data2 === void 0 ? void 0 : _cachedData$data2.sourceTitle;
|
|
58
|
+
}),
|
|
59
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
60
|
+
sourceTitle = _useState4[0],
|
|
61
|
+
setSourceTitle = _useState4[1];
|
|
62
|
+
(0, _react.useEffect)(function () {
|
|
63
|
+
var unsubscribe = manager.referenceManager.subscribeToSourceTitle(nodeRef.current, function (title) {
|
|
64
|
+
setSourceTitle(title);
|
|
65
|
+
});
|
|
66
|
+
return function () {
|
|
67
|
+
unsubscribe();
|
|
68
|
+
};
|
|
69
|
+
}, [manager, nodeTypeName, resourceId, localId]);
|
|
70
|
+
return sourceTitle;
|
|
71
|
+
};
|
|
72
|
+
var useFetchSyncBlockTitle = exports.useFetchSyncBlockTitle = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
|
|
73
|
+
return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
|
|
74
|
+
}, useFetchSyncBlockTitlePatched, useFetchSyncBlockTitleBase);
|
|
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useHandleContentChanges = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var useHandleContentChanges = exports.useHandleContentChanges = function useHandleContentChanges(manager, syncBlockNode) {
|
|
9
|
+
// syncBlockNode is intentionally in deps — its reference changes when the
|
|
10
|
+
// node content is modified by a ProseMirror transaction, which is exactly
|
|
11
|
+
// when the source manager cache needs to be updated.
|
|
9
12
|
(0, _react.useEffect)(function () {
|
|
10
13
|
manager.sourceManager.updateSyncBlockData(syncBlockNode);
|
|
11
14
|
}, [manager, syncBlockNode]);
|
|
@@ -15,6 +15,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
|
|
|
15
15
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
16
|
var _react = require("react");
|
|
17
17
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
18
|
+
var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
|
|
18
19
|
var _ari = require("../clients/block-service/ari");
|
|
19
20
|
var _ari2 = require("../clients/confluence/ari");
|
|
20
21
|
var _sourceInfo2 = require("../clients/confluence/sourceInfo");
|
|
@@ -451,7 +452,7 @@ var createSyncedBlockProvider = function createSyncedBlockProvider(_ref) {
|
|
|
451
452
|
writeProvider = _ref.writeProvider;
|
|
452
453
|
return new SyncedBlockProvider(fetchProvider, writeProvider);
|
|
453
454
|
};
|
|
454
|
-
var
|
|
455
|
+
var useMemoizedSyncedBlockProviderBase = function useMemoizedSyncedBlockProviderBase(_ref2) {
|
|
455
456
|
var fetchProvider = _ref2.fetchProvider,
|
|
456
457
|
writeProvider = _ref2.writeProvider,
|
|
457
458
|
providerOptions = _ref2.providerOptions,
|
|
@@ -468,4 +469,33 @@ var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = fu
|
|
|
468
469
|
syncBlockProvider.setSSRData(ssrData);
|
|
469
470
|
}
|
|
470
471
|
return syncBlockProvider;
|
|
471
|
-
};
|
|
472
|
+
};
|
|
473
|
+
var useMemoizedSyncedBlockProviderPatched = function useMemoizedSyncedBlockProviderPatched(_ref3) {
|
|
474
|
+
var fetchProvider = _ref3.fetchProvider,
|
|
475
|
+
writeProvider = _ref3.writeProvider,
|
|
476
|
+
providerOptions = _ref3.providerOptions,
|
|
477
|
+
getSSRData = _ref3.getSSRData;
|
|
478
|
+
var syncBlockProvider = (0, _react.useMemo)(function () {
|
|
479
|
+
return createSyncedBlockProvider({
|
|
480
|
+
fetchProvider: fetchProvider,
|
|
481
|
+
writeProvider: writeProvider
|
|
482
|
+
});
|
|
483
|
+
}, [fetchProvider, writeProvider]);
|
|
484
|
+
var prevProviderOptionsRef = (0, _react.useRef)(undefined);
|
|
485
|
+
if (providerOptions !== prevProviderOptionsRef.current) {
|
|
486
|
+
prevProviderOptionsRef.current = providerOptions;
|
|
487
|
+
syncBlockProvider.setProviderOptions(providerOptions);
|
|
488
|
+
}
|
|
489
|
+
var prevSSRDataRef = (0, _react.useRef)(undefined);
|
|
490
|
+
var ssrData = getSSRData === null || getSSRData === void 0 ? void 0 : getSSRData();
|
|
491
|
+
if (ssrData !== prevSSRDataRef.current) {
|
|
492
|
+
prevSSRDataRef.current = ssrData;
|
|
493
|
+
if (ssrData) {
|
|
494
|
+
syncBlockProvider.setSSRData(ssrData);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return syncBlockProvider;
|
|
498
|
+
};
|
|
499
|
+
var useMemoizedSyncedBlockProvider = exports.useMemoizedSyncedBlockProvider = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
|
|
500
|
+
return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
|
|
501
|
+
}, useMemoizedSyncedBlockProviderPatched, useMemoizedSyncedBlockProviderBase);
|
|
@@ -392,6 +392,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
392
392
|
value: function handleGraphQLSubscriptionUpdate(syncBlockInstance) {
|
|
393
393
|
var _this5 = this;
|
|
394
394
|
if (!syncBlockInstance.resourceId) {
|
|
395
|
+
if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_4')) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
395
398
|
throw new Error('Sync block instance provided to graphql subscription update missing resource id');
|
|
396
399
|
}
|
|
397
400
|
var existingSyncBlock = this.getFromCache(syncBlockInstance.resourceId);
|
|
@@ -858,17 +861,12 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
858
861
|
}, {
|
|
859
862
|
key: "debouncedBatchedFetchSyncBlocks",
|
|
860
863
|
value: function debouncedBatchedFetchSyncBlocks(resourceId) {
|
|
861
|
-
if
|
|
862
|
-
|
|
863
|
-
if (this.subscriptions.has(resourceId) && Object.keys(this.subscriptions.get(resourceId) || {}).length > 0) {
|
|
864
|
-
this.pendingFetchRequests.add(resourceId);
|
|
865
|
-
this.scheduledBatchFetch();
|
|
866
|
-
} else {
|
|
867
|
-
this.pendingFetchRequests.delete(resourceId);
|
|
868
|
-
}
|
|
869
|
-
} else {
|
|
864
|
+
// Only add to pending requests if there are active subscriptions for this resource
|
|
865
|
+
if (this.subscriptions.has(resourceId) && Object.keys(this.subscriptions.get(resourceId) || {}).length > 0) {
|
|
870
866
|
this.pendingFetchRequests.add(resourceId);
|
|
871
867
|
this.scheduledBatchFetch();
|
|
868
|
+
} else {
|
|
869
|
+
this.pendingFetchRequests.delete(resourceId);
|
|
872
870
|
}
|
|
873
871
|
}
|
|
874
872
|
}, {
|
|
@@ -1191,12 +1189,8 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1191
1189
|
}
|
|
1192
1190
|
return _context6.abrupt("return", true);
|
|
1193
1191
|
case 2:
|
|
1194
|
-
if (!(0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
|
|
1195
|
-
_context6.next = 9;
|
|
1196
|
-
break;
|
|
1197
|
-
}
|
|
1198
1192
|
if (!this.isFlushInProgress) {
|
|
1199
|
-
_context6.next =
|
|
1193
|
+
_context6.next = 7;
|
|
1200
1194
|
break;
|
|
1201
1195
|
}
|
|
1202
1196
|
// Mark that another flush is needed after the current one completes
|
|
@@ -1204,27 +1198,22 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1204
1198
|
|
|
1205
1199
|
// We return true here because we know the pending flush will handle the dirty cache
|
|
1206
1200
|
return _context6.abrupt("return", true);
|
|
1207
|
-
case
|
|
1201
|
+
case 7:
|
|
1208
1202
|
this.isFlushInProgress = true;
|
|
1209
|
-
case
|
|
1203
|
+
case 8:
|
|
1210
1204
|
success = true; // a copy of the subscriptions STRUCTURE (without the callbacks)
|
|
1211
1205
|
// To be saved as the last flushed structure if the flush is successful
|
|
1212
1206
|
syncedBlocksToFlush = {};
|
|
1213
|
-
_context6.prev =
|
|
1207
|
+
_context6.prev = 10;
|
|
1214
1208
|
if (this.dataProvider) {
|
|
1215
|
-
_context6.next =
|
|
1209
|
+
_context6.next = 13;
|
|
1216
1210
|
break;
|
|
1217
1211
|
}
|
|
1218
1212
|
throw new Error('Data provider not set');
|
|
1219
|
-
case
|
|
1220
|
-
blocks = [];
|
|
1221
|
-
if (!(0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
|
|
1222
|
-
_context6.next = 37;
|
|
1223
|
-
break;
|
|
1224
|
-
}
|
|
1225
|
-
// First, build the complete subscription structure
|
|
1213
|
+
case 13:
|
|
1214
|
+
blocks = []; // First, build the complete subscription structure
|
|
1226
1215
|
_iterator4 = _createForOfIteratorHelper(this.subscriptions.entries());
|
|
1227
|
-
_context6.prev =
|
|
1216
|
+
_context6.prev = 15;
|
|
1228
1217
|
_loop2 = /*#__PURE__*/_regenerator.default.mark(function _loop2() {
|
|
1229
1218
|
var _step4$value, resourceId, callbacks;
|
|
1230
1219
|
return _regenerator.default.wrap(function _loop2$(_context5) {
|
|
@@ -1246,50 +1235,34 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1246
1235
|
}, _loop2);
|
|
1247
1236
|
});
|
|
1248
1237
|
_iterator4.s();
|
|
1249
|
-
case
|
|
1238
|
+
case 18:
|
|
1250
1239
|
if ((_step4 = _iterator4.n()).done) {
|
|
1251
|
-
_context6.next =
|
|
1240
|
+
_context6.next = 22;
|
|
1252
1241
|
break;
|
|
1253
1242
|
}
|
|
1254
|
-
return _context6.delegateYield(_loop2(), "t0",
|
|
1243
|
+
return _context6.delegateYield(_loop2(), "t0", 20);
|
|
1244
|
+
case 20:
|
|
1245
|
+
_context6.next = 18;
|
|
1246
|
+
break;
|
|
1255
1247
|
case 22:
|
|
1256
|
-
_context6.next =
|
|
1248
|
+
_context6.next = 27;
|
|
1257
1249
|
break;
|
|
1258
1250
|
case 24:
|
|
1259
|
-
_context6.
|
|
1260
|
-
|
|
1261
|
-
case 26:
|
|
1262
|
-
_context6.prev = 26;
|
|
1263
|
-
_context6.t1 = _context6["catch"](17);
|
|
1251
|
+
_context6.prev = 24;
|
|
1252
|
+
_context6.t1 = _context6["catch"](15);
|
|
1264
1253
|
_iterator4.e(_context6.t1);
|
|
1265
|
-
case
|
|
1266
|
-
_context6.prev =
|
|
1254
|
+
case 27:
|
|
1255
|
+
_context6.prev = 27;
|
|
1267
1256
|
_iterator4.f();
|
|
1268
|
-
return _context6.finish(
|
|
1269
|
-
case
|
|
1257
|
+
return _context6.finish(27);
|
|
1258
|
+
case 30:
|
|
1270
1259
|
if (!(0, _isEqual.default)(syncedBlocksToFlush, this.lastFlushedSyncedBlocks)) {
|
|
1271
|
-
_context6.next =
|
|
1260
|
+
_context6.next = 33;
|
|
1272
1261
|
break;
|
|
1273
1262
|
}
|
|
1274
1263
|
this.isCacheDirty = false; // Reset since we're considering this a successful no-op flush
|
|
1275
1264
|
return _context6.abrupt("return", true);
|
|
1276
|
-
case
|
|
1277
|
-
_context6.next = 38;
|
|
1278
|
-
break;
|
|
1279
|
-
case 37:
|
|
1280
|
-
// Collect all reference synced blocks on the current document
|
|
1281
|
-
Array.from(this.subscriptions.entries()).forEach(function (_ref2) {
|
|
1282
|
-
var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
|
|
1283
|
-
resourceId = _ref3[0],
|
|
1284
|
-
callbacks = _ref3[1];
|
|
1285
|
-
Object.keys(callbacks).forEach(function (localId) {
|
|
1286
|
-
blocks.push({
|
|
1287
|
-
resourceId: resourceId,
|
|
1288
|
-
localId: localId
|
|
1289
|
-
});
|
|
1290
|
-
});
|
|
1291
|
-
});
|
|
1292
|
-
case 38:
|
|
1265
|
+
case 33:
|
|
1293
1266
|
// reset isCacheDirty early to prevent race condition
|
|
1294
1267
|
// There is a race condition where if a user makes changes (create/delete) to a reference sync block
|
|
1295
1268
|
// on a live page and the reference sync block is being saved while the user
|
|
@@ -1297,9 +1270,9 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1297
1270
|
// exactly at a time when the updateReferenceData is being executed asynchronously.
|
|
1298
1271
|
this.isCacheDirty = false;
|
|
1299
1272
|
(_this$saveExperience = this.saveExperience) === null || _this$saveExperience === void 0 || _this$saveExperience.start();
|
|
1300
|
-
_context6.next =
|
|
1273
|
+
_context6.next = 37;
|
|
1301
1274
|
return this.dataProvider.updateReferenceData(blocks);
|
|
1302
|
-
case
|
|
1275
|
+
case 37:
|
|
1303
1276
|
updateResult = _context6.sent;
|
|
1304
1277
|
if (!updateResult.success) {
|
|
1305
1278
|
success = false;
|
|
@@ -1308,11 +1281,11 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1308
1281
|
});
|
|
1309
1282
|
(_this$fireAnalyticsEv1 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv1 === void 0 || _this$fireAnalyticsEv1.call(this, (0, _errorHandling.updateReferenceErrorPayload)(updateResult.error || 'Failed to update reference synced blocks on the document'));
|
|
1310
1283
|
}
|
|
1311
|
-
_context6.next =
|
|
1284
|
+
_context6.next = 47;
|
|
1312
1285
|
break;
|
|
1313
|
-
case
|
|
1314
|
-
_context6.prev =
|
|
1315
|
-
_context6.t2 = _context6["catch"](
|
|
1286
|
+
case 41:
|
|
1287
|
+
_context6.prev = 41;
|
|
1288
|
+
_context6.t2 = _context6["catch"](10);
|
|
1316
1289
|
success = false;
|
|
1317
1290
|
(0, _monitoring.logException)(_context6.t2, {
|
|
1318
1291
|
location: 'editor-synced-block-provider/referenceSyncBlockStoreManager'
|
|
@@ -1321,40 +1294,37 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
1321
1294
|
reason: _context6.t2.message
|
|
1322
1295
|
});
|
|
1323
1296
|
(_this$fireAnalyticsEv10 = this.fireAnalyticsEvent) === null || _this$fireAnalyticsEv10 === void 0 || _this$fireAnalyticsEv10.call(this, (0, _errorHandling.updateReferenceErrorPayload)(_context6.t2.message));
|
|
1324
|
-
case
|
|
1325
|
-
_context6.prev =
|
|
1297
|
+
case 47:
|
|
1298
|
+
_context6.prev = 47;
|
|
1326
1299
|
if (!success) {
|
|
1327
1300
|
// set isCacheDirty back to true for cases where it failed to update the reference synced blocks on the BE
|
|
1328
1301
|
this.isCacheDirty = true;
|
|
1329
1302
|
} else {
|
|
1330
|
-
|
|
1331
|
-
this.lastFlushedSyncedBlocks = syncedBlocksToFlush;
|
|
1332
|
-
}
|
|
1303
|
+
this.lastFlushedSyncedBlocks = syncedBlocksToFlush;
|
|
1333
1304
|
(_this$saveExperience4 = this.saveExperience) === null || _this$saveExperience4 === void 0 || _this$saveExperience4.success();
|
|
1334
1305
|
}
|
|
1335
|
-
if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_2')) {
|
|
1336
|
-
// Always reset isFlushInProgress regardless of feature flag
|
|
1337
|
-
this.isFlushInProgress = false;
|
|
1338
1306
|
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1307
|
+
// Always reset isFlushInProgress
|
|
1308
|
+
this.isFlushInProgress = false;
|
|
1309
|
+
|
|
1310
|
+
// If another flush was requested while this one was in progress, execute it now
|
|
1311
|
+
if (this.flushNeededAfterCurrent) {
|
|
1312
|
+
this.flushNeededAfterCurrent = false;
|
|
1313
|
+
// Use setTimeout to avoid deep recursion and run queued flush asynchronously
|
|
1314
|
+
// Note: flush() handles all exceptions internally and never rejects
|
|
1315
|
+
this.queuedFlushTimeout = setTimeout(function () {
|
|
1316
|
+
_this11.queuedFlushTimeout = undefined;
|
|
1317
|
+
void _this11.flush();
|
|
1318
|
+
}, 0);
|
|
1349
1319
|
}
|
|
1350
|
-
return _context6.finish(
|
|
1351
|
-
case
|
|
1320
|
+
return _context6.finish(47);
|
|
1321
|
+
case 52:
|
|
1352
1322
|
return _context6.abrupt("return", success);
|
|
1353
|
-
case
|
|
1323
|
+
case 53:
|
|
1354
1324
|
case "end":
|
|
1355
1325
|
return _context6.stop();
|
|
1356
1326
|
}
|
|
1357
|
-
}, _callee4, this, [[
|
|
1327
|
+
}, _callee4, this, [[10, 41, 47, 52], [15, 24, 27, 30]]);
|
|
1358
1328
|
}));
|
|
1359
1329
|
function flush() {
|
|
1360
1330
|
return _flush.apply(this, arguments);
|
|
@@ -12,6 +12,8 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
|
|
|
12
12
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
13
|
var _react = require("react");
|
|
14
14
|
var _monitoring = require("@atlaskit/editor-common/monitoring");
|
|
15
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
16
|
+
var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
|
|
15
17
|
var _ari = require("../clients/block-service/ari");
|
|
16
18
|
var _types = require("../common/types");
|
|
17
19
|
var _errorHandling = require("../utils/errorHandling");
|
|
@@ -28,7 +30,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
28
30
|
var SyncBlockStoreManager = exports.SyncBlockStoreManager = /*#__PURE__*/function () {
|
|
29
31
|
function SyncBlockStoreManager(dataProvider) {
|
|
30
32
|
(0, _classCallCheck2.default)(this, SyncBlockStoreManager);
|
|
31
|
-
// In future, if reference manager needs to reach to source manager and read
|
|
33
|
+
// In future, if reference manager needs to reach to source manager and read its current in memory cache
|
|
32
34
|
// we can pass the source manager as a parameter to the reference manager constructor
|
|
33
35
|
this.sourceSyncBlockStoreManager = new _sourceSyncBlockStoreManager.SourceSyncBlockStoreManager(dataProvider);
|
|
34
36
|
this.referenceSyncBlockStoreManager = new _referenceSyncBlockStoreManager.ReferenceSyncBlockStoreManager(dataProvider);
|
|
@@ -200,11 +202,24 @@ var SyncBlockStoreManager = exports.SyncBlockStoreManager = /*#__PURE__*/functio
|
|
|
200
202
|
var createSyncBlockStoreManager = function createSyncBlockStoreManager(dataProvider) {
|
|
201
203
|
return new SyncBlockStoreManager(dataProvider);
|
|
202
204
|
};
|
|
203
|
-
var
|
|
205
|
+
var useMemoizedSyncBlockStoreManagerBase = function useMemoizedSyncBlockStoreManagerBase(dataProvider, fireAnalyticsEvent) {
|
|
204
206
|
var syncBlockStoreManager = (0, _react.useMemo)(function () {
|
|
205
|
-
|
|
206
|
-
return syncBlockStoreManager;
|
|
207
|
+
return createSyncBlockStoreManager(dataProvider);
|
|
207
208
|
}, [dataProvider]);
|
|
208
209
|
syncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
|
|
209
210
|
return syncBlockStoreManager;
|
|
210
|
-
};
|
|
211
|
+
};
|
|
212
|
+
var useMemoizedSyncBlockStoreManagerPatched = function useMemoizedSyncBlockStoreManagerPatched(dataProvider, fireAnalyticsEvent) {
|
|
213
|
+
var syncBlockStoreManager = (0, _react.useMemo)(function () {
|
|
214
|
+
return createSyncBlockStoreManager(dataProvider);
|
|
215
|
+
}, [dataProvider]);
|
|
216
|
+
var prevFireAnalyticsEventRef = (0, _react.useRef)(undefined);
|
|
217
|
+
if (fireAnalyticsEvent !== prevFireAnalyticsEventRef.current) {
|
|
218
|
+
prevFireAnalyticsEventRef.current = fireAnalyticsEvent;
|
|
219
|
+
syncBlockStoreManager.setFireAnalyticsEvent(fireAnalyticsEvent);
|
|
220
|
+
}
|
|
221
|
+
return syncBlockStoreManager;
|
|
222
|
+
};
|
|
223
|
+
var useMemoizedSyncBlockStoreManager = exports.useMemoizedSyncBlockStoreManager = (0, _platformFeatureFlagsReact.conditionalHooksFactory)(function () {
|
|
224
|
+
return (0, _platformFeatureFlags.fg)('platform_synced_block_patch_4');
|
|
225
|
+
}, useMemoizedSyncBlockStoreManagerPatched, useMemoizedSyncBlockStoreManagerBase);
|
|
@@ -87,9 +87,9 @@ var getFetchSourceInfoExperience = exports.getFetchSourceInfoExperience = functi
|
|
|
87
87
|
/**
|
|
88
88
|
* This experience tracks when a source sync block is deleted from the BE.
|
|
89
89
|
*
|
|
90
|
-
* Start: When the
|
|
91
|
-
* Success: When the
|
|
92
|
-
* Failure: When the timeout duration passes without the
|
|
90
|
+
* Start: When the delete source sync block function is called.
|
|
91
|
+
* Success: When the sync block deletion is successful within the timeout duration of start.
|
|
92
|
+
* Failure: When the timeout duration passes without the sync block being successfully deleted, or the deletion fails
|
|
93
93
|
*/
|
|
94
94
|
var getDeleteSourceExperience = exports.getDeleteSourceExperience = function getDeleteSourceExperience(fireAnalyticsEvent) {
|
|
95
95
|
return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
|
|
@@ -104,9 +104,9 @@ var getDeleteSourceExperience = exports.getDeleteSourceExperience = function get
|
|
|
104
104
|
/**
|
|
105
105
|
* This experience tracks when a source sync block is created and registered to the BE.
|
|
106
106
|
*
|
|
107
|
-
* Start: When the
|
|
108
|
-
* Success: When the
|
|
109
|
-
* Failure: When the timeout duration passes without the
|
|
107
|
+
* Start: When the create source sync block function is called.
|
|
108
|
+
* Success: When the sync block creation is successful within the timeout duration of start.
|
|
109
|
+
* Failure: When the timeout duration passes without the sync block being successfully created, or the creation fails
|
|
110
110
|
*/
|
|
111
111
|
var getCreateSourceExperience = exports.getCreateSourceExperience = function getCreateSourceExperience(fireAnalyticsEvent) {
|
|
112
112
|
return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
|
|
@@ -119,11 +119,11 @@ var getCreateSourceExperience = exports.getCreateSourceExperience = function get
|
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
* This experience tracks when a
|
|
122
|
+
* This experience tracks when references for a sync block are fetched from the BE.
|
|
123
123
|
*
|
|
124
|
-
* Start: When the
|
|
125
|
-
* Success: When the fetching
|
|
126
|
-
* Failure: When the timeout duration passes without
|
|
124
|
+
* Start: When the fetchReferences function is called.
|
|
125
|
+
* Success: When the fetching of references is successful within the timeout duration of start.
|
|
126
|
+
* Failure: When the timeout duration passes without references being successfully fetched, or the fetch fails
|
|
127
127
|
*/
|
|
128
128
|
var getFetchReferencesExperience = exports.getFetchReferencesExperience = function getFetchReferencesExperience(fireAnalyticsEvent) {
|
|
129
129
|
return new _experiences.Experience(_experiences.EXPERIENCE_ID.ASYNC_OPERATION, {
|
|
@@ -19,7 +19,7 @@ var isSyncBlockProduct = function isSyncBlockProduct(product) {
|
|
|
19
19
|
*
|
|
20
20
|
* Format
|
|
21
21
|
* - {product}/{contentId}/{uuid}
|
|
22
|
-
* - product: a recognized `SyncBlockProduct` (e.g. 'confluence-page', 'jira-
|
|
22
|
+
* - product: a recognized `SyncBlockProduct` (e.g. 'confluence-page', 'jira-work-item')
|
|
23
23
|
* - contentId: the host content identifier (e.g. page ID or issue ID)
|
|
24
24
|
* - uuid: the UUID for the specific synced block instance
|
|
25
25
|
*
|
|
@@ -32,7 +32,7 @@ var isSyncBlockProduct = function isSyncBlockProduct(product) {
|
|
|
32
32
|
* - No extra segments; returns `undefined` on any invalid input
|
|
33
33
|
*
|
|
34
34
|
* Notes
|
|
35
|
-
* - `product` is a qualified domain like 'confluence-page' or 'jira-
|
|
35
|
+
* - `product` is a qualified domain like 'confluence-page' or 'jira-work-item',
|
|
36
36
|
* not just 'confluence' or 'jira'.
|
|
37
37
|
*/
|
|
38
38
|
|