@atlaskit/editor-plugin-synced-block 5.1.9 → 5.1.11

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 (61) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/editor-commands/index.js +2 -2
  3. package/dist/cjs/nodeviews/bodiedSyncedBlock.js +13 -2
  4. package/dist/cjs/nodeviews/syncedBlock.js +21 -2
  5. package/dist/cjs/pm-plugins/experience-tracking/create-reference-experience.js +26 -26
  6. package/dist/cjs/pm-plugins/experience-tracking/create-source-experience.js +14 -30
  7. package/dist/cjs/pm-plugins/experience-tracking/delete-reference-experience.js +175 -0
  8. package/dist/cjs/pm-plugins/experience-tracking/delete-source-experience.js +103 -0
  9. package/dist/cjs/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +30 -0
  10. package/dist/cjs/pm-plugins/experience-tracking/provider-only-experiences.js +128 -0
  11. package/dist/cjs/pm-plugins/utils/experience-tracking-utils.js +85 -0
  12. package/dist/cjs/types/index.js +5 -2
  13. package/dist/cjs/ui/CreateSyncedBlockDropdownItem.js +40 -8
  14. package/dist/cjs/ui/DeleteConfirmationModal.js +3 -1
  15. package/dist/cjs/ui/floating-toolbar.js +4 -2
  16. package/dist/es2019/editor-commands/index.js +2 -2
  17. package/dist/es2019/nodeviews/bodiedSyncedBlock.js +13 -2
  18. package/dist/es2019/nodeviews/syncedBlock.js +19 -4
  19. package/dist/es2019/pm-plugins/experience-tracking/create-reference-experience.js +27 -23
  20. package/dist/es2019/pm-plugins/experience-tracking/create-source-experience.js +14 -27
  21. package/dist/es2019/pm-plugins/experience-tracking/delete-reference-experience.js +181 -0
  22. package/dist/es2019/pm-plugins/experience-tracking/delete-source-experience.js +98 -0
  23. package/dist/es2019/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +24 -0
  24. package/dist/es2019/pm-plugins/experience-tracking/provider-only-experiences.js +127 -0
  25. package/dist/es2019/pm-plugins/utils/experience-tracking-utils.js +65 -0
  26. package/dist/es2019/types/index.js +4 -1
  27. package/dist/es2019/ui/CreateSyncedBlockDropdownItem.js +38 -3
  28. package/dist/es2019/ui/DeleteConfirmationModal.js +3 -1
  29. package/dist/es2019/ui/floating-toolbar.js +3 -1
  30. package/dist/esm/editor-commands/index.js +2 -2
  31. package/dist/esm/nodeviews/bodiedSyncedBlock.js +13 -2
  32. package/dist/esm/nodeviews/syncedBlock.js +21 -2
  33. package/dist/esm/pm-plugins/experience-tracking/create-reference-experience.js +26 -25
  34. package/dist/esm/pm-plugins/experience-tracking/create-source-experience.js +14 -29
  35. package/dist/esm/pm-plugins/experience-tracking/delete-reference-experience.js +169 -0
  36. package/dist/esm/pm-plugins/experience-tracking/delete-source-experience.js +97 -0
  37. package/dist/esm/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +30 -0
  38. package/dist/esm/pm-plugins/experience-tracking/provider-only-experiences.js +122 -0
  39. package/dist/esm/pm-plugins/utils/experience-tracking-utils.js +79 -0
  40. package/dist/esm/types/index.js +4 -1
  41. package/dist/esm/ui/CreateSyncedBlockDropdownItem.js +40 -8
  42. package/dist/esm/ui/DeleteConfirmationModal.js +3 -1
  43. package/dist/esm/ui/floating-toolbar.js +4 -2
  44. package/dist/types/pm-plugins/experience-tracking/create-reference-experience.d.ts +2 -9
  45. package/dist/types/pm-plugins/experience-tracking/create-source-experience.d.ts +4 -15
  46. package/dist/types/pm-plugins/experience-tracking/delete-reference-experience.d.ts +13 -0
  47. package/dist/types/pm-plugins/experience-tracking/delete-source-experience.d.ts +12 -0
  48. package/dist/types/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +2 -13
  49. package/dist/types/pm-plugins/experience-tracking/provider-only-experiences.d.ts +3 -0
  50. package/dist/types/pm-plugins/utils/experience-tracking-utils.d.ts +9 -0
  51. package/dist/types/types/index.d.ts +15 -0
  52. package/dist/types-ts4.5/pm-plugins/experience-tracking/create-reference-experience.d.ts +2 -9
  53. package/dist/types-ts4.5/pm-plugins/experience-tracking/create-source-experience.d.ts +4 -15
  54. package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-reference-experience.d.ts +13 -0
  55. package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-source-experience.d.ts +12 -0
  56. package/dist/types-ts4.5/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +2 -13
  57. package/dist/types-ts4.5/pm-plugins/experience-tracking/provider-only-experiences.d.ts +3 -0
  58. package/dist/types-ts4.5/pm-plugins/utils/experience-tracking-utils.d.ts +9 -0
  59. package/dist/types-ts4.5/types/index.d.ts +15 -0
  60. package/package.json +5 -5
  61. package/build/tsconfig.json +0 -22
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @atlaskit/editor-plugin-synced-block
2
2
 
