@atlaskit/editor-plugin-block-controls 3.8.6 → 3.8.7

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 (30) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/blockControlsPlugin.js +17 -10
  3. package/dist/cjs/pm-plugins/interaction-tracking/commands.js +17 -0
  4. package/dist/cjs/pm-plugins/interaction-tracking/handle-key-down.js +32 -0
  5. package/dist/cjs/pm-plugins/interaction-tracking/handle-mouse-move.js +16 -0
  6. package/dist/cjs/pm-plugins/interaction-tracking/pm-plugin.js +46 -0
  7. package/dist/cjs/ui/visibility-container.js +4 -3
  8. package/dist/es2019/blockControlsPlugin.js +18 -8
  9. package/dist/es2019/pm-plugins/interaction-tracking/commands.js +11 -0
  10. package/dist/es2019/pm-plugins/interaction-tracking/handle-key-down.js +26 -0
  11. package/dist/es2019/pm-plugins/interaction-tracking/handle-mouse-move.js +10 -0
  12. package/dist/es2019/pm-plugins/interaction-tracking/pm-plugin.js +40 -0
  13. package/dist/es2019/ui/visibility-container.js +4 -3
  14. package/dist/esm/blockControlsPlugin.js +17 -10
  15. package/dist/esm/pm-plugins/interaction-tracking/commands.js +11 -0
  16. package/dist/esm/pm-plugins/interaction-tracking/handle-key-down.js +26 -0
  17. package/dist/esm/pm-plugins/interaction-tracking/handle-mouse-move.js +10 -0
  18. package/dist/esm/pm-plugins/interaction-tracking/pm-plugin.js +40 -0
  19. package/dist/esm/ui/visibility-container.js +4 -3
  20. package/dist/types/blockControlsPluginType.d.ts +1 -0
  21. package/dist/types/pm-plugins/interaction-tracking/commands.d.ts +3 -0
  22. package/dist/types/pm-plugins/interaction-tracking/handle-key-down.d.ts +2 -0
  23. package/dist/types/pm-plugins/interaction-tracking/handle-mouse-move.d.ts +2 -0
  24. package/dist/types/pm-plugins/interaction-tracking/pm-plugin.d.ts +12 -0
  25. package/dist/types-ts4.5/blockControlsPluginType.d.ts +1 -0
  26. package/dist/types-ts4.5/pm-plugins/interaction-tracking/commands.d.ts +3 -0
  27. package/dist/types-ts4.5/pm-plugins/interaction-tracking/handle-key-down.d.ts +2 -0
  28. package/dist/types-ts4.5/pm-plugins/interaction-tracking/handle-mouse-move.d.ts +2 -0
  29. package/dist/types-ts4.5/pm-plugins/interaction-tracking/pm-plugin.d.ts +12 -0
  30. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-plugin-block-controls
2
2
 
