@atlaskit/editor-plugin-emoji 6.2.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/editor-plugin-emoji
2
2
 
3
+ ## 6.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`e49f1d35e507a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e49f1d35e507a) -
8
+ [https://product-fabric.atlassian.net/browse/ED-29349](ED-29349) - add one tick provider (SSR)
9
+ support for emojis in editor and live pages
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 6.2.0
4
16
 
5
17
  ### Minor Changes
@@ -555,7 +555,8 @@ function createEmojiPlugin(pmPluginFactoryParams, options, api) {
555
555
  emoji: function emoji(node) {
556
556
  return new _EmojiNodeView.EmojiNodeView(node, {
557
557
  intl: pmPluginFactoryParams.getIntl(),
558
- api: api
558
+ api: api,
559
+ emojiNodeDataProvider: options === null || options === void 0 ? void 0 : options.emojiNodeDataProvider
559
560
  });
560
561
  }
561
562
  }
package/dist/cjs/index.js CHANGED
@@ -3,10 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "EmojiNodeDataProvider", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _EmojiNodeDataProvider.EmojiNodeDataProvider;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "emojiPlugin", {
7
13
  enumerable: true,
8
14
  get: function get() {
9
15
  return _emojiPlugin.emojiPlugin;
10
16
  }
11
17
  });
12
- var _emojiPlugin = require("./emojiPlugin");
18
+ var _emojiPlugin = require("./emojiPlugin");
19
+ var _EmojiNodeDataProvider = require("./pm-plugins/providers/EmojiNodeDataProvider");
@@ -15,6 +15,7 @@ var _coreUtils = require("@atlaskit/editor-common/core-utils");
15
15
  var _emoji = require("@atlaskit/editor-common/emoji");
16
16
  var _monitoring = require("@atlaskit/editor-common/monitoring");
17
17
  var _model = require("@atlaskit/editor-prosemirror/model");
18
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
18
19
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
19
20
  var _emojiNodeSpec = require("./emojiNodeSpec");