3
+ ## 5.1.11
4
+
5
+ ### Patch Changes
6
+
7
+ - [`1f4c761b661e1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1f4c761b661e1) -
8
+ [ux] EDITOR-4174 wrap synced block and bodied sync block with sentry error boundaries
9
+ - Updated dependencies
10
+
11
+ ## 5.1.10
12
+
13
+ ### Patch Changes
14
+
15
+ - [`c975226c67ed8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/c975226c67ed8) -
16
+ [ux] [EDITOR-4472] Update tooltip copy for copy sync block button
17
+ - [`98a4415c99228`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/98a4415c99228) -
18
+ [ux] Set selection to the start of the previous selection when creating new synced block
19
+ - [`fff45a651440a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fff45a651440a) -
20
+ EDITOR-1665 add experience tracking analytics for sync block save, fetch and delete
21
+ - [`e3856219900ac`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e3856219900ac) -
22
+ Revert removal of 'copy synced block' from block menu
23
+ - Updated dependencies
24
+
3
25
  ## 5.1.9
4
26
 
5
27
  ### Patch Changes
@@ -59,8 +59,8 @@ var createSyncedBlock = exports.createSyncedBlock = function createSyncedBlock(_
59
59
  syncBlockStore.sourceManager.createBodiedSyncBlockNode(_attrs);
60
60
  tr.replaceWith(conversionInfo.from > 0 ? conversionInfo.from - 1 : 0, conversionInfo.to, _newBodiedSyncBlockNode).scrollIntoView();
61
61
 
62
- // set selection to the end of the previous selection + 1 for the position taken up by the start of the new synced block
63
- tr.setSelection(_state.TextSelection.create(tr.doc, conversionInfo.to + 1));
62
+ // set selection to the start of the previous selection for the position taken up by the start of the new synced block
63
+ tr.setSelection(_state.TextSelection.create(tr.doc, conversionInfo.from));
64
64
  }
65
65
 
66
66
  // This transaction will be intercepted in filterTransaction and dispatched when saving to backend succeeds
@@ -11,10 +11,13 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
11
11
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
12
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
13
  var _react = _interopRequireDefault(require("react"));
14
+ var _analytics = require("@atlaskit/editor-common/analytics");
15
+ var _errorBoundary = require("@atlaskit/editor-common/error-boundary");
14
16
  var _reactNodeView = _interopRequireDefault(require("@atlaskit/editor-common/react-node-view"));
15
17
  var _syncBlock = require("@atlaskit/editor-common/sync-block");
16
18
  var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
17
19
  var _model = require("@atlaskit/editor-prosemirror/model");
20
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
21
  var _BodiedSyncBlockWrapper = require("../ui/BodiedSyncBlockWrapper");
19
22
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
20
23
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
@@ -89,12 +92,20 @@ var BodiedSyncBlock = /*#__PURE__*/function (_ReactNodeView) {
89
92
  }, {
90
93
  key: "render",
91
94
  value: function render(_props, forwardRef) {
92
- var _this$api5;
95
+ var _this$api5, _this$api6;
93
96
  var syncBlockStore = (_this$api5 = this.api) === null || _this$api5 === void 0 || (_this$api5 = _this$api5.syncedBlock.sharedState) === null || _this$api5 === void 0 || (_this$api5 = _this$api5.currentState()) === null || _this$api5 === void 0 ? void 0 : _this$api5.syncBlockStore;
94
97
  if (!syncBlockStore) {
95
98
  return null;
96
99
  }
97
- return /*#__PURE__*/_react.default.createElement(_BodiedSyncBlockWrapper.BodiedSyncBlockWrapper, {
100
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? /*#__PURE__*/_react.default.createElement(_errorBoundary.ErrorBoundary, {
101
+ component: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
102
+ dispatchAnalyticsEvent: (_this$api6 = this.api) === null || _this$api6 === void 0 || (_this$api6 = _this$api6.analytics) === null || _this$api6 === void 0 ? void 0 : _this$api6.actions.fireAnalyticsEvent,
103
+ fallbackComponent: null
104
+ }, /*#__PURE__*/_react.default.createElement(_BodiedSyncBlockWrapper.BodiedSyncBlockWrapper, {
105
+ ref: forwardRef,
106
+ syncBlockStore: syncBlockStore,
107
+ node: this.node
108
+ })) : /*#__PURE__*/_react.default.createElement(_BodiedSyncBlockWrapper.BodiedSyncBlockWrapper, {
98
109
  ref: forwardRef,
99
110
  syncBlockStore: syncBlockStore,
100
111
  node: this.node
@@ -12,6 +12,8 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
12
12
  var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
13
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
14
  var _react = _interopRequireDefault(require("react"));
15
+ var _analytics = require("@atlaskit/editor-common/analytics");
16
+ var _errorBoundary = require("@atlaskit/editor-common/error-boundary");
15
17
  var _reactNodeView = _interopRequireDefault(require("@atlaskit/editor-common/react-node-view"));
16
18
  var _syncBlock = require("@atlaskit/editor-common/sync-block");
17
19
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
@@ -44,8 +46,10 @@ var SyncBlock = exports.SyncBlock = /*#__PURE__*/function (_ReactNodeView) {
44
46
  var _this$options,
45
47
  _this$api$syncedBlock,
46
48
  _this$api,
49
+ _this$api2,
47
50
  _this$options2,
48
- _this2 = this;
51
+ _this2 = this,
52
+ _this$options3;
49
53
  if (!((_this$options = this.options) !== null && _this$options !== void 0 && _this$options.syncedBlockRenderer)) {
50
54
  return null;
51
55
  }
@@ -62,7 +66,11 @@ var SyncBlock = exports.SyncBlock = /*#__PURE__*/function (_ReactNodeView) {
62
66
  }
63
67
 
64
68
  // get document node from data provider
65
- return /*#__PURE__*/_react.default.createElement(_SyncBlockRendererWrapper.SyncBlockRendererWrapper, {
69
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? /*#__PURE__*/_react.default.createElement(_errorBoundary.ErrorBoundary, {
70
+ component: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
71
+ dispatchAnalyticsEvent: (_this$api2 = this.api) === null || _this$api2 === void 0 || (_this$api2 = _this$api2.analytics) === null || _this$api2 === void 0 ? void 0 : _this$api2.actions.fireAnalyticsEvent,
72
+ fallbackComponent: null
73
+ }, /*#__PURE__*/_react.default.createElement(_SyncBlockRendererWrapper.SyncBlockRendererWrapper, {
66
74
  localId: this.node.attrs.localId,
67
75
  syncedBlockRenderer: (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.syncedBlockRenderer,
68
76
  useFetchSyncBlockTitle: function useFetchSyncBlockTitle() {
@@ -73,6 +81,17 @@ var SyncBlock = exports.SyncBlock = /*#__PURE__*/function (_ReactNodeView) {
73
81
  return (0, _editorSyncedBlockProvider.useFetchSyncBlockData)(syncBlockStore, resourceId, localId, (_this2$api = _this2.api) === null || _this2$api === void 0 || (_this2$api = _this2$api.analytics) === null || _this2$api === void 0 || (_this2$api = _this2$api.actions) === null || _this2$api === void 0 ? void 0 : _this2$api.fireAnalyticsEvent);
74
82
  },
75
83
  api: this.api
84
+ })) : /*#__PURE__*/_react.default.createElement(_SyncBlockRendererWrapper.SyncBlockRendererWrapper, {
85
+ localId: this.node.attrs.localId,
86
+ syncedBlockRenderer: (_this$options3 = this.options) === null || _this$options3 === void 0 ? void 0 : _this$options3.syncedBlockRenderer,
87
+ useFetchSyncBlockTitle: function useFetchSyncBlockTitle() {
88
+ return (0, _editorSyncedBlockProvider.useFetchSyncBlockTitle)(syncBlockStore, _this2.node);
89
+ },
90
+ useFetchSyncBlockData: function useFetchSyncBlockData() {
91
+ var _this2$api2;
92
+ return (0, _editorSyncedBlockProvider.useFetchSyncBlockData)(syncBlockStore, resourceId, localId, (_this2$api2 = _this2.api) === null || _this2$api2 === void 0 || (_this2$api2 = _this2$api2.analytics) === null || _this2$api2 === void 0 || (_this2$api2 = _this2$api2.actions) === null || _this2$api2 === void 0 ? void 0 : _this2$api2.fireAnalyticsEvent);
93
+ },
94
+ api: this.api
76
95
  });
77
96
  }
78
97
  }, {
@@ -1,24 +1,23 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.getCreateReferenceExperiencePlugin = void 0;
8
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
7
  var _analytics = require("@atlaskit/editor-common/analytics");
10
8
  var _experiences = require("@atlaskit/editor-common/experiences");
11
9
  var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
12
10
  var _state = require("@atlaskit/editor-prosemirror/state");
11
+ var _types = require("../../types");
12
+ var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
13
13
  var isPastedFromFabricEditor = function isPastedFromFabricEditor(html) {
14
14
  return !!html && html.indexOf('data-pm-slice="') >= 0;
15
15
  };
16
16
  var pluginKey = new _state.PluginKey('createReferenceSyncBlockExperience');
17
17
  var START_METHOD = {
18
- PASTE: 'paste'
19
- };
20
- var ABORT_REASON = {
21
- EDITOR_DESTROYED: 'editor-destroyed'
18
+ PASTE: 'paste',
19
+ UNDO: 'undo',
20
+ REDO: 'redo'
22
21
  };
23
22
 
24
23
  /**
@@ -41,7 +40,7 @@ var getCreateReferenceExperiencePlugin = exports.getCreateReferenceExperiencePlu
41
40
  return {
42
41
  destroy: function destroy() {
43
42
  experience.abort({
44
- reason: ABORT_REASON.EDITOR_DESTROYED
43
+ reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
45
44
  });
46
45
  }
47
46
  };
@@ -63,6 +62,19 @@ var getCreateReferenceExperiencePlugin = exports.getCreateReferenceExperiencePlu
63
62
  });
64
63
  }
65
64
  }
65
+ },
66
+ appendTransaction: function appendTransaction(transactions, oldState, newState) {
67
+ transactions.forEach(function (tr) {
68
+ var _wasSyncBlockDeletedO = (0, _experienceTrackingUtils.wasSyncBlockDeletedOrAddedByHistory)(tr, oldState, newState),
69
+ hasAddedSyncBlock = _wasSyncBlockDeletedO.hasAddedSyncBlock,
70
+ isUndo = _wasSyncBlockDeletedO.isUndo;
71
+ if (hasAddedSyncBlock) {
72
+ experience.start({
73
+ method: isUndo ? START_METHOD.UNDO : START_METHOD.REDO
74
+ });
75
+ }
76
+ });
77
+ return null;
66
78
  }
67
79
  });
68
80
  };
@@ -77,21 +89,20 @@ var getCreateReferenceExperience = function getCreateReferenceExperience(_ref2)
77
89
  }), new _experiences.ExperienceCheckDomMutation({
78
90
  onDomMutation: function onDomMutation(_ref3) {
79
91
  var mutations = _ref3.mutations;
80
- if (mutations.some(isReferenceSyncBlockAddedInMutation)) {
92
+ var insertedResourceIds = (0, _experienceTrackingUtils.getAddedResourceIds)(mutations, '[data-prosemirror-node-name="syncBlock"]');
93
+ if (insertedResourceIds.length > 0) {
81
94
  return {
82
- status: 'success'
95
+ status: 'success',
96
+ metadata: {
97
+ insertedResourceIds: insertedResourceIds
98
+ }
83
99
  };
84
100
  }
85
101
  return undefined;
86
102
  },
87
103
  observeConfig: function observeConfig() {
88
- var _refs$containerElemen;
89
- var proseMirrorElement = (_refs$containerElemen = refs.containerElement) === null || _refs$containerElemen === void 0 ? void 0 : _refs$containerElemen.querySelector('.ProseMirror');
90
- if (!proseMirrorElement || !(proseMirrorElement instanceof HTMLElement)) {
91
- return null;
92
- }
93
104
  return {
94
- target: proseMirrorElement,
105
+ target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
95
106
  options: {
96
107
  childList: true
97
108
  }
@@ -99,15 +110,4 @@ var getCreateReferenceExperience = function getCreateReferenceExperience(_ref2)
99
110
  }
100
111
  })]
101
112
  });
102
- };
103
- var isReferenceSyncBlockAddedInMutation = function isReferenceSyncBlockAddedInMutation(_ref4) {
104
- var type = _ref4.type,
105
- addedNodes = _ref4.addedNodes;
106
- return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isReferenceSyncBlockNode);
107
- };
108
- var isReferenceSyncBlockNode = function isReferenceSyncBlockNode(node) {
109
- if (!(node instanceof HTMLElement)) {
110
- return false;
111
- }
112
- return !!node.querySelector('[data-prosemirror-node-name="syncBlock"]');
113
113
  };
@@ -1,20 +1,17 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.getCreateSourceExperiencePlugin = void 0;
8
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
7
  var _bindEventListener = require("bind-event-listener");
10
8
  var _analytics = require("@atlaskit/editor-common/analytics");
11
9
  var _experiences = require("@atlaskit/editor-common/experiences");
12
10
  var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
13
11
  var _state = require("@atlaskit/editor-prosemirror/state");
12
+ var _types = require("../../types");
13
+ var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
14
14
  var pluginKey = new _state.PluginKey('createSourceSyncBlockExperience');
15
- var ABORT_REASON = {
16
- EDITOR_DESTROYED: 'editor-destroyed'
17
- };
18
15
  var START_METHOD = {
19
16
  BLOCK_MENU: 'block-menu',
20
17
  PINNED_TOOLBAR: 'pinned-toolbar',
@@ -27,8 +24,8 @@ var syncedBlockCreateButtonIds = new Set(SYNCED_BLOCK_CREATE_BUTTON_IDS);
27
24
  * This experience tracks when a source sync block is inserted.
28
25
  *
29
26
  * Start: When user inserts a sync block via block menu, quick insert or pinned toolbar
30
- * Success: When the sync block is added to the DOM within 2000ms of start
31
- * Failure: When 500ms passes without the source sync block being added to the DOM
27
+ * Success: When the sync block is added to the DOM within 3000ms of start
28
+ * Failure: When 3000ms passes without the source sync block being added to the DOM
32
29
  */
33
30
  var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin = function getCreateSourceExperiencePlugin(_ref) {
34
31
  var refs = _ref.refs,
@@ -44,8 +41,7 @@ var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin =
44
41
  };
45
42
  var experience = getCreateSourceExperience({
46
43
  refs: refs,
47
- dispatchAnalyticsEvent: dispatchAnalyticsEvent,
48
- syncBlockStore: syncBlockStore
44
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
49
45
  });
50
46
  syncBlockStore.sourceManager.setCreateExperience(experience);
51
47
  var unbindClickListener = (0, _bindEventListener.bind)(document, {
@@ -97,7 +93,7 @@ var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin =
97
93
  return {
98
94
  destroy: function destroy() {
99
95
  experience.abort({
100
- reason: ABORT_REASON.EDITOR_DESTROYED
96
+ reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
101
97
  });
102
98
  unbindClickListener();
103
99
  unbindKeydownListener();
@@ -113,25 +109,24 @@ var getCreateSourceExperience = function getCreateSourceExperience(_ref2) {
113
109
  actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_CREATE,
114
110
  dispatchAnalyticsEvent: dispatchAnalyticsEvent,
115
111
  checks: [new _experiences.ExperienceCheckTimeout({
116
- durationMs: 2000
112
+ durationMs: 3000
117
113
  }), new _experiences.ExperienceCheckDomMutation({
118
114
  onDomMutation: function onDomMutation(_ref3) {
119
115
  var mutations = _ref3.mutations;
120
- if (mutations.some(isSourceSyncBlockAddedInMutation)) {
116
+ var createdResourceIds = (0, _experienceTrackingUtils.getAddedResourceIds)(mutations, '[data-prosemirror-node-name="bodiedSyncBlock"]');
117
+ if (createdResourceIds.length > 0) {
121
118
  return {
122
- status: 'success'
119
+ status: 'success',
120
+ metadata: {
121
+ createdResourceIds: createdResourceIds
122
+ }
123
123
  };
124
124
  }
125
125
  return undefined;
126
126
  },
127
127
  observeConfig: function observeConfig() {
128
- var _refs$containerElemen;
129
- var proseMirrorElement = (_refs$containerElemen = refs.containerElement) === null || _refs$containerElemen === void 0 ? void 0 : _refs$containerElemen.querySelector('.ProseMirror');
130
- if (!proseMirrorElement || !(proseMirrorElement instanceof HTMLElement)) {
131
- return null;
132
- }
133
128
  return {
134
- target: proseMirrorElement,
129
+ target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
135
130
  options: {
136
131
  childList: true
137
132
  }
@@ -171,15 +166,4 @@ var handleButtonClick = function handleButtonClick(testId, experience) {
171
166
  };
172
167
  var isEnterKey = function isEnterKey(key) {
173
168
  return key === 'Enter';
174
- };
175
- var isSourceSyncBlockAddedInMutation = function isSourceSyncBlockAddedInMutation(_ref4) {
176
- var type = _ref4.type,
177
- addedNodes = _ref4.addedNodes;
178
- return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isSourceSyncBlockNode);
179
- };
180
- var isSourceSyncBlockNode = function isSourceSyncBlockNode(node) {
181
- if (!(node instanceof HTMLElement)) {
182
- return false;
183
- }
184
- return !!node.querySelector('[data-prosemirror-node-name="bodiedSyncBlock"]');
185
169
  };
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getDeleteReferenceExperiencePlugin = exports.getDeleteReferenceExperience = void 0;
7
+ var _bindEventListener = require("bind-event-listener");
8
+ var _analytics = require("@atlaskit/editor-common/analytics");
9
+ var _experiences = require("@atlaskit/editor-common/experiences");
10
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
11
+ var _state = require("@atlaskit/editor-prosemirror/state");
12
+ var _types = require("../../types");
13
+ var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
14
+ var pluginKey = new _state.PluginKey('deleteReferenceSyncBlockExperience');
15
+ var START_METHOD = {
16
+ ELEMENT_TOOLBAR: 'element-toolbar',
17
+ DELETE: 'delete',
18
+ TYPED_OVER: 'typed-over',
19
+ CUT: 'cut',
20
+ UNDO: 'undo',
21
+ REDO: 'redo'
22
+ };
23
+
24
+ /**
25
+ * This experience tracks when a reference sync block is deleted.
26
+ *
27
+ * Start: When user deletes ref sync block from toolbar, presses delete when cursor is in front of ref sync block,
28
+ * presses any key with a ref sync block selected, cuts with a ref sync block selected, triggers undo/redo that deletes a ref sync block
29
+ * Success: When the sync block is removed from the DOM within 2000ms of start
30
+ * Failure: When 2000ms passes without the reference sync block being removed from the DOM
31
+ */
32
+ var getDeleteReferenceExperiencePlugin = exports.getDeleteReferenceExperiencePlugin = function getDeleteReferenceExperiencePlugin(_ref) {
33
+ var refs = _ref.refs,
34
+ dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
35
+ syncBlockStore = _ref.syncBlockStore;
36
+ var experience = getDeleteReferenceExperience({
37
+ refs: refs,
38
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
39
+ });
40
+ syncBlockStore.sourceManager.setDeleteExperience(experience);
41
+ var unbindClickListener = (0, _bindEventListener.bind)(document, {
42
+ type: 'click',
43
+ listener: function listener(event) {
44
+ var target = event.target;
45
+ if (!target) {
46
+ return;
47
+ }
48
+ var button = target.closest('button[data-testid]');
49
+ if (!button || !(button instanceof HTMLButtonElement)) {
50
+ return;
51
+ }
52
+ var testId = button.dataset.testid;
53
+ if (isReferenceSyncedBlockDeleteButtonId(testId)) {
54
+ experience.start({
55
+ method: START_METHOD.ELEMENT_TOOLBAR
56
+ });
57
+ }
58
+ }
59
+ });
60
+ return new _safePlugin.SafePlugin({
61
+ key: pluginKey,
62
+ props: {
63
+ handleDOMEvents: {
64
+ cut: function cut(view) {
65
+ var state = view.state;
66
+ if (hasSyncBlockInSelection(state.selection)) {
67
+ experience.start({
68
+ method: START_METHOD.CUT
69
+ });
70
+ }
71
+ return false;
72
+ },
73
+ keydown: function keydown(view, event) {
74
+ var state = view.state;
75
+ var hasSelection = hasSyncBlockInSelection(state.selection);
76
+ var hasAdjacent = hasSyncBlockBeforeCursor(state.selection);
77
+ if (hasSelection) {
78
+ experience.start({
79
+ method: START_METHOD.TYPED_OVER
80
+ });
81
+ }
82
+ if (isDeleteKey(event.key) && hasAdjacent) {
83
+ experience.start({
84
+ method: START_METHOD.DELETE
85
+ });
86
+ }
87
+ return false;
88
+ }
89
+ }
90
+ },
91
+ appendTransaction: function appendTransaction(transactions, oldState, newState) {
92
+ transactions.forEach(function (tr) {
93
+ var _wasSyncBlockDeletedO = (0, _experienceTrackingUtils.wasSyncBlockDeletedOrAddedByHistory)(tr, oldState, newState),
94
+ hasDeletedSyncBlock = _wasSyncBlockDeletedO.hasDeletedSyncBlock,
95
+ isUndo = _wasSyncBlockDeletedO.isUndo;
96
+ if (hasDeletedSyncBlock) {
97
+ experience.start({
98
+ method: isUndo ? START_METHOD.UNDO : START_METHOD.REDO
99
+ });
100
+ }
101
+ });
102
+ return null;
103
+ },
104
+ view: function view() {
105
+ return {
106
+ destroy: function destroy() {
107
+ experience.abort({
108
+ reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
109
+ });
110
+ unbindClickListener();
111
+ }
112
+ };
113
+ }
114
+ });
115
+ };
116
+ var getDeleteReferenceExperience = exports.getDeleteReferenceExperience = function getDeleteReferenceExperience(_ref2) {
117
+ var refs = _ref2.refs,
118
+ dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
119
+ return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
120
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_DELETE,
121
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
122
+ checks: [new _experiences.ExperienceCheckTimeout({
123
+ durationMs: 2000
124
+ }), new _experiences.ExperienceCheckDomMutation({
125
+ onDomMutation: function onDomMutation(_ref3) {
126
+ var mutations = _ref3.mutations;
127
+ var deletedResourceIds = (0, _experienceTrackingUtils.getRemovedResourceIds)(mutations, '[data-prosemirror-node-name="syncBlock"]');
128
+ if (deletedResourceIds.length > 0) {
129
+ return {
130
+ status: 'success',
131
+ metadata: {
132
+ deletedResourceIds: deletedResourceIds
133
+ }
134
+ };
135
+ }
136
+ return undefined;
137
+ },
138
+ observeConfig: function observeConfig() {
139
+ return {
140
+ target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
141
+ options: {
142
+ childList: true
143
+ }
144
+ };
145
+ }
146
+ })]
147
+ });
148
+ };
149
+ var isReferenceSyncedBlockDeleteButtonId = function isReferenceSyncedBlockDeleteButtonId(testId) {
150
+ return testId === 'reference-synced-block-delete-button';
151
+ };
152
+ var isDeleteKey = function isDeleteKey(key) {
153
+ return key === 'Delete' || key === 'Backspace';
154
+ };
155
+ var hasSyncBlockInSelection = function hasSyncBlockInSelection(selection) {
156
+ var syncBlock = selection.$from.doc.type.schema.nodes.syncBlock;
157
+ var found = false;
158
+ selection.$from.doc.nodesBetween(selection.from, selection.to, function (node) {
159
+ if (node.type === syncBlock) {
160
+ found = true;
161
+ return false;
162
+ }
163
+ // sync block nodes can only be found at the top level
164
+ return false;
165
+ });
166
+ return found;
167
+ };
168
+ var hasSyncBlockBeforeCursor = function hasSyncBlockBeforeCursor(selection) {
169
+ if (!selection.empty) {
170
+ return false;
171
+ }
172
+ var syncBlock = selection.$from.doc.type.schema.nodes.syncBlock;
173
+ var nodeBefore = selection.$from.nodeBefore;
174
+ return (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) === syncBlock;
175
+ };
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getDeleteSourceExperiencePlugin = exports.getDeleteSourceExperience = void 0;
7
+ var _bindEventListener = require("bind-event-listener");
8
+ var _analytics = require("@atlaskit/editor-common/analytics");
9
+ var _experiences = require("@atlaskit/editor-common/experiences");
10
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
11
+ var _state = require("@atlaskit/editor-prosemirror/state");
12
+ var _types = require("../../types");
13
+ var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
14
+ var pluginKey = new _state.PluginKey('deleteSourceSyncBlockExperience');
15
+ var START_METHOD = {
16
+ DELETE_CONFIRM_BUTTON: 'delete-confirm-button'
17
+ };
18
+
19
+ /**
20
+ * This experience tracks when a source sync block is deleted.
21
+ *
22
+ * Start: When user clicks the delete button in the delete modal
23
+ * Success: When the sync block is removed from the DOM within 2000ms of start
24
+ * Failure: When 2000ms passes without the source sync block being removed from the DOM
25
+ */
26
+ var getDeleteSourceExperiencePlugin = exports.getDeleteSourceExperiencePlugin = function getDeleteSourceExperiencePlugin(_ref) {
27
+ var refs = _ref.refs,
28
+ dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
29
+ syncBlockStore = _ref.syncBlockStore;
30
+ var experience = getDeleteSourceExperience({
31
+ refs: refs,
32
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
33
+ });
34
+ syncBlockStore.sourceManager.setDeleteExperience(experience);
35
+ var unbindClickListener = (0, _bindEventListener.bind)(document, {
36
+ type: 'click',
37
+ listener: function listener(event) {
38
+ var target = event.target;
39
+ if (!target) {
40
+ return;
41
+ }
42
+ var button = target.closest('button[data-testid]');
43
+ if (!button || !(button instanceof HTMLButtonElement)) {
44
+ return;
45
+ }
46
+ var testId = button.dataset.testid;
47
+ if (isSyncedBlockDeleteButtonId(testId)) {
48
+ experience.start({
49
+ method: START_METHOD.DELETE_CONFIRM_BUTTON
50
+ });
51
+ }
52
+ }
53
+ });
54
+ return new _safePlugin.SafePlugin({
55
+ key: pluginKey,
56
+ view: function view() {
57
+ return {
58
+ destroy: function destroy() {
59
+ experience.abort({
60
+ reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
61
+ });
62
+ unbindClickListener();
63
+ }
64
+ };
65
+ }
66
+ });
67
+ };
68
+ var getDeleteSourceExperience = exports.getDeleteSourceExperience = function getDeleteSourceExperience(_ref2) {
69
+ var refs = _ref2.refs,
70
+ dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
71
+ return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
72
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_DELETE,
73
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
74
+ checks: [new _experiences.ExperienceCheckTimeout({
75
+ durationMs: 2000
76
+ }), new _experiences.ExperienceCheckDomMutation({
77
+ onDomMutation: function onDomMutation(_ref3) {
78
+ var mutations = _ref3.mutations;
79
+ var deletedResourceIds = (0, _experienceTrackingUtils.getRemovedResourceIds)(mutations, '[data-prosemirror-node-name="bodiedSyncBlock"]');
80
+ if (deletedResourceIds.length > 0) {
81
+ return {
82
+ status: 'success',
83
+ metadata: {
84
+ deletedResourceIds: deletedResourceIds
85
+ }
86
+ };
87
+ }
88
+ return undefined;
89
+ },
90
+ observeConfig: function observeConfig() {
91
+ return {
92
+ target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
93
+ options: {
94
+ childList: true
95
+ }
96
+ };
97
+ }
98
+ })]
99
+ });
100
+ };
101
+ var isSyncedBlockDeleteButtonId = function isSyncedBlockDeleteButtonId(testId) {
102
+ return testId === 'synced-block-delete-confirmation-modal-delete-button';
103
+ };
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getExperienceTrackingPlugins = void 0;
7
7
  var _createReferenceExperience = require("./create-reference-experience");
8
8
  var _createSourceExperience = require("./create-source-experience");
9
+ var _deleteReferenceExperience = require("./delete-reference-experience");
10
+ var _deleteSourceExperience = require("./delete-source-experience");
11
+ var _providerOnlyExperiences = require("./provider-only-experiences");
9
12
  var getExperienceTrackingPlugins = exports.getExperienceTrackingPlugins = function getExperienceTrackingPlugins(_ref) {
10
13
  var refs = _ref.refs,
11
14
  dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
@@ -27,5 +30,32 @@ var getExperienceTrackingPlugins = exports.getExperienceTrackingPlugins = functi
27
30
  syncBlockStore: syncBlockStore
28
31
  });
29
32
  }
33
+ }, {
34
+ name: 'deleteSourceExperiencePlugin',
35
+ plugin: function plugin() {
36
+ return (0, _deleteSourceExperience.getDeleteSourceExperiencePlugin)({
37
+ refs: refs,
38
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
39
+ syncBlockStore: syncBlockStore
40
+ });
41
+ }
42
+ }, {
43
+ name: 'deleteReferenceExperiencePlugin',
44
+ plugin: function plugin() {
45
+ return (0, _deleteReferenceExperience.getDeleteReferenceExperiencePlugin)({
46
+ refs: refs,
47
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
48
+ syncBlockStore: syncBlockStore
49
+ });
50
+ }
51
+ }, {
52
+ name: 'providerOnlySyncedBlockExperiencesPlugin',
53
+ plugin: function plugin() {
54
+ return (0, _providerOnlyExperiences.getProviderOnlyExperiencesPlugin)({
55
+ refs: refs,
56
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
57
+ syncBlockStore: syncBlockStore
58
+ });
59
+ }
30
60
  }];
31
61
  };