@atlaskit/emoji 70.6.2 → 70.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/afm-cc/tsconfig.json +6 -0
  3. package/afm-products/tsconfig.json +6 -0
  4. package/dist/cjs/api/EmojiResource.js +23 -1
  5. package/dist/cjs/components/common/EmojiErrorMessage.js +5 -1
  6. package/dist/cjs/components/common/EmojiUploadPicker.compiled.css +3 -1
  7. package/dist/cjs/components/common/EmojiUploadPicker.js +28 -18
  8. package/dist/cjs/components/common/FileChooser.compiled.css +3 -3
  9. package/dist/cjs/components/common/FileChooser.js +2 -2
  10. package/dist/cjs/components/i18n.js +5 -0
  11. package/dist/cjs/components/picker/EmojiPickerComponent.js +54 -15
  12. package/dist/cjs/util/analytics/analytics.js +1 -1
  13. package/dist/cjs/util/constants.js +3 -0
  14. package/dist/es2019/api/EmojiResource.js +19 -1
  15. package/dist/es2019/components/common/EmojiErrorMessage.js +5 -1
  16. package/dist/es2019/components/common/EmojiUploadPicker.compiled.css +3 -1
  17. package/dist/es2019/components/common/EmojiUploadPicker.js +23 -12
  18. package/dist/es2019/components/common/FileChooser.compiled.css +3 -3
  19. package/dist/es2019/components/common/FileChooser.js +2 -2
  20. package/dist/es2019/components/i18n.js +5 -0
  21. package/dist/es2019/components/picker/EmojiPickerComponent.js +16 -1
  22. package/dist/es2019/util/analytics/analytics.js +1 -1
  23. package/dist/es2019/util/constants.js +3 -0
  24. package/dist/esm/api/EmojiResource.js +24 -2
  25. package/dist/esm/components/common/EmojiErrorMessage.js +5 -1
  26. package/dist/esm/components/common/EmojiUploadPicker.compiled.css +3 -1
  27. package/dist/esm/components/common/EmojiUploadPicker.js +29 -18
  28. package/dist/esm/components/common/FileChooser.compiled.css +3 -3
  29. package/dist/esm/components/common/FileChooser.js +2 -2
  30. package/dist/esm/components/i18n.js +5 -0
  31. package/dist/esm/components/picker/EmojiPickerComponent.js +54 -15
  32. package/dist/esm/util/analytics/analytics.js +1 -1
  33. package/dist/esm/util/constants.js +3 -0
  34. package/dist/types/components/i18n.d.ts +99 -94
  35. package/dist/types-ts4.5/components/i18n.d.ts +99 -94
  36. package/package.json +8 -3
@@ -7,16 +7,16 @@
7
7
  ._19bvutpp{padding-left:var(--ds-space-150,9pt)}
8
8
  ._1bah1h6o{justify-content:center}
9
9
  ._1e0c1txw{display:flex}
10
- ._1oec6ebc{transition-duration:.15s}
10
+ ._1oec1ign{transition-duration:var(--ds-duration-short,.15s)}
11
11
  ._2lx21bp4{flex-direction:column}
12
12
  ._4cvr1h6o{align-items:center}
13
13
  ._4t3i7l9q{height:170px}
14
14
  ._5ral1f51{object-fit:contain}
15
- ._6fl45ucs{transition-timing-function:ease}
15
+ ._6fl4574g{transition-timing-function:var(--ds-easing-out-practical,ease)}
16
16
  ._80omtlke{cursor:pointer}