3
+ ## 3.8.7
4
+
5
+ ### Patch Changes
6
+
7
+ - [#138396](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/138396)
8
+ [`6a11423e1442f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6a11423e1442f) -
9
+ Add new plugin which tracks user typing, add typing check to visibility container of widgets
10
+
3
11
  ## 3.8.6
4
12
 
5
13
  ### Patch Changes
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.blockControlsPlugin = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
9
  var _react = _interopRequireDefault(require("react"));
11
10
  var _selection = require("@atlaskit/editor-common/selection");
12
11
  var _state = require("@atlaskit/editor-prosemirror/state");
@@ -15,6 +14,7 @@ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
15
14
  var _moveNode = require("./editor-commands/move-node");
16
15
  var _moveToLayout = require("./editor-commands/move-to-layout");
17
16
  var _firstNodeDecPlugin = require("./pm-plugins/first-node-dec-plugin");
17
+ var _pmPlugin = require("./pm-plugins/interaction-tracking/pm-plugin");
18
18
  var _main = require("./pm-plugins/main");
19
19
  var _getSelection = require("./pm-plugins/utils/getSelection");
20
20
  var _blockMenu = _interopRequireDefault(require("./ui/block-menu"));
@@ -27,7 +27,7 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
27
27
  return {
28
28
  name: 'blockControls',
29
29
  pmPlugins: function pmPlugins() {
30
- var plugins = [{
30
+ var pmPlugins = [{
31
31
  name: 'blockControlsPmPlugin',
32
32
  plugin: function plugin(_ref2) {
33
33
  var getIntl = _ref2.getIntl,
@@ -35,13 +35,19 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
35
35
  return (0, _main.createPlugin)(api, getIntl, nodeViewPortalProviderAPI);
36
36
  }
37
37
  }];
38
- var controlsPlugins = [{
39
- name: 'firstNodeDec',
40
- plugin: function plugin() {
41
- return (0, _firstNodeDecPlugin.firstNodeDecPlugin)();
38
+ if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) {
39
+ if ((0, _platformFeatureFlags.fg)('platform_editor_controls_widget_visibility')) {
40
+ pmPlugins.push({
41
+ name: 'blockControlsInteractionTrackingPlugin',
42
+ plugin: _pmPlugin.createInteractionTrackingPlugin
43
+ });
42
44
  }
43
- }];
44
- return [].concat(plugins, (0, _toConsumableArray2.default)((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1') ? controlsPlugins : []));
45
+ pmPlugins.push({
46
+ name: 'firstNodeDec',
47
+ plugin: _firstNodeDecPlugin.firstNodeDecPlugin
48
+ });
49
+ }
50
+ return pmPlugins;
45
51
  },
46
52
  commands: {
47
53
  moveNode: (0, _moveNode.moveNode)(api),
@@ -161,7 +167,7 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
161
167
  }
162
168
  },
163
169
  getSharedState: function getSharedState(editorState) {
164
- var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
170
+ var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
165
171
  if (!editorState) {
166
172
  return undefined;
167
173
  }
@@ -173,7 +179,8 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
173
179
  isPMDragging: (_key$getState$isPMDra = (_key$getState5 = _main.key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
174
180
  multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = _main.key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
175
181
  isShiftDown: (_key$getState$isShift = (_key$getState7 = _main.key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
176
- lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = _main.key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
182
+ lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = _main.key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
183
+ isEditing: (_interactionTrackingP = _pmPlugin.interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
177
184
  };
178
185
  },
179
186
  contentComponent: function contentComponent(_ref7) {
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stopEditing = exports.startEditing = void 0;
7
+ var _pmPlugin = require("./pm-plugin");
8
+ var stopEditing = exports.stopEditing = function stopEditing(view) {
9
+ view.dispatch(view.state.tr.setMeta(_pmPlugin.interactionTrackingPluginKey, {
10
+ type: 'stopEditing'
11
+ }));
12
+ };
13
+ var startEditing = exports.startEditing = function startEditing(view) {
14
+ view.dispatch(view.state.tr.setMeta(_pmPlugin.interactionTrackingPluginKey, {
15
+ type: 'startEditing'
16
+ }));
17
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.handleKeyDown = void 0;
7
+ var _commands = require("./commands");
8
+ var _pmPlugin = require("./pm-plugin");
9
+ var handleKeyDown = exports.handleKeyDown = function handleKeyDown(view, event) {
10
+ // Check if this is a keyboard shortcut (Ctrl/Cmd + key)
11
+ var isShortcut = event.ctrlKey || event.metaKey || event.altKey;
12
+ if (isShortcut) {
13
+ return false;
14
+ }
15
+
16
+ // Only consider actual typing keys (not shortcuts)
17
+ // We need to check if it's a single character key or a deletion key
18
+ // and ensure it's not part of a shortcut
19
+ var isTypingKey =
20
+ // Single character keys (letters, numbers, symbols)
21
+ event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
22
+ if (!isTypingKey) {
23
+ return false;
24
+ }
25
+ var state = (0, _pmPlugin.getInteractionTrackingState)(view.state);
26
+
27
+ // if user hasnt started typing yet, start timer
28
+ if (!(state !== null && state !== void 0 && state.isEditing)) {
29
+ (0, _commands.startEditing)(view);
30
+ }
31
+ return false;
32
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.handleMouseMove = void 0;
7
+ var _commands = require("./commands");
8
+ var _pmPlugin = require("./pm-plugin");
9
+ var handleMouseMove = exports.handleMouseMove = function handleMouseMove(view) {
10
+ var state = (0, _pmPlugin.getInteractionTrackingState)(view.state);
11
+ // if user has stopped editing and moved their mouse, show block controls again
12
+ if (state !== null && state !== void 0 && state.isEditing) {
13
+ (0, _commands.stopEditing)(view);
14
+ }
15
+ return false;
16
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.interactionTrackingPluginKey = exports.getInteractionTrackingState = exports.createInteractionTrackingPlugin = void 0;
7
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
8
+ var _state = require("@atlaskit/editor-prosemirror/state");
9
+ var _handleKeyDown = require("./handle-key-down");
10
+ var _handleMouseMove = require("./handle-mouse-move");
11
+ var interactionTrackingPluginKey = exports.interactionTrackingPluginKey = new _state.PluginKey('interactionTrackingPlugin');
12
+ var createInteractionTrackingPlugin = exports.createInteractionTrackingPlugin = function createInteractionTrackingPlugin() {
13
+ return new _safePlugin.SafePlugin({
14
+ key: interactionTrackingPluginKey,
15
+ state: {
16
+ init: function init() {
17
+ return {
18
+ isEditing: false
19
+ };
20
+ },
21
+ apply: function apply(tr, pluginState) {
22
+ var meta = tr.getMeta(interactionTrackingPluginKey);
23
+ switch (meta === null || meta === void 0 ? void 0 : meta.type) {
24
+ case 'startEditing':
25
+ return {
26
+ isEditing: true
27
+ };
28
+ case 'stopEditing':
29
+ return {
30
+ isEditing: false
31
+ };
32
+ }
33
+ return pluginState;
34
+ }
35
+ },
36
+ props: {
37
+ handleKeyDown: _handleKeyDown.handleKeyDown,
38
+ handleDOMEvents: {
39
+ mousemove: _handleMouseMove.handleMouseMove
40
+ }
41
+ }
42
+ });
43
+ };
44
+ var getInteractionTrackingState = exports.getInteractionTrackingState = function getInteractionTrackingState(state) {
45
+ return interactionTrackingPluginKey.getState(state);
46
+ };
@@ -17,14 +17,15 @@ var visibleStyles = (0, _primitives.xcss)({
17
17
  });
18
18
  var hiddenStyles = (0, _primitives.xcss)({
19
19
  opacity: 0,
20
- // CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
21
20
  visibility: 'hidden'
22
21
  });
23
22
  var VisibilityContainer = exports.VisibilityContainer = function VisibilityContainer(_ref) {
24
23
  var api = _ref.api,
25
24
  children = _ref.children;
26
- var isOpen = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'typeAhead.isOpen');
25
+ var isTypeAheadOpen = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'typeAhead.isOpen');
26
+ var isEditing = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'blockControls.isEditing');
27
+ var shouldHide = isTypeAheadOpen || isEditing;
27
28
  return /*#__PURE__*/_react.default.createElement(_primitives.Box, {
28
- xcss: [baseStyles, isOpen ? hiddenStyles : visibleStyles]
29
+ xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
29
30
  }, children);
30
31
  };
@@ -6,6 +6,7 @@ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
6
6
  import { moveNode } from './editor-commands/move-node';
7
7
  import { moveToLayout } from './editor-commands/move-to-layout';
8
8
  import { firstNodeDecPlugin } from './pm-plugins/first-node-dec-plugin';
9
+ import { createInteractionTrackingPlugin, interactionTrackingPluginKey } from './pm-plugins/interaction-tracking/pm-plugin';
9
10
  import { createPlugin, key } from './pm-plugins/main';
10
11
  import { selectNode } from './pm-plugins/utils/getSelection';
11
12
  import BlockMenu from './ui/block-menu';
@@ -16,18 +17,26 @@ export const blockControlsPlugin = ({
16
17
  }) => ({
17
18
  name: 'blockControls',
18
19
  pmPlugins() {
19
- const plugins = [{
20
+ const pmPlugins = [{
20
21
  name: 'blockControlsPmPlugin',
21
22
  plugin: ({
22
23
  getIntl,
23
24
  nodeViewPortalProviderAPI
24
25
  }) => createPlugin(api, getIntl, nodeViewPortalProviderAPI)
25
26
  }];
26
- const controlsPlugins = [{
27
- name: 'firstNodeDec',
28
- plugin: () => firstNodeDecPlugin()
29
- }];
30
- return [...plugins, ...(editorExperiment('platform_editor_controls', 'variant1') ? controlsPlugins : [])];
27
+ if (editorExperiment('platform_editor_controls', 'variant1')) {
28
+ if (fg('platform_editor_controls_widget_visibility')) {
29
+ pmPlugins.push({
30
+ name: 'blockControlsInteractionTrackingPlugin',
31
+ plugin: createInteractionTrackingPlugin
32
+ });
33
+ }
34
+ pmPlugins.push({
35
+ name: 'firstNodeDec',
36
+ plugin: firstNodeDecPlugin
37
+ });
38
+ }
39
+ return pmPlugins;
31
40
  },
32
41
  commands: {
33
42
  moveNode: moveNode(api),
@@ -149,7 +158,7 @@ export const blockControlsPlugin = ({
149
158
  }
150
159
  },
151
160
  getSharedState(editorState) {
152
- var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
161
+ var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
153
162
  if (!editorState) {
154
163
  return undefined;
155
164
  }
@@ -161,7 +170,8 @@ export const blockControlsPlugin = ({
161
170
  isPMDragging: (_key$getState$isPMDra = (_key$getState5 = key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
162
171
  multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
163
172
  isShiftDown: (_key$getState$isShift = (_key$getState7 = key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
164
- lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
173
+ lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
174
+ isEditing: (_interactionTrackingP = interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
165
175
  };
166
176
  },
167
177
  contentComponent({
@@ -0,0 +1,11 @@
1
+ import { interactionTrackingPluginKey } from './pm-plugin';
2
+ export const stopEditing = view => {
3
+ view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
4
+ type: 'stopEditing'
5
+ }));
6
+ };
7
+ export const startEditing = view => {
8
+ view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
9
+ type: 'startEditing'
10
+ }));
11
+ };
@@ -0,0 +1,26 @@
1
+ import { startEditing } from './commands';
2
+ import { getInteractionTrackingState } from './pm-plugin';
3
+ export const handleKeyDown = (view, event) => {
4
+ // Check if this is a keyboard shortcut (Ctrl/Cmd + key)
5
+ const isShortcut = event.ctrlKey || event.metaKey || event.altKey;
6
+ if (isShortcut) {
7
+ return false;
8
+ }
9
+
10
+ // Only consider actual typing keys (not shortcuts)
11
+ // We need to check if it's a single character key or a deletion key
12
+ // and ensure it's not part of a shortcut
13
+ const isTypingKey =
14
+ // Single character keys (letters, numbers, symbols)
15
+ event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
16
+ if (!isTypingKey) {
17
+ return false;
18
+ }
19
+ const state = getInteractionTrackingState(view.state);
20
+
21
+ // if user hasnt started typing yet, start timer
22
+ if (!(state !== null && state !== void 0 && state.isEditing)) {
23
+ startEditing(view);
24
+ }
25
+ return false;
26
+ };
@@ -0,0 +1,10 @@
1
+ import { stopEditing } from './commands';
2
+ import { getInteractionTrackingState } from './pm-plugin';
3
+ export const handleMouseMove = view => {
4
+ const state = getInteractionTrackingState(view.state);
5
+ // if user has stopped editing and moved their mouse, show block controls again
6
+ if (state !== null && state !== void 0 && state.isEditing) {
7
+ stopEditing(view);
8
+ }
9
+ return false;
10
+ };
@@ -0,0 +1,40 @@
1
+ import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
2
+ import { PluginKey } from '@atlaskit/editor-prosemirror/state';
3
+ import { handleKeyDown } from './handle-key-down';
4
+ import { handleMouseMove } from './handle-mouse-move';
5
+ export const interactionTrackingPluginKey = new PluginKey('interactionTrackingPlugin');
6
+ export const createInteractionTrackingPlugin = () => {
7
+ return new SafePlugin({
8
+ key: interactionTrackingPluginKey,
9
+ state: {
10
+ init() {
11
+ return {
12
+ isEditing: false
13
+ };
14
+ },
15
+ apply(tr, pluginState) {
16
+ const meta = tr.getMeta(interactionTrackingPluginKey);
17
+ switch (meta === null || meta === void 0 ? void 0 : meta.type) {
18
+ case 'startEditing':
19
+ return {
20
+ isEditing: true
21
+ };
22
+ case 'stopEditing':
23
+ return {
24
+ isEditing: false
25
+ };
26
+ }
27
+ return pluginState;
28
+ }
29
+ },
30
+ props: {
31
+ handleKeyDown,
32
+ handleDOMEvents: {
33
+ mousemove: handleMouseMove
34
+ }
35
+ }
36
+ });
37
+ };
38
+ export const getInteractionTrackingState = state => {
39
+ return interactionTrackingPluginKey.getState(state);
40
+ };
@@ -10,15 +10,16 @@ const visibleStyles = xcss({
10
10
  });
11
11
  const hiddenStyles = xcss({
12
12
  opacity: 0,
13
- // CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
14
13
  visibility: 'hidden'
15
14
  });
16
15
  export const VisibilityContainer = ({
17
16
  api,
18
17
  children
19
18
  }) => {
20
- const isOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
19
+ const isTypeAheadOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
20
+ const isEditing = useSharedPluginStateSelector(api, 'blockControls.isEditing');
21
+ const shouldHide = isTypeAheadOpen || isEditing;
21
22
  return /*#__PURE__*/React.createElement(Box, {
22
- xcss: [baseStyles, isOpen ? hiddenStyles : visibleStyles]
23
+ xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
23
24
  }, children);
24
25
  };
@@ -1,5 +1,4 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
2
  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; }
4
3
  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) { _defineProperty(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; }
5
4
  import React from 'react';
@@ -10,6 +9,7 @@ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
10
9
  import { moveNode } from './editor-commands/move-node';
11
10
  import { moveToLayout } from './editor-commands/move-to-layout';
12
11
  import { firstNodeDecPlugin } from './pm-plugins/first-node-dec-plugin';
12
+ import { createInteractionTrackingPlugin, interactionTrackingPluginKey } from './pm-plugins/interaction-tracking/pm-plugin';
13
13
  import { createPlugin, key } from './pm-plugins/main';
14
14
  import { selectNode } from './pm-plugins/utils/getSelection';
15
15
  import BlockMenu from './ui/block-menu';
@@ -20,7 +20,7 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
20
20
  return {
21
21
  name: 'blockControls',
22
22
  pmPlugins: function pmPlugins() {
23
- var plugins = [{
23
+ var pmPlugins = [{
24
24
  name: 'blockControlsPmPlugin',
25
25
  plugin: function plugin(_ref2) {
26
26
  var getIntl = _ref2.getIntl,
@@ -28,13 +28,19 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
28
28
  return createPlugin(api, getIntl, nodeViewPortalProviderAPI);
29
29
  }
30
30
  }];
31
- var controlsPlugins = [{
32
- name: 'firstNodeDec',
33
- plugin: function plugin() {
34
- return firstNodeDecPlugin();
31
+ if (editorExperiment('platform_editor_controls', 'variant1')) {
32
+ if (fg('platform_editor_controls_widget_visibility')) {
33
+ pmPlugins.push({
34
+ name: 'blockControlsInteractionTrackingPlugin',
35
+ plugin: createInteractionTrackingPlugin
36
+ });
35
37
  }
36
- }];
37
- return [].concat(plugins, _toConsumableArray(editorExperiment('platform_editor_controls', 'variant1') ? controlsPlugins : []));
38
+ pmPlugins.push({
39
+ name: 'firstNodeDec',
40
+ plugin: firstNodeDecPlugin
41
+ });
42
+ }
43
+ return pmPlugins;
38
44
  },
39
45
  commands: {
40
46
  moveNode: moveNode(api),
@@ -154,7 +160,7 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
154
160
  }
155
161
  },
156
162
  getSharedState: function getSharedState(editorState) {
157
- var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8;
163
+ var _key$getState$isMenuO, _key$getState, _key$getState$menuTri, _key$getState2, _key$getState$activeN, _key$getState3, _key$getState$isDragg, _key$getState4, _key$getState$isPMDra, _key$getState5, _key$getState$multiSe, _key$getState6, _key$getState$isShift, _key$getState7, _key$getState$lastDra, _key$getState8, _interactionTrackingP;
158
164
  if (!editorState) {
159
165
  return undefined;
160
166
  }
@@ -166,7 +172,8 @@ export var blockControlsPlugin = function blockControlsPlugin(_ref) {
166
172
  isPMDragging: (_key$getState$isPMDra = (_key$getState5 = key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
167
173
  multiSelectDnD: (_key$getState$multiSe = (_key$getState6 = key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
168
174
  isShiftDown: (_key$getState$isShift = (_key$getState7 = key.getState(editorState)) === null || _key$getState7 === void 0 ? void 0 : _key$getState7.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined,
169
- lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false
175
+ lastDragCancelled: (_key$getState$lastDra = (_key$getState8 = key.getState(editorState)) === null || _key$getState8 === void 0 ? void 0 : _key$getState8.lastDragCancelled) !== null && _key$getState$lastDra !== void 0 ? _key$getState$lastDra : false,
176
+ isEditing: (_interactionTrackingP = interactionTrackingPluginKey.getState(editorState)) === null || _interactionTrackingP === void 0 ? void 0 : _interactionTrackingP.isEditing
170
177
  };
171
178
  },
172
179
  contentComponent: function contentComponent(_ref7) {
@@ -0,0 +1,11 @@
1
+ import { interactionTrackingPluginKey } from './pm-plugin';
2
+ export var stopEditing = function stopEditing(view) {
3
+ view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
4
+ type: 'stopEditing'
5
+ }));
6
+ };
7
+ export var startEditing = function startEditing(view) {
8
+ view.dispatch(view.state.tr.setMeta(interactionTrackingPluginKey, {
9
+ type: 'startEditing'
10
+ }));
11
+ };
@@ -0,0 +1,26 @@
1
+ import { startEditing } from './commands';
2
+ import { getInteractionTrackingState } from './pm-plugin';
3
+ export var handleKeyDown = function handleKeyDown(view, event) {
4
+ // Check if this is a keyboard shortcut (Ctrl/Cmd + key)
5
+ var isShortcut = event.ctrlKey || event.metaKey || event.altKey;
6
+ if (isShortcut) {
7
+ return false;
8
+ }
9
+
10
+ // Only consider actual typing keys (not shortcuts)
11
+ // We need to check if it's a single character key or a deletion key
12
+ // and ensure it's not part of a shortcut
13
+ var isTypingKey =
14
+ // Single character keys (letters, numbers, symbols)
15
+ event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete' || event.key === ' ' || event.key === 'Enter';
16
+ if (!isTypingKey) {
17
+ return false;
18
+ }
19
+ var state = getInteractionTrackingState(view.state);
20
+
21
+ // if user hasnt started typing yet, start timer
22
+ if (!(state !== null && state !== void 0 && state.isEditing)) {
23
+ startEditing(view);
24
+ }
25
+ return false;
26
+ };
@@ -0,0 +1,10 @@
1
+ import { stopEditing } from './commands';
2
+ import { getInteractionTrackingState } from './pm-plugin';
3
+ export var handleMouseMove = function handleMouseMove(view) {
4
+ var state = getInteractionTrackingState(view.state);
5
+ // if user has stopped editing and moved their mouse, show block controls again
6
+ if (state !== null && state !== void 0 && state.isEditing) {
7
+ stopEditing(view);
8
+ }
9
+ return false;
10
+ };
@@ -0,0 +1,40 @@
1
+ import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
2
+ import { PluginKey } from '@atlaskit/editor-prosemirror/state';
3
+ import { handleKeyDown } from './handle-key-down';
4
+ import { handleMouseMove } from './handle-mouse-move';
5
+ export var interactionTrackingPluginKey = new PluginKey('interactionTrackingPlugin');
6
+ export var createInteractionTrackingPlugin = function createInteractionTrackingPlugin() {
7
+ return new SafePlugin({
8
+ key: interactionTrackingPluginKey,
9
+ state: {
10
+ init: function init() {
11
+ return {
12
+ isEditing: false
13
+ };
14
+ },
15
+ apply: function apply(tr, pluginState) {
16
+ var meta = tr.getMeta(interactionTrackingPluginKey);
17
+ switch (meta === null || meta === void 0 ? void 0 : meta.type) {
18
+ case 'startEditing':
19
+ return {
20
+ isEditing: true
21
+ };
22
+ case 'stopEditing':
23
+ return {
24
+ isEditing: false
25
+ };
26
+ }
27
+ return pluginState;
28
+ }
29
+ },
30
+ props: {
31
+ handleKeyDown: handleKeyDown,
32
+ handleDOMEvents: {
33
+ mousemove: handleMouseMove
34
+ }
35
+ }
36
+ });
37
+ };
38
+ export var getInteractionTrackingState = function getInteractionTrackingState(state) {
39
+ return interactionTrackingPluginKey.getState(state);
40
+ };
@@ -10,14 +10,15 @@ var visibleStyles = xcss({
10
10
  });
11
11
  var hiddenStyles = xcss({
12
12
  opacity: 0,
13
- // CONFIRM this change doesnt cause this issue to regress https://product-fabric.atlassian.net/browse/ED-24136
14
13
  visibility: 'hidden'
15
14
  });
16
15
  export var VisibilityContainer = function VisibilityContainer(_ref) {
17
16
  var api = _ref.api,
18
17
  children = _ref.children;
19
- var isOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
18
+ var isTypeAheadOpen = useSharedPluginStateSelector(api, 'typeAhead.isOpen');
19
+ var isEditing = useSharedPluginStateSelector(api, 'blockControls.isEditing');
20
+ var shouldHide = isTypeAheadOpen || isEditing;
20
21
  return /*#__PURE__*/React.createElement(Box, {
21
- xcss: [baseStyles, isOpen ? hiddenStyles : visibleStyles]
22
+ xcss: [baseStyles, shouldHide ? hiddenStyles : visibleStyles]
22
23
  }, children);
23
24
  };
@@ -60,6 +60,7 @@ export type BlockControlsSharedState = {
60
60
  isPMDragging: boolean;
61
61
  multiSelectDnD?: MultiSelectDnD;
62
62
  isShiftDown?: boolean;
63
+ isEditing?: boolean;
63
64
  } | undefined;
64
65
  export type HandleOptions = {
65
66
  isFocused: boolean;
@@ -0,0 +1,3 @@
1
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const stopEditing: (view: EditorView) => void;
3
+ export declare const startEditing: (view: EditorView) => void;
@@ -0,0 +1,2 @@
1
+ import { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const handleKeyDown: (view: EditorView, event: KeyboardEvent) => boolean;
@@ -0,0 +1,2 @@
1
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const handleMouseMove: (view: EditorView) => boolean;
@@ -0,0 +1,12 @@
1
+ import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
2
+ import { PluginKey } from '@atlaskit/editor-prosemirror/state';
3
+ import type { EditorState } from '@atlaskit/editor-prosemirror/state';
4
+ export type InteractionTrackingPluginState = {
5
+ /**
6
+ * Tracks if a users intention is to edit the document (e.g. typing, deleting, etc.)
7
+ */
8
+ isEditing: boolean;
9
+ };
10
+ export declare const interactionTrackingPluginKey: PluginKey<InteractionTrackingPluginState>;
11
+ export declare const createInteractionTrackingPlugin: () => SafePlugin<InteractionTrackingPluginState>;
12
+ export declare const getInteractionTrackingState: (state: EditorState) => InteractionTrackingPluginState | undefined;
@@ -60,6 +60,7 @@ export type BlockControlsSharedState = {
60
60
  isPMDragging: boolean;
61
61
  multiSelectDnD?: MultiSelectDnD;
62
62
  isShiftDown?: boolean;
63
+ isEditing?: boolean;
63
64
  } | undefined;
64
65
  export type HandleOptions = {
65
66
  isFocused: boolean;
@@ -0,0 +1,3 @@
1
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const stopEditing: (view: EditorView) => void;
3
+ export declare const startEditing: (view: EditorView) => void;
@@ -0,0 +1,2 @@
1
+ import { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const handleKeyDown: (view: EditorView, event: KeyboardEvent) => boolean;
@@ -0,0 +1,2 @@
1
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
2
+ export declare const handleMouseMove: (view: EditorView) => boolean;
@@ -0,0 +1,12 @@
1
+ import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
2
+ import { PluginKey } from '@atlaskit/editor-prosemirror/state';
3
+ import type { EditorState } from '@atlaskit/editor-prosemirror/state';
4
+ export type InteractionTrackingPluginState = {
5
+ /**
6
+ * Tracks if a users intention is to edit the document (e.g. typing, deleting, etc.)
7
+ */
8
+ isEditing: boolean;
9
+ };
10
+ export declare const interactionTrackingPluginKey: PluginKey<InteractionTrackingPluginState>;
11
+ export declare const createInteractionTrackingPlugin: () => SafePlugin<InteractionTrackingPluginState>;
12
+ export declare const getInteractionTrackingState: (state: EditorState) => InteractionTrackingPluginState | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-block-controls",
3
- "version": "3.8.6",
3
+ "version": "3.8.7",
4
4
  "description": "Block controls plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -51,7 +51,7 @@
51
51
  "@atlaskit/pragmatic-drag-and-drop": "^1.5.0",
52
52
  "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
53
53
  "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "^3.0.0",
54
- "@atlaskit/primitives": "^14.3.0",
54
+ "@atlaskit/primitives": "^14.4.0",
55
55
  "@atlaskit/theme": "^18.0.0",
56
56
  "@atlaskit/tmp-editor-statsig": "^4.6.0",
57
57
  "@atlaskit/tokens": "^4.7.0",