@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 +12 -0
- package/dist/cjs/emojiPlugin.js +2 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/nodeviews/EmojiNodeView.js +80 -44
- package/dist/cjs/pm-plugins/providers/EmojiNodeDataProvider.js +72 -0
- package/dist/es2019/emojiPlugin.js +2 -1
- package/dist/es2019/index.js +7 -1
- package/dist/es2019/nodeviews/EmojiNodeView.js +79 -43
- package/dist/es2019/pm-plugins/providers/EmojiNodeDataProvider.js +25 -0
- package/dist/esm/emojiPlugin.js +2 -1
- package/dist/esm/index.js +7 -1
- package/dist/esm/nodeviews/EmojiNodeView.js +80 -44
- package/dist/esm/pm-plugins/providers/EmojiNodeDataProvider.js +65 -0
- package/dist/types/emojiPluginType.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/nodeviews/EmojiNodeView.d.ts +7 -2
- package/dist/types/pm-plugins/providers/EmojiNodeDataProvider.d.ts +12 -0
- package/dist/types-ts4.5/emojiPluginType.d.ts +2 -0
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/nodeviews/EmojiNodeView.d.ts +7 -2
- package/dist/types-ts4.5/pm-plugins/providers/EmojiNodeDataProvider.d.ts +12 -0
- package/package.json +6 -6
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
|
package/dist/cjs/emojiPlugin.js
CHANGED
|
@@ -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
|
|
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,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (
|
|
101
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
}
|
package/dist/es2019/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';
|
|
@@ -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 (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
+
}
|
package/dist/esm/emojiPlugin.js
CHANGED
|
@@ -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
|
|
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 (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (
|
|
93
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
},
|