17
17
  ._bfhkhfxm{background-color:var(--ds-surface-sunken,#f8f8f8)}
18
18
  ._bfhkufnl{background-color:var(--ds-background-selected-hovered,#cfe1fd)}
19
- ._c71lys9h{max-height:5pc}
19
+ ._c71l1j4a{max-height:130px}
20
20
  ._k8m01rje{transition-property:background-color,border-color}
21
21
  ._p12f1osq{max-width:100%}
22
22
  ._u5f3utpp{padding-right:var(--ds-space-150,9pt)}
@@ -100,11 +100,11 @@ const FileChooser = props => {
100
100
  "data-testid": dropzoneTestId,
101
101
  role: "region",
102
102
  "aria-label": label,
103
- className: ax(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec6ebc _6fl45ucs", isDragging && "_1h6dq98m _bfhkufnl"])
103
+ className: ax(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec1ign _6fl4574g", isDragging && "_1h6dq98m _bfhkufnl"])
104
104
  }, previewImage ? /*#__PURE__*/React.createElement("img", {
105
105
  src: previewImage,
106
106
  alt: previewAlt,
107
- className: ax(["_c71lys9h _p12f1osq _5ral1f51"])
107
+ className: ax(["_c71l1j4a _p12f1osq _5ral1f51"])
108
108
  }) : /*#__PURE__*/React.createElement(Button, {
109
109
  onClick: handleOnChooseFile,
110
110
  isDisabled: isDisabled,
@@ -210,6 +210,11 @@ export const messages = defineMessages({
210
210
  defaultMessage: 'Selected image is more than 1 MB',
211
211
  description: 'Error message for image too big, beyond the size limit'
212
212
  },
213
+ emojiDuplicateName: {
214
+ id: 'fabric.emoji.error.duplicate.name',
215
+ defaultMessage: 'An emoji with this name exists already',
216
+ description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
217
+ },
213
218
  emojiPickerTitle: {
214
219
  id: 'fabric.emoji.picker',
215
220
  defaultMessage: 'Emoji picker',
@@ -4,6 +4,7 @@ import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { useCallback, useEffect, useMemo, useRef, useState, createRef, memo } from 'react';
6
6
  import { fg } from '@atlaskit/platform-feature-flags';
7
+ import { getDocument } from '@atlaskit/browser-apis';
7
8
  import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
8
9
  import { FormattedMessage, useIntl } from 'react-intl';
9
10
  import { getEmojiVariation } from '../../api/EmojiRepository';
@@ -117,6 +118,12 @@ const EmojiPickerComponent = ({
117
118
  setUploadErrorMessage(undefined);
118
119
  });
119
120
  fireAnalytics(uploadCancelButton());
121
+ if (fg('platform_emoji_picker_refresh')) {
122
+ setTimeout(() => {
123
+ var _getDocument, _getDocument$getEleme;
124
+ (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : (_getDocument$getEleme = _getDocument.getElementById('add-custom-emoji')) === null || _getDocument$getEleme === void 0 ? void 0 : _getDocument$getEleme.focus();
125
+ }, 0);
126
+ }
120
127
  }, [fireAnalytics]);
121
128
  const getDynamicCategories = useCallback(() => {
122
129
  if (!emojiProvider.calculateDynamicCategories) {
@@ -328,7 +335,7 @@ const EmojiPickerComponent = ({
328
335
  }, 0);
329
336
  }
330
337
  }, [emojiPickerList]);
331
- const onUploadEmoji = useCallback((upload, retry) => {
338
+ const onUploadEmoji = useCallback(async (upload, retry) => {
332
339
  fireAnalytics(uploadConfirmButton({
333
340
  retry
334
341
  }));
@@ -343,6 +350,14 @@ const EmojiPickerComponent = ({
343
350
  });
344
351
  scrollToUploadedEmoji(emojiDescription);
345
352
  };
353
+ if (fg('platform_emoji_picker_refresh')) {
354
+ const uploadShortName = `:${upload.name.toLowerCase()}:`;
355
+ const existing = await emojiProvider.findByShortName(uploadShortName);
356
+ if (existing) {
357
+ errorSetter(messages.emojiDuplicateName);
358
+ return;
359
+ }
360
+ }
346
361
  uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
347
362
  }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
348
363
  const onTriggerDelete = useCallback((_emojiId, emoji) => {
@@ -9,7 +9,7 @@ const createEvent = (eventType, action, actionSubject, actionSubjectId, attribut
9
9
  actionSubjectId,
10
10
  attributes: {
11
11
  packageName: "@atlaskit/emoji",
12
- packageVersion: "70.6.1",
12
+ packageVersion: "70.7.0",
13
13
  ...attributes
14
14
  }
15
15
  });
@@ -13,6 +13,9 @@ export const deleteEmojiLabel = 'delete-emoji';
13
13
  * This is used instead of Number.MAX_VALUE since subtraction of MAX_VALUE from itself occassionaly doesn't equal zero exactly :-(
14
14
  */
15
15
  export const MAX_ORDINAL = 100000;
16
+
17
+ // Constant variables here has been inlined in css from EditorContentContainer, if you need to make
18
+ // update here, please also update packages/editor/editor-core/src/ui/EditorContentContainer/EditorContentContainer-compiled.tsx
16
19
  export const scaledEmojiHeightH1 = 28;
17
20
  export const scaledEmojiHeightH2 = 26;
18
21
  export const scaledEmojiHeightH3 = 24;
@@ -6,9 +6,9 @@ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
6
6
  import _get from "@babel/runtime/helpers/get";
7
7
  import _inherits from "@babel/runtime/helpers/inherits";
8
8
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
9
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
- import _regeneratorRuntime from "@babel/runtime/regenerator";
12
12
  function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
13
13
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
14
14
  function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
@@ -61,7 +61,29 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
61
61
  _defineProperty(_this, "isLoaded", function () {
62
62
  return _this.initialLoaders !== 0 && _this.activeLoaders === 0;
63
63
  });
64
- _this.emojiProviderConfig = config;
64
+ var rewriteEmojiGatewayPath = function rewriteEmojiGatewayPath(url) {
65
+ return url.replace('/gateway/api/emoji', '/gateway/api/elements/emoji');
66
+ };
67
+ var stargateEmojiPathEnabled = fg('use-elements-stargate-emoji-path');
68
+ var singleEmojiApi = config.singleEmojiApi;
69
+ var optimisticImageApi = config.optimisticImageApi;
70
+ _this.emojiProviderConfig = stargateEmojiPathEnabled ? _objectSpread(_objectSpread({}, config), {}, {
71
+ providers: config.providers.map(function (provider) {
72
+ return _objectSpread(_objectSpread({}, provider), {}, {
73
+ url: rewriteEmojiGatewayPath(provider.url)
74
+ });
75
+ }),
76
+ singleEmojiApi: singleEmojiApi ? _objectSpread(_objectSpread({}, singleEmojiApi), {}, {
77
+ getUrl: function getUrl(emojiId) {
78
+ return rewriteEmojiGatewayPath(singleEmojiApi.getUrl(emojiId));
79
+ }
80
+ }) : undefined,
81
+ optimisticImageApi: optimisticImageApi ? _objectSpread(_objectSpread({}, optimisticImageApi), {}, {
82
+ getUrl: function getUrl(emojiId) {
83
+ return rewriteEmojiGatewayPath(optimisticImageApi.getUrl(emojiId));
84
+ }
85
+ }) : undefined
86
+ }) : config;
65
87
  _this.recordConfig = config.recordConfig;
66
88
  _this.currentUser = config.currentUser;
67
89
  if (storageAvailable('localStorage')) {
@@ -2,8 +2,10 @@
2
2
  import "./EmojiErrorMessage.compiled.css";
3
3
  import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
+ import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import Tooltip from '@atlaskit/tooltip';
6
7
  import ErrorIcon from '@atlaskit/icon/core/status-error';
8
+ import { ErrorMessage } from '@atlaskit/form';
7
9
  import { useIntl } from 'react-intl';
8
10
  import { messages } from '../i18n';
9
11
  var errorMessageStyles = {
@@ -33,7 +35,9 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
33
35
  label: formatMessage(messages.error),
34
36
  spacing: "spacious",
35
37
  testId: emojiErrorIconTestId
36
- }))) : /*#__PURE__*/React.createElement("div", {
38
+ }))) : fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement("div", {
39
+ "data-testid": emojiErrorMessageTestId
40
+ }, /*#__PURE__*/React.createElement(ErrorMessage, null, message)) : /*#__PURE__*/React.createElement("div", {
37
41
  "data-testid": emojiErrorMessageTestId,
38
42
  className: ax([errorMessageStyles[errorStyle]])
39
43
  }, /*#__PURE__*/React.createElement(ErrorIcon, {
@@ -1,6 +1,6 @@
1
1
  ._11c8wadc{font:var(--ds-font-body-small,normal 400 9pt/1pc "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
2
2
  ._scffidpf input{border:0}
3
- ._zulppxbi{gap:var(--ds-space-200,1pc)}
3
+ ._zulp12x7{gap:var(--ds-space-075,6px)}
4
4
  ._zulpu2gc{gap:var(--ds-space-100,8px)}
5
5
  ._16jlkb7n{flex-grow:1}
6
6
  ._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
@@ -11,6 +11,7 @@
11
11
  ._1e0c1txw{display:flex}
12
12
  ._1o9zkb7n{flex-shrink:1}
13
13
  ._1rwq1j28 input{background-color:transparent}
14
+ ._1tker0r7{min-height:250px}
14
15
  ._1w90azsu._1w90azsu{color:var(--ds-text-subtle,#505258)}
15
16
  ._2lx21bp4{flex-direction:column}
16
17
  ._34ir1o36 input{outline-width:medium}
@@ -26,6 +27,7 @@
26
27
  ._k48p1pd9{font-weight:var(--ds-font-weight-semibold,600)}
27
28
  ._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
28
29
  ._n3tdu2gc{padding-bottom:var(--ds-space-100,8px)}
30
+ ._n3tdv77o{padding-bottom:var(--ds-space-025,2px)}
29
31
  ._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
30
32
  ._u5f3u2gc{padding-right:var(--ds-space-100,8px)}
31
33
  ._xmji1r31 input{outline-color:currentColor}
@@ -21,11 +21,14 @@ import FileChooser from './FileChooser';
21
21
  import { UploadStatus } from './internal-types';
22
22
  import { fg } from '@atlaskit/platform-feature-flags';
23
23
  import Button from '@atlaskit/button/new';
24
+ import { Box } from '@atlaskit/primitives/compiled';
25
+ import { getDocument } from '@atlaskit/browser-apis';
24
26
  var closeEmojiUploadButton = null;
25
27
  var uploadAddRowNew = null;
26
28
  var emojiUpload = null;
27
29
  var emojiUploadNew = null;
28
30
  var emojiUploadTop = null;
31
+ var emojiUploadTopNew = null;
29
32
  var labelStyles = null;
30
33
  var uploadChooseFileEmojiName = null;
31
34
  var uploadChooseFileMessage = null;
@@ -56,6 +59,7 @@ var ChooseEmojiFile = /*#__PURE__*/memo(function (props) {
56
59
  onUploadCancelled = props.onUploadCancelled,
57
60
  onAddEmoji = props.onAddEmoji,
58
61
  errorMessage = props.errorMessage,
62
+ nameErrorMessage = props.nameErrorMessage,
59
63
  previewImage = props.previewImage,
60
64
  uploadStatus = props.uploadStatus,
61
65
  intl = props.intl;
@@ -84,13 +88,13 @@ var ChooseEmojiFile = /*#__PURE__*/memo(function (props) {
84
88
  "data-testid": uploadEmojiComponentTestId,
85
89
  className: ax(["_ca0qu2gc _u5f3pxbi _n3tdu2gc _19bvpxbi _1e0c1txw _2lx21bp4 _1bah1b1v"])
86
90
  }, /*#__PURE__*/React.createElement("div", {
87
- className: ax(["_11c8wadc _n3tdu2gc _1e0c1txw _1bah1yb4 _4cvresu3"])
91
+ className: ax(["_11c8wadc _n3tdv77o _1e0c1txw _1bah1yb4 _4cvresu3"])
88
92
  }, /*#__PURE__*/React.createElement("label", {
89
93
  htmlFor: "new-emoji-name-input",
90
94
  className: ax(["_1w90azsu", "_11c8wadc _k48p1pd9"])
91
95
  }, previewImage ? /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiPreviewTitle) : /*#__PURE__*/React.createElement(FormattedMessage, messages.addCustomEmojiLabel))), /*#__PURE__*/React.createElement("div", {
92
- className: ax(["_zulppxbi _1e0c1txw _2lx21bp4 _n3tdu2gc"])
93
- }, /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, function () {
96
+ className: ax(["_zulp12x7 _1e0c1txw _2lx21bp4 _1tker0r7"])
97
+ }, /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, function () {
94
98
  return /*#__PURE__*/React.createElement(FileChooser, {
95
99
  label: emojiChooseFileTitle,
96
100
  onChange: onChooseFile,
@@ -100,7 +104,12 @@ var ChooseEmojiFile = /*#__PURE__*/memo(function (props) {
100
104
  previewImage: previewImage,
101
105
  previewAlt: name
102
106
  });
103
- })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
107
+ }), /*#__PURE__*/React.createElement("div", {
108
+ id: fileChooserButtonDescriptionId
109
+ }, errorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
110
+ errorStyle: "chooseFile",
111
+ message: errorMessage
112
+ }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
104
113
  htmlFor: "new-emoji-name-input",
105
114
  className: ax(["_1w90azsu", "_11c8wadc _k48p1pd9"])
106
115
  }, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiNameLabel)), /*#__PURE__*/React.createElement(TextField, {
@@ -112,16 +121,15 @@ var ChooseEmojiFile = /*#__PURE__*/memo(function (props) {
112
121
  value: name,
113
122
  isCompact: true,
114
123
  autoFocus: true,
124
+ isInvalid: !!nameErrorMessage,
115
125
  testId: uploadEmojiNameInputTestId,
116
126
  ref: inputRef,
117
127
  id: "new-emoji-name-input",
118
128
  "aria-required": true
119
- }))), /*#__PURE__*/React.createElement("div", {
120
- id: fileChooserButtonDescriptionId
121
- }, errorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
129
+ }), nameErrorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
122
130
  errorStyle: "chooseFile",
123
- message: errorMessage
124
- })), /*#__PURE__*/React.createElement("div", {
131
+ message: nameErrorMessage
132
+ }))), /*#__PURE__*/React.createElement("div", {
125
133
  className: ax(["_zulpu2gc _1e0c1txw _1bahesu3 _4cvr1h6o _ca0qpxbi _n3td1ejb"])
126
134
  }, /*#__PURE__*/React.createElement(Button, {
127
135
  onClick: onUploadCancelled,
@@ -299,18 +307,19 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
299
307
  return ImageUtil.parseImage(f.target.result);
300
308
  case 4:
301
309
  setPreviewImage(f.target.result);
302
- _context.next = 11;
310
+ setChooseEmojiErrorMessage(undefined);
311
+ _context.next = 12;
303
312
  break;
304
- case 7:
305
- _context.prev = 7;
313
+ case 8:
314
+ _context.prev = 8;
306
315
  _context.t0 = _context["catch"](0);
307
316
  setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiInvalidImage));
308
317
  cancelChooseFile();
309
- case 11:
318
+ case 12:
310
319
  case "end":
311
320
  return _context.stop();
312
321
  }
313
- }, _callee, null, [[0, 7]]);
322
+ }, _callee, null, [[0, 8]]);
314
323
  }));
315
324
  return function (_x) {
316
325
  return _ref.apply(this, arguments);
@@ -342,15 +351,16 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
342
351
  // using setTimeout here to allow the UI to update before setting focus
343
352
  setTimeout(function (lastFocus) {
344
353
  if (lastFocus) {
345
- var _document$getElementB;
346
- (_document$getElementB = document.getElementById(lastFocus)) === null || _document$getElementB === void 0 || _document$getElementB.focus();
354
+ var _getDocument;
355
+ (_getDocument = getDocument()) === null || _getDocument === void 0 || (_getDocument = _getDocument.getElementById(lastFocus)) === null || _getDocument === void 0 || _getDocument.focus();
347
356
  }
348
357
  }, 0, lastFocusedElementId.current);
349
358
  }, [clearUploadPicker, onUploadCancelled]);