20
21
  /**
@@ -45,17 +46,16 @@ var EmojiNodeView = exports.EmojiNodeView = /*#__PURE__*/function () {
45
46
  * @param extraProps - An object containing additional parameters.
46
47
  * @param extraProps.intl - The internationalization object for formatting messages.
47
48
  * @param extraProps.api - The editor API for accessing shared state and connectivity features.
49
+ * @param extraProps.emojiNodeDataProvider - (Optional) A provider for fetching emoji data.
48
50
  *
49
51
  * @example
50
- * const emojiNodeView = new EmojiNodeView(node, { intl, api });
52
+ * const emojiNodeView = new EmojiNodeView(node, { intl, api, emojiNodeDataProvider });
51
53
  */
52
54
  function EmojiNodeView(node, _ref) {
53
- var _api$emoji,
54
- _sharedState$currentS,
55
- _this = this,
56
- _api$connectivity;
55
+ var _this = this;
57
56
  var intl = _ref.intl,
58
- api = _ref.api;
57
+ api = _ref.api,
58
+ emojiNodeDataProvider = _ref.emojiNodeDataProvider;
59
59
  (0, _classCallCheck2.default)(this, EmojiNodeView);
60
60
  (0, _defineProperty2.default)(this, "renderingFallback", false);
61
61
  (0, _defineProperty2.default)(this, "destroy", function () {});
@@ -64,50 +64,86 @@ var EmojiNodeView = exports.EmojiNodeView = /*#__PURE__*/function () {
64
64
  var _DOMSerializer$render = _model.DOMSerializer.renderSpec(document, (0, _emojiNodeSpec.emojiToDom)(this.node)),
65
65
  dom = _DOMSerializer$render.dom;
66
66
  this.dom = dom;
67
- this.domElement = dom instanceof HTMLElement ? dom : undefined;
68
- if ((0, _coreUtils.isSSR)()) {
69
- // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
70
- // that's why we don't need to continue node rendering.
71
- // In SSR we want to show a placeholder, that `emojiToDom()` returns.
72
- return;
73
- }
74
-
75
- // We use the `emojiProvider` from the shared state
76
- // because it supports the `emojiProvider` prop in the `ComposableEditor` options
77
- // as well as the `emojiProvider` in the `EmojiPlugin` options.
78
- var sharedState = api === null || api === void 0 || (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
79
- if (!sharedState) {
80
- return;
81
- }
82
- var emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
83
- if (emojiProvider) {
84
- void this.updateDom(emojiProvider);
85
- }
86
- var unsubscribe = sharedState.onChange(function (_ref2) {
87
- var nextSharedState = _ref2.nextSharedState;
88
- if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
89
- // Do not update if the provider is the same
67
+ this.domElement = (0, _expValEquals.expValEquals)('platform_editor_emoji_otp', 'isEnabled', true) && this.isHTMLElement(dom) || !(0, _expValEquals.expValEquals)('platform_editor_emoji_otp', 'isEnabled', true) && dom instanceof HTMLElement ? dom : undefined;
68
+ if ((0, _expValEquals.expValEquals)('platform_editor_emoji_otp', 'isEnabled', true) && emojiNodeDataProvider) {
69
+ emojiNodeDataProvider.getData(node, function (payload) {
70
+ if (payload.error) {
71
+ EmojiNodeView.logError(payload.error);
72
+ _this.renderFallback();
73
+ return;
74
+ }
75
+ var emojiDescription = payload.data;
76
+ if (!emojiDescription) {
77
+ EmojiNodeView.logError(new Error('Emoji description is not loaded'));
78
+ _this.renderFallback();
79
+ return;
80
+ }
81
+ var emojiRepresentation = emojiDescription === null || emojiDescription === void 0 ? void 0 : emojiDescription.representation;
82
+ if (!EmojiNodeView.isEmojiRepresentationSupported(emojiRepresentation)) {
83
+ EmojiNodeView.logError(new Error('Emoji representation is not supported'));
84
+ _this.renderFallback();
85
+ return;
86
+ }
87
+ _this.renderEmoji(emojiDescription, emojiRepresentation);
88
+ });
89
+ } else {
90
+ var _api$emoji, _sharedState$currentS, _api$connectivity;
91
+ if ((0, _coreUtils.isSSR)()) {
92
+ // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
93
+ // that's why we don't need to continue node rendering.
94
+ // In SSR we want to show a placeholder, that `emojiToDom()` returns.
90
95
  return;
91
96
  }
92
- emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
93
- void _this.updateDom(emojiProvider);
94
- });
95
97
 
96
- // Refresh emojis if we go back online
97
- var subscribeToConnection = api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(function (_ref3) {
98
- var prevSharedState = _ref3.prevSharedState,
99
- nextSharedState = _ref3.nextSharedState;
100
- if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && _this.renderingFallback && (0, _experiments.editorExperiment)('platform_editor_offline_editing_web', true)) {
101
- var _sharedState$currentS2;
102
- _this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
98
+ // We use the `emojiProvider` from the shared state
99
+ // because it supports the `emojiProvider` prop in the `ComposableEditor` options
100
+ // as well as the `emojiProvider` in the `EmojiPlugin` options.
101
+ var sharedState = api === null || api === void 0 || (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
102
+ if (!sharedState) {
103
+ return;
103
104
  }
104
- });
105
- this.destroy = function () {
106
- unsubscribe();
107
- subscribeToConnection === null || subscribeToConnection === void 0 || subscribeToConnection();
108
- };
105
+ var emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
106
+ if (emojiProvider) {
107
+ void this.updateDom(emojiProvider);
108
+ }
109
+ var unsubscribe = sharedState.onChange(function (_ref2) {
110
+ var nextSharedState = _ref2.nextSharedState;
111
+ if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
112
+ // Do not update if the provider is the same
113
+ return;
114
+ }
115
+ emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
116
+ void _this.updateDom(emojiProvider);
117
+ });
118
+
119
+ // Refresh emojis if we go back online
120
+ var subscribeToConnection = api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(function (_ref3) {
121
+ var prevSharedState = _ref3.prevSharedState,
122
+ nextSharedState = _ref3.nextSharedState;
123
+ if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && _this.renderingFallback && (0, _experiments.editorExperiment)('platform_editor_offline_editing_web', true)) {
124
+ var _sharedState$currentS2;
125
+ _this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
126
+ }
127
+ });
128
+ this.destroy = function () {
129
+ unsubscribe();
130
+ subscribeToConnection === null || subscribeToConnection === void 0 || subscribeToConnection();
131
+ };
132
+ }
109
133
  }
134
+
135
+ /** Type guard to check if a Node is an HTMLElement in a safe way. */
110
136
  return (0, _createClass2.default)(EmojiNodeView, [{
137
+ key: "isHTMLElement",
138
+ value: function isHTMLElement(element) {
139
+ if (element === null) {
140
+ return false;
141
+ }
142
+
143
+ // In SSR `HTMLElement` is not defined, so we need to use duck typing here
144
+ return 'innerHTML' in element && 'style' in element && 'classList' in element;
145
+ }
146
+ }, {
111
147
  key: "updateDom",
112
148
  value: function () {
113
149
  var _updateDom = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(emojiProvider) {
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.EmojiNodeDataProvider = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+ var _nodeDataProvider = require("@atlaskit/node-data-provider");
17
+ 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)); }
18
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
19
+ var EmojiNodeDataProvider = exports.EmojiNodeDataProvider = /*#__PURE__*/function (_NodeDataProvider) {
20
+ function EmojiNodeDataProvider(resource) {
21
+ var _this;
22
+ (0, _classCallCheck2.default)(this, EmojiNodeDataProvider);
23
+ _this = _callSuper(this, EmojiNodeDataProvider);
24
+ (0, _defineProperty2.default)(_this, "name", 'emojiNodeDataProvider');
25
+ _this.emojiProvider = resource.getEmojiProvider();
26
+ return _this;
27
+ }
28
+ (0, _inherits2.default)(EmojiNodeDataProvider, _NodeDataProvider);
29
+ return (0, _createClass2.default)(EmojiNodeDataProvider, [{
30
+ key: "isNodeSupported",
31
+ value: function isNodeSupported(node) {
32
+ return node.type === 'emoji';
33
+ }
34
+ }, {
35
+ key: "nodeDataKey",
36
+ value: function nodeDataKey(node) {
37
+ var _node$attrs$id;
38
+ return (_node$attrs$id = node.attrs.id) !== null && _node$attrs$id !== void 0 ? _node$attrs$id : node.attrs.shortName;
39
+ }
40
+ }, {
41
+ key: "fetchNodesData",
42
+ value: function () {
43
+ var _fetchNodesData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(nodes) {
44
+ var emojiProvider, fetches;
45
+ return _regenerator.default.wrap(function _callee$(_context) {
46
+ while (1) switch (_context.prev = _context.next) {
47
+ case 0:
48
+ _context.next = 2;
49
+ return this.emojiProvider;
50
+ case 2:
51
+ emojiProvider = _context.sent;
52
+ fetches = nodes.map(function (node) {
53
+ return emojiProvider.fetchByEmojiId({
54
+ id: node.attrs.id,
55
+ shortName: node.attrs.shortName,
56
+ fallback: node.attrs.text
57
+ }, true);
58
+ });
59
+ return _context.abrupt("return", Promise.all(fetches));
60
+ case 5:
61
+ case "end":
62
+ return _context.stop();
63
+ }
64
+ }, _callee, this);
65
+ }));
66
+ function fetchNodesData(_x) {
67
+ return _fetchNodesData.apply(this, arguments);
68
+ }
69
+ return fetchNodesData;
70
+ }()
71
+ }]);
72
+ }(_nodeDataProvider.NodeDataProvider);
@@ -511,7 +511,8 @@ function createEmojiPlugin(pmPluginFactoryParams, options, api) {
511
511
  emoji: node => {
512
512
  return new EmojiNodeView(node, {
513
513
  intl: pmPluginFactoryParams.getIntl(),
514
- api
514
+ api,
515
+ emojiNodeDataProvider: options === null || options === void 0 ? void 0 : options.emojiNodeDataProvider
515
516
  });
516
517
  }
517
518
  }
@@ -1,4 +1,10 @@
1
1
  /* eslint-disable @atlaskit/editor/no-re-export */
2
2
  // Entry file in package.json
3
3
 
4
- export { emojiPlugin } from './emojiPlugin';
4
+ export { emojiPlugin } from './emojiPlugin';
5
+
6
+ // It would be nice to be able to export the provider that needs for the plugin from
7
+ // ./providers/..., but it's forbidden by https://hello.atlassian.net/wiki/spaces/EDITOR/pages/4106313244/EES+Proposal+003+Editor+Plugins+Standards.
8
+ // So provider will be in ./pm-plugins/providers and we re-export it here with eslint ignore =(
9
+ // eslint-disable-next-line @atlaskit/editor/only-export-plugin
10
+ export { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
@@ -3,6 +3,7 @@ import { isSSR } from '@atlaskit/editor-common/core-utils';
3
3
  import { messages, EmojiSharedCssClassName, defaultEmojiHeight } from '@atlaskit/editor-common/emoji';
4
4
  import { logException } from '@atlaskit/editor-common/monitoring';
5
5
  import { DOMSerializer } from '@atlaskit/editor-prosemirror/model';
6
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
6
7
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
7
8
  import { emojiToDom } from './emojiNodeSpec';
8
9
  /**
@@ -39,15 +40,16 @@ export class EmojiNodeView {
39
40
  * @param extraProps - An object containing additional parameters.
40
41
  * @param extraProps.intl - The internationalization object for formatting messages.
41
42
  * @param extraProps.api - The editor API for accessing shared state and connectivity features.
43
+ * @param extraProps.emojiNodeDataProvider - (Optional) A provider for fetching emoji data.
42
44
  *
43
45
  * @example
44
- * const emojiNodeView = new EmojiNodeView(node, { intl, api });
46
+ * const emojiNodeView = new EmojiNodeView(node, { intl, api, emojiNodeDataProvider });
45
47
  */
46
48
  constructor(node, {
47
49
  intl,
48
- api
50
+ api,
51
+ emojiNodeDataProvider
49
52
  }) {
50
- var _api$emoji, _sharedState$currentS, _api$connectivity;
51
53
  _defineProperty(this, "renderingFallback", false);
52
54
  _defineProperty(this, "destroy", () => {});
53
55
  this.node = node;
@@ -56,50 +58,84 @@ export class EmojiNodeView {
56
58
  dom
57
59
  } = DOMSerializer.renderSpec(document, emojiToDom(this.node));
58
60
  this.dom = dom;
59
- this.domElement = dom instanceof HTMLElement ? dom : undefined;
60
- if (isSSR()) {
61
- // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
62
- // that's why we don't need to continue node rendering.
63
- // In SSR we want to show a placeholder, that `emojiToDom()` returns.
64
- return;
65
- }
66
-
67
- // We use the `emojiProvider` from the shared state
68
- // because it supports the `emojiProvider` prop in the `ComposableEditor` options
69
- // as well as the `emojiProvider` in the `EmojiPlugin` options.
70
- const sharedState = api === null || api === void 0 ? void 0 : (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
71
- if (!sharedState) {
72
- return;
73
- }
74
- let emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
75
- if (emojiProvider) {
76
- void this.updateDom(emojiProvider);
77
- }
78
- const unsubscribe = sharedState.onChange(({
79
- nextSharedState
80
- }) => {
81
- if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
82
- // Do not update if the provider is the same
61
+ this.domElement = expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && this.isHTMLElement(dom) || !expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && dom instanceof HTMLElement ? dom : undefined;
62
+ if (expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && emojiNodeDataProvider) {
63
+ emojiNodeDataProvider.getData(node, payload => {
64
+ if (payload.error) {
65
+ EmojiNodeView.logError(payload.error);
66
+ this.renderFallback();
67
+ return;
68
+ }
69
+ const emojiDescription = payload.data;
70
+ if (!emojiDescription) {
71
+ EmojiNodeView.logError(new Error('Emoji description is not loaded'));
72
+ this.renderFallback();
73
+ return;
74
+ }
75
+ const emojiRepresentation = emojiDescription === null || emojiDescription === void 0 ? void 0 : emojiDescription.representation;
76
+ if (!EmojiNodeView.isEmojiRepresentationSupported(emojiRepresentation)) {
77
+ EmojiNodeView.logError(new Error('Emoji representation is not supported'));
78
+ this.renderFallback();
79
+ return;
80
+ }
81
+ this.renderEmoji(emojiDescription, emojiRepresentation);
82
+ });
83
+ } else {
84
+ var _api$emoji, _sharedState$currentS, _api$connectivity;
85
+ if (isSSR()) {
86
+ // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
87
+ // that's why we don't need to continue node rendering.
88
+ // In SSR we want to show a placeholder, that `emojiToDom()` returns.
83
89
  return;
84
90
  }
85
- emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
86
- void this.updateDom(emojiProvider);
87
- });
88
91
 
89
- // Refresh emojis if we go back online
90
- const subscribeToConnection = api === null || api === void 0 ? void 0 : (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(({
91
- prevSharedState,
92
- nextSharedState
93
- }) => {
94
- if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && this.renderingFallback && editorExperiment('platform_editor_offline_editing_web', true)) {
95
- var _sharedState$currentS2;
96
- this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
92
+ // We use the `emojiProvider` from the shared state
93
+ // because it supports the `emojiProvider` prop in the `ComposableEditor` options
94
+ // as well as the `emojiProvider` in the `EmojiPlugin` options.
95
+ const sharedState = api === null || api === void 0 ? void 0 : (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
96
+ if (!sharedState) {
97
+ return;
97
98
  }
98
- });
99
- this.destroy = () => {
100
- unsubscribe();
101
- subscribeToConnection === null || subscribeToConnection === void 0 ? void 0 : subscribeToConnection();
102
- };
99
+ let emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
100
+ if (emojiProvider) {
101
+ void this.updateDom(emojiProvider);
102
+ }
103
+ const unsubscribe = sharedState.onChange(({
104
+ nextSharedState
105
+ }) => {
106
+ if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
107
+ // Do not update if the provider is the same
108
+ return;
109
+ }
110
+ emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
111
+ void this.updateDom(emojiProvider);
112
+ });
113
+
114
+ // Refresh emojis if we go back online
115
+ const subscribeToConnection = api === null || api === void 0 ? void 0 : (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(({
116
+ prevSharedState,
117
+ nextSharedState
118
+ }) => {
119
+ if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && this.renderingFallback && editorExperiment('platform_editor_offline_editing_web', true)) {
120
+ var _sharedState$currentS2;
121
+ this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
122
+ }
123
+ });
124
+ this.destroy = () => {
125
+ unsubscribe();
126
+ subscribeToConnection === null || subscribeToConnection === void 0 ? void 0 : subscribeToConnection();
127
+ };
128
+ }
129
+ }
130
+
131
+ /** Type guard to check if a Node is an HTMLElement in a safe way. */
132
+ isHTMLElement(element) {
133
+ if (element === null) {
134
+ return false;
135
+ }
136
+
137
+ // In SSR `HTMLElement` is not defined, so we need to use duck typing here
138
+ return 'innerHTML' in element && 'style' in element && 'classList' in element;
103
139
  }
104
140
  async updateDom(emojiProvider) {
105
141
  try {
@@ -0,0 +1,25 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import { NodeDataProvider } from '@atlaskit/node-data-provider';
3
+ export class EmojiNodeDataProvider extends NodeDataProvider {
4
+ constructor(resource) {
5
+ super();
6
+ _defineProperty(this, "name", 'emojiNodeDataProvider');
7
+ this.emojiProvider = resource.getEmojiProvider();
8
+ }
9
+ isNodeSupported(node) {
10
+ return node.type === 'emoji';
11
+ }
12
+ nodeDataKey(node) {
13
+ var _node$attrs$id;
14
+ return (_node$attrs$id = node.attrs.id) !== null && _node$attrs$id !== void 0 ? _node$attrs$id : node.attrs.shortName;
15
+ }
16
+ async fetchNodesData(nodes) {
17
+ const emojiProvider = await this.emojiProvider;
18
+ const fetches = nodes.map(node => emojiProvider.fetchByEmojiId({
19
+ id: node.attrs.id,
20
+ shortName: node.attrs.shortName,
21
+ fallback: node.attrs.text
22
+ }, true));
23
+ return Promise.all(fetches);
24
+ }
25
+ }
@@ -544,7 +544,8 @@ function createEmojiPlugin(pmPluginFactoryParams, options, api) {
544
544
  emoji: function emoji(node) {
545
545
  return new EmojiNodeView(node, {
546
546
  intl: pmPluginFactoryParams.getIntl(),
547
- api: api
547
+ api: api,
548
+ emojiNodeDataProvider: options === null || options === void 0 ? void 0 : options.emojiNodeDataProvider
548
549
  });
549
550
  }
550
551
  }
package/dist/esm/index.js CHANGED
@@ -1,4 +1,10 @@
1
1
  /* eslint-disable @atlaskit/editor/no-re-export */
2
2
  // Entry file in package.json
3
3
 
4
- export { emojiPlugin } from './emojiPlugin';
4
+ export { emojiPlugin } from './emojiPlugin';
5
+
6
+ // It would be nice to be able to export the provider that needs for the plugin from
7
+ // ./providers/..., but it's forbidden by https://hello.atlassian.net/wiki/spaces/EDITOR/pages/4106313244/EES+Proposal+003+Editor+Plugins+Standards.
8
+ // So provider will be in ./pm-plugins/providers and we re-export it here with eslint ignore =(
9
+ // eslint-disable-next-line @atlaskit/editor/only-export-plugin
10
+ export { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
@@ -7,6 +7,7 @@ import { isSSR } from '@atlaskit/editor-common/core-utils';
7
7
  import { messages, EmojiSharedCssClassName, defaultEmojiHeight } from '@atlaskit/editor-common/emoji';
8
8
  import { logException } from '@atlaskit/editor-common/monitoring';
9
9
  import { DOMSerializer } from '@atlaskit/editor-prosemirror/model';
10
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
10
11
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
11
12
  import { emojiToDom } from './emojiNodeSpec';
12
13
  /**
@@ -37,17 +38,16 @@ export var EmojiNodeView = /*#__PURE__*/function () {
37
38
  * @param extraProps - An object containing additional parameters.
38
39
  * @param extraProps.intl - The internationalization object for formatting messages.
39
40
  * @param extraProps.api - The editor API for accessing shared state and connectivity features.
41
+ * @param extraProps.emojiNodeDataProvider - (Optional) A provider for fetching emoji data.
40
42
  *
41
43
  * @example
42
- * const emojiNodeView = new EmojiNodeView(node, { intl, api });
44
+ * const emojiNodeView = new EmojiNodeView(node, { intl, api, emojiNodeDataProvider });
43
45
  */
44
46
  function EmojiNodeView(node, _ref) {
45
- var _api$emoji,
46
- _sharedState$currentS,
47
- _this = this,
48
- _api$connectivity;
47
+ var _this = this;
49
48
  var intl = _ref.intl,
50
- api = _ref.api;
49
+ api = _ref.api,
50
+ emojiNodeDataProvider = _ref.emojiNodeDataProvider;
51
51
  _classCallCheck(this, EmojiNodeView);
52
52
  _defineProperty(this, "renderingFallback", false);
53
53
  _defineProperty(this, "destroy", function () {});
@@ -56,50 +56,86 @@ export var EmojiNodeView = /*#__PURE__*/function () {
56
56
  var _DOMSerializer$render = DOMSerializer.renderSpec(document, emojiToDom(this.node)),
57
57
  dom = _DOMSerializer$render.dom;
58
58
  this.dom = dom;
59
- this.domElement = dom instanceof HTMLElement ? dom : undefined;
60
- if (isSSR()) {
61
- // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
62
- // that's why we don't need to continue node rendering.
63
- // In SSR we want to show a placeholder, that `emojiToDom()` returns.
64
- return;
65
- }
66
-
67
- // We use the `emojiProvider` from the shared state
68
- // because it supports the `emojiProvider` prop in the `ComposableEditor` options
69
- // as well as the `emojiProvider` in the `EmojiPlugin` options.
70
- var sharedState = api === null || api === void 0 || (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
71
- if (!sharedState) {
72
- return;
73
- }
74
- var emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
75
- if (emojiProvider) {
76
- void this.updateDom(emojiProvider);
77
- }
78
- var unsubscribe = sharedState.onChange(function (_ref2) {
79
- var nextSharedState = _ref2.nextSharedState;
80
- if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
81
- // Do not update if the provider is the same
59
+ this.domElement = expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && this.isHTMLElement(dom) || !expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && dom instanceof HTMLElement ? dom : undefined;
60
+ if (expValEquals('platform_editor_emoji_otp', 'isEnabled', true) && emojiNodeDataProvider) {
61
+ emojiNodeDataProvider.getData(node, function (payload) {
62
+ if (payload.error) {
63
+ EmojiNodeView.logError(payload.error);
64
+ _this.renderFallback();
65
+ return;
66
+ }
67
+ var emojiDescription = payload.data;
68
+ if (!emojiDescription) {
69
+ EmojiNodeView.logError(new Error('Emoji description is not loaded'));
70
+ _this.renderFallback();
71
+ return;
72
+ }
73
+ var emojiRepresentation = emojiDescription === null || emojiDescription === void 0 ? void 0 : emojiDescription.representation;
74
+ if (!EmojiNodeView.isEmojiRepresentationSupported(emojiRepresentation)) {
75
+ EmojiNodeView.logError(new Error('Emoji representation is not supported'));
76
+ _this.renderFallback();
77
+ return;
78
+ }
79
+ _this.renderEmoji(emojiDescription, emojiRepresentation);
80
+ });
81
+ } else {
82
+ var _api$emoji, _sharedState$currentS, _api$connectivity;
83
+ if (isSSR()) {
84
+ // The provider doesn't work in SSR, and we don't want to render fallback in SSR,
85
+ // that's why we don't need to continue node rendering.
86
+ // In SSR we want to show a placeholder, that `emojiToDom()` returns.
82
87
  return;
83
88
  }
84
- emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
85
- void _this.updateDom(emojiProvider);
86
- });
87
89
 
88
- // Refresh emojis if we go back online
89
- var subscribeToConnection = api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(function (_ref3) {
90
- var prevSharedState = _ref3.prevSharedState,
91
- nextSharedState = _ref3.nextSharedState;
92
- if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && _this.renderingFallback && editorExperiment('platform_editor_offline_editing_web', true)) {
93
- var _sharedState$currentS2;
94
- _this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
90
+ // We use the `emojiProvider` from the shared state
91
+ // because it supports the `emojiProvider` prop in the `ComposableEditor` options
92
+ // as well as the `emojiProvider` in the `EmojiPlugin` options.
93
+ var sharedState = api === null || api === void 0 || (_api$emoji = api.emoji) === null || _api$emoji === void 0 ? void 0 : _api$emoji.sharedState;
94
+ if (!sharedState) {
95
+ return;
95
96
  }
96
- });
97
- this.destroy = function () {
98
- unsubscribe();
99
- subscribeToConnection === null || subscribeToConnection === void 0 || subscribeToConnection();
100
- };
97
+ var emojiProvider = (_sharedState$currentS = sharedState.currentState()) === null || _sharedState$currentS === void 0 ? void 0 : _sharedState$currentS.emojiProvider;
98
+ if (emojiProvider) {
99
+ void this.updateDom(emojiProvider);
100
+ }
101
+ var unsubscribe = sharedState.onChange(function (_ref2) {
102
+ var nextSharedState = _ref2.nextSharedState;
103
+ if (emojiProvider === (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider)) {
104
+ // Do not update if the provider is the same
105
+ return;
106
+ }
107
+ emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
108
+ void _this.updateDom(emojiProvider);
109
+ });
110
+
111
+ // Refresh emojis if we go back online
112
+ var subscribeToConnection = api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.sharedState.onChange(function (_ref3) {
113
+ var prevSharedState = _ref3.prevSharedState,
114
+ nextSharedState = _ref3.nextSharedState;
115
+ if ((prevSharedState === null || prevSharedState === void 0 ? void 0 : prevSharedState.mode) === 'offline' && (nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.mode) === 'online' && _this.renderingFallback && editorExperiment('platform_editor_offline_editing_web', true)) {
116
+ var _sharedState$currentS2;
117
+ _this.updateDom((_sharedState$currentS2 = sharedState.currentState()) === null || _sharedState$currentS2 === void 0 ? void 0 : _sharedState$currentS2.emojiProvider);
118
+ }
119
+ });
120
+ this.destroy = function () {
121
+ unsubscribe();
122
+ subscribeToConnection === null || subscribeToConnection === void 0 || subscribeToConnection();
123
+ };
124
+ }
101
125
  }
126
+
127
+ /** Type guard to check if a Node is an HTMLElement in a safe way. */
102
128
  return _createClass(EmojiNodeView, [{
129
+ key: "isHTMLElement",
130
+ value: function isHTMLElement(element) {
131
+ if (element === null) {
132
+ return false;
133
+ }
134
+
135
+ // In SSR `HTMLElement` is not defined, so we need to use duck typing here
136
+ return 'innerHTML' in element && 'style' in element && 'classList' in element;
137
+ }
138
+ }, {
103
139
  key: "updateDom",
104
140
  value: function () {
105
141
  var _updateDom = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(emojiProvider) {
@@ -0,0 +1,65 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
5
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
6
+ import _inherits from "@babel/runtime/helpers/inherits";
7
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
9
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
10
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
+ import { NodeDataProvider } from '@atlaskit/node-data-provider';
12
+ export var EmojiNodeDataProvider = /*#__PURE__*/function (_NodeDataProvider) {
13
+ function EmojiNodeDataProvider(resource) {
14
+ var _this;
15
+ _classCallCheck(this, EmojiNodeDataProvider);
16
+ _this = _callSuper(this, EmojiNodeDataProvider);
17
+ _defineProperty(_this, "name", 'emojiNodeDataProvider');
18
+ _this.emojiProvider = resource.getEmojiProvider();
19
+ return _this;
20
+ }
21
+ _inherits(EmojiNodeDataProvider, _NodeDataProvider);
22
+ return _createClass(EmojiNodeDataProvider, [{
23
+ key: "isNodeSupported",
24
+ value: function isNodeSupported(node) {
25
+ return node.type === 'emoji';
26
+ }
27
+ }, {
28
+ key: "nodeDataKey",
29
+ value: function nodeDataKey(node) {
30
+ var _node$attrs$id;
31
+ return (_node$attrs$id = node.attrs.id) !== null && _node$attrs$id !== void 0 ? _node$attrs$id : node.attrs.shortName;
32
+ }
33
+ }, {
34
+ key: "fetchNodesData",
35
+ value: function () {
36
+ var _fetchNodesData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(nodes) {
37
+ var emojiProvider, fetches;
38
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
39
+ while (1) switch (_context.prev = _context.next) {
40
+ case 0:
41
+ _context.next = 2;
42
+ return this.emojiProvider;
43
+ case 2:
44
+ emojiProvider = _context.sent;
45
+ fetches = nodes.map(function (node) {
46
+ return emojiProvider.fetchByEmojiId({
47
+ id: node.attrs.id,
48
+ shortName: node.attrs.shortName,
49
+ fallback: node.attrs.text
50
+ }, true);
51
+ });
52
+ return _context.abrupt("return", Promise.all(fetches));
53
+ case 5:
54
+ case "end":
55
+ return _context.stop();
56
+ }
57
+ }, _callee, this);
58
+ }));
59
+ function fetchNodesData(_x) {
60
+ return _fetchNodesData.apply(this, arguments);
61
+ }
62
+ return fetchNodesData;
63
+ }()
64
+ }]);
65
+ }(NodeDataProvider);
@@ -9,6 +9,7 @@ import type { MetricsPlugin } from '@atlaskit/editor-plugin-metrics';
9
9
  import type { TypeAheadInputMethod, TypeAheadPlugin } from '@atlaskit/editor-plugin-type-ahead';
10
10
  import type { SelectionBookmark } from '@atlaskit/editor-prosemirror/state';
11
11
  import type { EmojiDescription, EmojiId, EmojiProvider, EmojiResourceConfig } from '@atlaskit/emoji';
12
+ import type { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
12
13
  type SetInlineCommentDraftState = (drafting: boolean, inputMethod: InlineCommentInputMethod) => Command;
13
14
  type AnnotationPluginType = NextEditorPlugin<'annotation', {
14
15
  actions: {
@@ -27,6 +28,7 @@ type EditorViewModePluginType = NextEditorPlugin<'editorViewMode', {
27
28
  sharedState: EditorViewModePluginState;
28
29
  }>;
29
30
  export interface EmojiPluginOptions {
31
+ emojiNodeDataProvider?: EmojiNodeDataProvider;
30
32
  emojiProvider?: Promise<EmojiProvider>;
31
33
  headless?: boolean;
32
34
  }
@@ -1,2 +1,3 @@
1
1
  export type { EmojiPlugin, EmojiPluginOptions, EmojiPluginState, EmojiPluginSharedState, EmojiPluginDependencies, EmojiPluginActions, EmojiPluginCommands, } from './emojiPluginType';
2
2
  export { emojiPlugin } from './emojiPlugin';
3
+ export { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
@@ -3,8 +3,10 @@ import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
3
3
  import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
4
4
  import type { NodeView } from '@atlaskit/editor-prosemirror/view';
5
5
  import type { EmojiPlugin } from '../emojiPluginType';
6
+ import type { EmojiNodeDataProvider } from '../pm-plugins/providers/EmojiNodeDataProvider';
6
7
  interface Params {
7
8
  api: ExtractInjectionAPI<EmojiPlugin> | undefined;
9
+ emojiNodeDataProvider?: EmojiNodeDataProvider;
8
10
  intl: IntlShape;
9
11
  }
10
12
  /**
@@ -35,11 +37,14 @@ export declare class EmojiNodeView implements NodeView {
35
37
  * @param extraProps - An object containing additional parameters.
36
38
  * @param extraProps.intl - The internationalization object for formatting messages.
37
39
  * @param extraProps.api - The editor API for accessing shared state and connectivity features.
40
+ * @param extraProps.emojiNodeDataProvider - (Optional) A provider for fetching emoji data.
38
41
  *
39
42
  * @example
40
- * const emojiNodeView = new EmojiNodeView(node, { intl, api });
43
+ * const emojiNodeView = new EmojiNodeView(node, { intl, api, emojiNodeDataProvider });
41
44
  */
42
- constructor(node: PMNode, { intl, api }: Params);
45
+ constructor(node: PMNode, { intl, api, emojiNodeDataProvider }: Params);
46
+ /** Type guard to check if a Node is an HTMLElement in a safe way. */
47
+ private isHTMLElement;
43
48
  private updateDom;
44
49
  private static isEmojiRepresentationSupported;
45
50
  private cleanUpAndRenderCommonAttributes;
@@ -0,0 +1,12 @@
1
+ import type { EmojiDefinition } from '@atlaskit/adf-schema';
2
+ import type { JSONNode } from '@atlaskit/editor-json-transformer';
3
+ import type { EmojiResource, OptionalEmojiDescriptionWithVariations } from '@atlaskit/emoji';
4
+ import { NodeDataProvider } from '@atlaskit/node-data-provider';
5
+ export declare class EmojiNodeDataProvider extends NodeDataProvider<EmojiDefinition, OptionalEmojiDescriptionWithVariations> {
6
+ name: "emojiNodeDataProvider";
7
+ private readonly emojiProvider;
8
+ constructor(resource: EmojiResource);
9
+ isNodeSupported(node: JSONNode): node is EmojiDefinition;
10
+ nodeDataKey(node: EmojiDefinition): string;
11
+ fetchNodesData(nodes: EmojiDefinition[]): Promise<OptionalEmojiDescriptionWithVariations[]>;
12
+ }
@@ -9,6 +9,7 @@ import type { MetricsPlugin } from '@atlaskit/editor-plugin-metrics';
9
9
  import type { TypeAheadInputMethod, TypeAheadPlugin } from '@atlaskit/editor-plugin-type-ahead';
10
10
  import type { SelectionBookmark } from '@atlaskit/editor-prosemirror/state';
11
11
  import type { EmojiDescription, EmojiId, EmojiProvider, EmojiResourceConfig } from '@atlaskit/emoji';
12
+ import type { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
12
13
  type SetInlineCommentDraftState = (drafting: boolean, inputMethod: InlineCommentInputMethod) => Command;
13
14
  type AnnotationPluginType = NextEditorPlugin<'annotation', {
14
15
  actions: {
@@ -27,6 +28,7 @@ type EditorViewModePluginType = NextEditorPlugin<'editorViewMode', {
27
28
  sharedState: EditorViewModePluginState;
28
29
  }>;
29
30
  export interface EmojiPluginOptions {
31
+ emojiNodeDataProvider?: EmojiNodeDataProvider;
30
32
  emojiProvider?: Promise<EmojiProvider>;
31
33
  headless?: boolean;
32
34
  }
@@ -1,2 +1,3 @@
1
1
  export type { EmojiPlugin, EmojiPluginOptions, EmojiPluginState, EmojiPluginSharedState, EmojiPluginDependencies, EmojiPluginActions, EmojiPluginCommands, } from './emojiPluginType';
2
2
  export { emojiPlugin } from './emojiPlugin';
3
+ export { EmojiNodeDataProvider } from './pm-plugins/providers/EmojiNodeDataProvider';
@@ -3,8 +3,10 @@ import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
3
3
  import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
4
4
  import type { NodeView } from '@atlaskit/editor-prosemirror/view';
5
5
  import type { EmojiPlugin } from '../emojiPluginType';
6
+ import type { EmojiNodeDataProvider } from '../pm-plugins/providers/EmojiNodeDataProvider';
6
7
  interface Params {
7
8
  api: ExtractInjectionAPI<EmojiPlugin> | undefined;
9
+ emojiNodeDataProvider?: EmojiNodeDataProvider;
8
10
  intl: IntlShape;
9
11
  }
10
12
  /**
@@ -35,11 +37,14 @@ export declare class EmojiNodeView implements NodeView {
35
37
  * @param extraProps - An object containing additional parameters.
36
38
  * @param extraProps.intl - The internationalization object for formatting messages.
37
39
  * @param extraProps.api - The editor API for accessing shared state and connectivity features.
40
+ * @param extraProps.emojiNodeDataProvider - (Optional) A provider for fetching emoji data.
38
41
  *
39
42
  * @example
40
- * const emojiNodeView = new EmojiNodeView(node, { intl, api });
43
+ * const emojiNodeView = new EmojiNodeView(node, { intl, api, emojiNodeDataProvider });
41
44
  */
42
- constructor(node: PMNode, { intl, api }: Params);
45
+ constructor(node: PMNode, { intl, api, emojiNodeDataProvider }: Params);
46
+ /** Type guard to check if a Node is an HTMLElement in a safe way. */
47
+ private isHTMLElement;
43
48
  private updateDom;
44
49
  private static isEmojiRepresentationSupported;
45
50
  private cleanUpAndRenderCommonAttributes;
@@ -0,0 +1,12 @@
1
+ import type { EmojiDefinition } from '@atlaskit/adf-schema';
2
+ import type { JSONNode } from '@atlaskit/editor-json-transformer';
3
+ import type { EmojiResource, OptionalEmojiDescriptionWithVariations } from '@atlaskit/emoji';
4
+ import { NodeDataProvider } from '@atlaskit/node-data-provider';
5
+ export declare class EmojiNodeDataProvider extends NodeDataProvider<EmojiDefinition, OptionalEmojiDescriptionWithVariations> {
6
+ name: "emojiNodeDataProvider";
7
+ private readonly emojiProvider;
8
+ constructor(resource: EmojiResource);
9
+ isNodeSupported(node: JSONNode): node is EmojiDefinition;
10
+ nodeDataKey(node: EmojiDefinition): string;
11
+ fetchNodesData(nodes: EmojiDefinition[]): Promise<OptionalEmojiDescriptionWithVariations[]>;
12
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-emoji",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "Emoji plugin for @atlaskit/editor-core",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -23,7 +23,7 @@
23
23
  "dependencies": {
24
24
  "@atlaskit/adf-schema": "^51.1.2",
25
25
  "@atlaskit/editor-plugin-analytics": "^5.2.0",
26
- "@atlaskit/editor-plugin-annotation": "^5.3.0",
26
+ "@atlaskit/editor-plugin-annotation": "^5.4.0",
27
27
  "@atlaskit/editor-plugin-base": "^6.2.0",
28
28
  "@atlaskit/editor-plugin-editor-viewmode": "^7.0.0",
29
29
  "@atlaskit/editor-plugin-metrics": "^6.2.0",
@@ -31,11 +31,12 @@
31
31
  "@atlaskit/editor-prosemirror": "7.0.0",
32
32
  "@atlaskit/editor-shared-styles": "^3.6.0",
33
33
  "@atlaskit/emoji": "^69.5.0",
34
- "@atlaskit/icon": "^28.1.0",
34
+ "@atlaskit/icon": "^28.2.0",
35
+ "@atlaskit/node-data-provider": "^6.3.0",
35
36
  "@atlaskit/platform-feature-flags": "^1.1.0",
36
37
  "@atlaskit/prosemirror-input-rules": "^3.4.0",
37
38
  "@atlaskit/theme": "^21.0.0",
38
- "@atlaskit/tmp-editor-statsig": "^12.18.0",
39
+ "@atlaskit/tmp-editor-statsig": "^12.29.0",
39
40
  "@atlaskit/tokens": "^6.3.0",
40
41
  "@babel/runtime": "^7.0.0",
41
42
  "@emotion/react": "^11.7.1",
@@ -43,7 +44,7 @@
43
44
  "react-loadable": "^5.1.0"
44
45
  },
45
46
  "peerDependencies": {
46
- "@atlaskit/editor-common": "^109.5.0",
47
+ "@atlaskit/editor-common": "^109.13.0",
47
48
  "react": "^18.2.0",
48
49
  "react-dom": "^18.2.0"
49
50
  },
@@ -52,7 +53,6 @@
52
53
  "@atlaskit/editor-plugin-composition": "^4.0.0",
53
54
  "@atlaskit/editor-plugin-decorations": "^5.0.0",
54
55
  "@atlaskit/ssr": "workspace:^",
55
- "@atlaskit/util-data-test": "^18.2.0",
56
56
  "@testing-library/react": "^13.4.0",
57
57
  "wait-for-expect": "^1.2.0"
58
58
  },