350
359
  var onChooseFileClicked = function onChooseFileClicked() {
351
360
  onFileChooserClicked && onFileChooserClicked();
352
361
  };
353
- var content = !fg('platform_emoji_picker_refresh') && name && previewImage ? /*#__PURE__*/React.createElement(EmojiUploadPreview, {
362
+ var isDuplicateNameError = errorMessage !== null && errorMessage !== undefined && fg('platform_emoji_picker_refresh');
363
+ var content = name && previewImage && !fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement(EmojiUploadPreview, {
354
364
  errorMessage: errorMessage,
355
365
  name: name,
356
366
  onAddEmoji: onAddEmoji,
@@ -367,9 +377,10 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
367
377
  previewImage: previewImage,
368
378
  uploadStatus: uploadStatus,
369
379
  errorMessage: chooseEmojiErrorMessage,
380
+ nameErrorMessage: isDuplicateNameError ? errorMessage : undefined,
370
381
  intl: intl
371
382
  });
372
- return disableFocusLock ? content : /*#__PURE__*/React.createElement(FocusLock, {
383
+ return disableFocusLock || fg('platform_emoji_picker_refresh') ? content : /*#__PURE__*/React.createElement(FocusLock, {
373
384
  noFocusGuards: true
374
385
  }, content);
375
386
  };
@@ -7,16 +7,16 @@
7
7
  ._19bvutpp{padding-left:var(--ds-space-150,9pt)}
8
8
  ._1bah1h6o{justify-content:center}
9
9
  ._1e0c1txw{display:flex}
10
- ._1oec6ebc{transition-duration:.15s}
10
+ ._1oec1ign{transition-duration:var(--ds-duration-short,.15s)}
11
11
  ._2lx21bp4{flex-direction:column}
12
12
  ._4cvr1h6o{align-items:center}
13
13
  ._4t3i7l9q{height:170px}
14
14
  ._5ral1f51{object-fit:contain}
15
- ._6fl45ucs{transition-timing-function:ease}
15
+ ._6fl4574g{transition-timing-function:var(--ds-easing-out-practical,ease)}
16
16
  ._80omtlke{cursor:pointer}
17
17
  ._bfhkhfxm{background-color:var(--ds-surface-sunken,#f8f8f8)}
18
18
  ._bfhkufnl{background-color:var(--ds-background-selected-hovered,#cfe1fd)}
19
- ._c71lys9h{max-height:5pc}
19
+ ._c71l1j4a{max-height:130px}
20
20
  ._k8m01rje{transition-property:background-color,border-color}
21
21
  ._p12f1osq{max-width:100%}
22
22
  ._u5f3utpp{padding-right:var(--ds-space-150,9pt)}
@@ -105,11 +105,11 @@ var FileChooser = function FileChooser(props) {
105
105
  "data-testid": dropzoneTestId,
106
106
  role: "region",
107
107
  "aria-label": label,
108
- className: ax(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec6ebc _6fl45ucs", isDragging && "_1h6dq98m _bfhkufnl"])
108
+ className: ax(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec1ign _6fl4574g", isDragging && "_1h6dq98m _bfhkufnl"])
109
109
  }, previewImage ? /*#__PURE__*/React.createElement("img", {
110
110
  src: previewImage,
111
111
  alt: previewAlt,
112
- className: ax(["_c71lys9h _p12f1osq _5ral1f51"])
112
+ className: ax(["_c71l1j4a _p12f1osq _5ral1f51"])
113
113
  }) : /*#__PURE__*/React.createElement(Button, {
114
114
  onClick: handleOnChooseFile,
115
115
  isDisabled: isDisabled,
@@ -210,6 +210,11 @@ export var messages = defineMessages({
210
210
  defaultMessage: 'Selected image is more than 1 MB',
211
211
  description: 'Error message for image too big, beyond the size limit'
212
212
  },
213
+ emojiDuplicateName: {
214
+ id: 'fabric.emoji.error.duplicate.name',
215
+ defaultMessage: 'An emoji with this name exists already',
216
+ description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
217
+ },
213
218
  emojiPickerTitle: {
214
219
  id: 'fabric.emoji.picker',
215
220
  defaultMessage: 'Emoji picker',
@@ -1,14 +1,17 @@
1
1
  /* EmojiPickerComponent.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
4
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
5
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
6
  import "./EmojiPickerComponent.compiled.css";
6
7
  import * as React from 'react';
7
8
  import { ax, ix } from "@compiled/react/runtime";
9
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
12
  import { useCallback, useEffect, useMemo, useRef, useState, createRef, memo } from 'react';
11
13
  import { fg } from '@atlaskit/platform-feature-flags';
14
+ import { getDocument } from '@atlaskit/browser-apis';
12
15
  import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
13
16
  import { FormattedMessage, useIntl } from 'react-intl';
14
17
  import { getEmojiVariation } from '../../api/EmojiRepository';
@@ -164,6 +167,12 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
164
167
  setUploadErrorMessage(undefined);
165
168
  });
166
169
  fireAnalytics(uploadCancelButton());
170
+ if (fg('platform_emoji_picker_refresh')) {
171
+ setTimeout(function () {
172
+ var _getDocument;
173
+ (_getDocument = getDocument()) === null || _getDocument === void 0 || (_getDocument = _getDocument.getElementById('add-custom-emoji')) === null || _getDocument === void 0 || _getDocument.focus();
174
+ }, 0);
175
+ }
167
176
  }, [fireAnalytics]);
168
177
  var getDynamicCategories = useCallback(function () {
169
178
  if (!emojiProvider.calculateDynamicCategories) {
@@ -379,23 +388,53 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
379
388
  }, 0);
380
389
  }
381
390
  }, [emojiPickerList]);
382
- var onUploadEmoji = useCallback(function (upload, retry) {
383
- fireAnalytics(uploadConfirmButton({
384
- retry: retry
391
+ var onUploadEmoji = useCallback( /*#__PURE__*/function () {
392
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(upload, retry) {
393
+ var errorSetter, onSuccess, uploadShortName, existing;
394
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
395
+ while (1) switch (_context.prev = _context.next) {
396
+ case 0:
397
+ fireAnalytics(uploadConfirmButton({
398
+ retry: retry
399
+ }));
400
+ errorSetter = function errorSetter(message) {
401
+ setUploadErrorMessage(message);
402
+ };
403
+ onSuccess = function onSuccess(emojiDescription) {
404
+ batchedUpdates(function () {
405
+ setActiveCategory(customCategory);
406
+ setSelectedEmoji(emojiDescription);
407
+ setUploading(false);
408
+ });
409
+ scrollToUploadedEmoji(emojiDescription);
410
+ };
411
+ if (!fg('platform_emoji_picker_refresh')) {
412
+ _context.next = 11;
413
+ break;
414
+ }
415
+ uploadShortName = ":".concat(upload.name.toLowerCase(), ":");
416
+ _context.next = 7;
417
+ return emojiProvider.findByShortName(uploadShortName);
418
+ case 7:
419
+ existing = _context.sent;
420
+ if (!existing) {
421
+ _context.next = 11;
422
+ break;
423
+ }
424
+ errorSetter(messages.emojiDuplicateName);
425
+ return _context.abrupt("return");
426
+ case 11:
427
+ uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
428
+ case 12:
429
+ case "end":
430
+ return _context.stop();
431
+ }
432
+ }, _callee);
385
433
  }));
386
- var errorSetter = function errorSetter(message) {
387
- setUploadErrorMessage(message);
388
- };
389
- var onSuccess = function onSuccess(emojiDescription) {
390
- batchedUpdates(function () {
391
- setActiveCategory(customCategory);
392
- setSelectedEmoji(emojiDescription);
393
- setUploading(false);
394
- });
395
- scrollToUploadedEmoji(emojiDescription);
434
+ return function (_x, _x2) {
435
+ return _ref3.apply(this, arguments);
396
436
  };
397
- uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
398
- }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
437
+ }(), [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
399
438
  var onTriggerDelete = useCallback(function (_emojiId, emoji) {
400
439
  if (_emojiId) {
401
440
  fireAnalytics(deleteBeginEvent({
@@ -14,7 +14,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
14
14
  actionSubjectId: actionSubjectId,
15
15
  attributes: _objectSpread({
16
16
  packageName: "@atlaskit/emoji",
17
- packageVersion: "70.6.1"
17
+ packageVersion: "70.7.0"
18
18
  }, attributes)
19
19
  };
20
20
  };
@@ -13,6 +13,9 @@ export var deleteEmojiLabel = 'delete-emoji';
13
13
  * This is used instead of Number.MAX_VALUE since subtraction of MAX_VALUE from itself occassionaly doesn't equal zero exactly :-(
14
14
  */
15
15
  export var MAX_ORDINAL = 100000;
16
+
17
+ // Constant variables here has been inlined in css from EditorContentContainer, if you need to make
18
+ // update here, please also update packages/editor/editor-core/src/ui/EditorContentContainer/EditorContentContainer-compiled.tsx
16
19
  export var scaledEmojiHeightH1 = 28;
17
20
  export var scaledEmojiHeightH2 = 26;
18
21
  export var scaledEmojiHeightH3 = 24;