@atlaskit/emoji 70.6.2 → 70.7.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +13 -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/es2019/api/EmojiResource.js +19 -1
  14. package/dist/es2019/components/common/EmojiErrorMessage.js +5 -1
  15. package/dist/es2019/components/common/EmojiUploadPicker.compiled.css +3 -1
  16. package/dist/es2019/components/common/EmojiUploadPicker.js +23 -12
  17. package/dist/es2019/components/common/FileChooser.compiled.css +3 -3
  18. package/dist/es2019/components/common/FileChooser.js +2 -2
  19. package/dist/es2019/components/i18n.js +5 -0
  20. package/dist/es2019/components/picker/EmojiPickerComponent.js +16 -1
  21. package/dist/es2019/util/analytics/analytics.js +1 -1
  22. package/dist/esm/api/EmojiResource.js +24 -2
  23. package/dist/esm/components/common/EmojiErrorMessage.js +5 -1
  24. package/dist/esm/components/common/EmojiUploadPicker.compiled.css +3 -1
  25. package/dist/esm/components/common/EmojiUploadPicker.js +29 -18
  26. package/dist/esm/components/common/FileChooser.compiled.css +3 -3
  27. package/dist/esm/components/common/FileChooser.js +2 -2
  28. package/dist/esm/components/i18n.js +5 -0
  29. package/dist/esm/components/picker/EmojiPickerComponent.js +54 -15
  30. package/dist/esm/util/analytics/analytics.js +1 -1
  31. package/dist/types/components/i18n.d.ts +99 -94
  32. package/dist/types-ts4.5/components/i18n.d.ts +99 -94
  33. package/package.json +8 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 70.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`084c9f4eca75d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/084c9f4eca75d) -
8
+ Updated error states + new error state for adding duplicate emoji name
9
+
10
+ ### Patch Changes
11
+
12
+ - [`8d79e063b3073`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8d79e063b3073) -
13
+ update stargate routing for emoji routes
14
+ - Updated dependencies
15
+
3
16
  ## 70.6.2
4
17
 
5
18
  ### Patch Changes
@@ -25,12 +25,18 @@
25
25
  {
26
26
  "path": "../../../analytics/analytics-next/afm-cc/tsconfig.json"
27
27
  },
28
+ {
29
+ "path": "../../../helpers/browser-apis/afm-cc/tsconfig.json"
30
+ },
28
31
  {
29
32
  "path": "../../../design-system/button/afm-cc/tsconfig.json"
30
33
  },
31
34
  {
32
35
  "path": "../../../design-system/css/afm-cc/tsconfig.json"
33
36
  },
37
+ {
38
+ "path": "../../../design-system/form/afm-cc/tsconfig.json"
39
+ },
34
40
  {
35
41
  "path": "../../../design-system/heading/afm-cc/tsconfig.json"
36
42
  },
@@ -25,12 +25,18 @@
25
25
  {
26
26
  "path": "../../../analytics/analytics-next/afm-products/tsconfig.json"
27
27
  },
28
+ {
29
+ "path": "../../../helpers/browser-apis/afm-products/tsconfig.json"
30
+ },
28
31
  {
29
32
  "path": "../../../design-system/button/afm-products/tsconfig.json"
30
33
  },
31
34
  {
32
35
  "path": "../../../design-system/css/afm-products/tsconfig.json"
33
36
  },
37
+ {
38
+ "path": "../../../design-system/form/afm-products/tsconfig.json"
39
+ },
34
40
  {
35
41
  "path": "../../../design-system/heading/afm-products/tsconfig.json"
36
42
  },
@@ -67,7 +67,29 @@ var EmojiResource = exports.EmojiResource = /*#__PURE__*/function (_ref) {
67
67
  (0, _defineProperty2.default)(_this, "isLoaded", function () {
68
68
  return _this.initialLoaders !== 0 && _this.activeLoaders === 0;
69
69
  });
70
- _this.emojiProviderConfig = config;
70
+ var rewriteEmojiGatewayPath = function rewriteEmojiGatewayPath(url) {
71
+ return url.replace('/gateway/api/emoji', '/gateway/api/elements/emoji');
72
+ };
73
+ var stargateEmojiPathEnabled = (0, _platformFeatureFlags.fg)('use-elements-stargate-emoji-path');
74
+ var singleEmojiApi = config.singleEmojiApi;
75
+ var optimisticImageApi = config.optimisticImageApi;
76
+ _this.emojiProviderConfig = stargateEmojiPathEnabled ? _objectSpread(_objectSpread({}, config), {}, {
77
+ providers: config.providers.map(function (provider) {
78
+ return _objectSpread(_objectSpread({}, provider), {}, {
79
+ url: rewriteEmojiGatewayPath(provider.url)
80
+ });
81
+ }),
82
+ singleEmojiApi: singleEmojiApi ? _objectSpread(_objectSpread({}, singleEmojiApi), {}, {
83
+ getUrl: function getUrl(emojiId) {
84
+ return rewriteEmojiGatewayPath(singleEmojiApi.getUrl(emojiId));
85
+ }
86
+ }) : undefined,
87
+ optimisticImageApi: optimisticImageApi ? _objectSpread(_objectSpread({}, optimisticImageApi), {}, {
88
+ getUrl: function getUrl(emojiId) {
89
+ return rewriteEmojiGatewayPath(optimisticImageApi.getUrl(emojiId));
90
+ }
91
+ }) : undefined
92
+ }) : config;
71
93
  _this.recordConfig = config.recordConfig;
72
94
  _this.currentUser = config.currentUser;
73
95
  if ((0, _storageAvailable.default)('localStorage')) {
@@ -10,8 +10,10 @@ exports.emojiErrorScreenreaderTestId = exports.emojiErrorMessageTooltipTestId =
10
10
  require("./EmojiErrorMessage.compiled.css");
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _runtime = require("@compiled/react/runtime");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
14
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
14
15
  var _statusError = _interopRequireDefault(require("@atlaskit/icon/core/status-error"));
16
+ var _form = require("@atlaskit/form");
15
17
  var _reactIntl = require("react-intl");
16
18
  var _i18n = require("../i18n");
17
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
@@ -42,7 +44,9 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
42
44
  label: formatMessage(_i18n.messages.error),
43
45
  spacing: "spacious",
44
46
  testId: emojiErrorIconTestId
45
- }))) : /*#__PURE__*/React.createElement("div", {
47
+ }))) : (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement("div", {
48
+ "data-testid": emojiErrorMessageTestId
49
+ }, /*#__PURE__*/React.createElement(_form.ErrorMessage, null, message)) : /*#__PURE__*/React.createElement("div", {
46
50
  "data-testid": emojiErrorMessageTestId,
47
51
  className: (0, _runtime.ax)([errorMessageStyles[errorStyle]])
48
52
  }, /*#__PURE__*/React.createElement(_statusError.default, {
@@ -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}
@@ -29,12 +29,14 @@ var _FileChooser = _interopRequireDefault(require("./FileChooser"));
29
29
  var _internalTypes = require("./internal-types");
30
30
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
31
31
  var _new = _interopRequireDefault(require("@atlaskit/button/new"));
32
+ var _browserApis = require("@atlaskit/browser-apis");
32
33
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
33
34
  var closeEmojiUploadButton = null;
34
35
  var uploadAddRowNew = null;
35
36
  var emojiUpload = null;
36
37
  var emojiUploadNew = null;
37
38
  var emojiUploadTop = null;
39
+ var emojiUploadTopNew = null;
38
40
  var labelStyles = null;
39
41
  var uploadChooseFileEmojiName = null;
40
42
  var uploadChooseFileMessage = null;
@@ -65,6 +67,7 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
65
67
  onUploadCancelled = props.onUploadCancelled,
66
68
  onAddEmoji = props.onAddEmoji,
67
69
  errorMessage = props.errorMessage,
70
+ nameErrorMessage = props.nameErrorMessage,
68
71
  previewImage = props.previewImage,
69
72
  uploadStatus = props.uploadStatus,
70
73
  intl = props.intl;
@@ -93,13 +96,13 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
93
96
  "data-testid": uploadEmojiComponentTestId,
94
97
  className: (0, _runtime.ax)(["_ca0qu2gc _u5f3pxbi _n3tdu2gc _19bvpxbi _1e0c1txw _2lx21bp4 _1bah1b1v"])
95
98
  }, /*#__PURE__*/React.createElement("div", {
96
- className: (0, _runtime.ax)(["_11c8wadc _n3tdu2gc _1e0c1txw _1bah1yb4 _4cvresu3"])
99
+ className: (0, _runtime.ax)(["_11c8wadc _n3tdv77o _1e0c1txw _1bah1yb4 _4cvresu3"])
97
100
  }, /*#__PURE__*/React.createElement("label", {
98
101
  htmlFor: "new-emoji-name-input",
99
102
  className: (0, _runtime.ax)(["_1w90azsu", "_11c8wadc _k48p1pd9"])
100
103
  }, previewImage ? /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiPreviewTitle) : /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.addCustomEmojiLabel))), /*#__PURE__*/React.createElement("div", {
101
- className: (0, _runtime.ax)(["_zulppxbi _1e0c1txw _2lx21bp4 _n3tdu2gc"])
102
- }, /*#__PURE__*/React.createElement(_compiled.Text, null, /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiChooseFileScreenReaderDescription, function () {
104
+ className: (0, _runtime.ax)(["_zulp12x7 _1e0c1txw _2lx21bp4 _1tker0r7"])
105
+ }, /*#__PURE__*/React.createElement(_compiled.Box, null, /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiChooseFileScreenReaderDescription, function () {
103
106
  return /*#__PURE__*/React.createElement(_FileChooser.default, {
104
107
  label: emojiChooseFileTitle,
105
108
  onChange: onChooseFile,
@@ -109,7 +112,12 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
109
112
  previewImage: previewImage,
110
113
  previewAlt: name
111
114
  });
112
- })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
115
+ }), /*#__PURE__*/React.createElement("div", {
116
+ id: fileChooserButtonDescriptionId
117
+ }, errorMessage && /*#__PURE__*/React.createElement(_EmojiErrorMessage.default, {
118
+ errorStyle: "chooseFile",
119
+ message: errorMessage
120
+ }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
113
121
  htmlFor: "new-emoji-name-input",
114
122
  className: (0, _runtime.ax)(["_1w90azsu", "_11c8wadc _k48p1pd9"])
115
123
  }, /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiNameLabel)), /*#__PURE__*/React.createElement(_textfield.default, {
@@ -121,16 +129,15 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
121
129
  value: name,
122
130
  isCompact: true,
123
131
  autoFocus: true,
132
+ isInvalid: !!nameErrorMessage,
124
133
  testId: uploadEmojiNameInputTestId,
125
134
  ref: inputRef,
126
135
  id: "new-emoji-name-input",
127
136
  "aria-required": true
128
- }))), /*#__PURE__*/React.createElement("div", {
129
- id: fileChooserButtonDescriptionId
130
- }, errorMessage && /*#__PURE__*/React.createElement(_EmojiErrorMessage.default, {
137
+ }), nameErrorMessage && /*#__PURE__*/React.createElement(_EmojiErrorMessage.default, {
131
138
  errorStyle: "chooseFile",
132
- message: errorMessage
133
- })), /*#__PURE__*/React.createElement("div", {
139
+ message: nameErrorMessage
140
+ }))), /*#__PURE__*/React.createElement("div", {
134
141
  className: (0, _runtime.ax)(["_zulpu2gc _1e0c1txw _1bahesu3 _4cvr1h6o _ca0qpxbi _n3td1ejb"])
135
142
  }, /*#__PURE__*/React.createElement(_new.default, {
136
143
  onClick: onUploadCancelled,
@@ -308,18 +315,19 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
308
315
  return ImageUtil.parseImage(f.target.result);
309
316
  case 4:
310
317
  setPreviewImage(f.target.result);
311
- _context.next = 11;
318
+ setChooseEmojiErrorMessage(undefined);
319
+ _context.next = 12;
312
320
  break;
313
- case 7:
314
- _context.prev = 7;
321
+ case 8:
322
+ _context.prev = 8;
315
323
  _context.t0 = _context["catch"](0);
316
324
  setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiInvalidImage));
317
325
  cancelChooseFile();
318
- case 11:
326
+ case 12:
319
327
  case "end":
320
328
  return _context.stop();
321
329
  }
322
- }, _callee, null, [[0, 7]]);
330
+ }, _callee, null, [[0, 8]]);
323
331
  }));
324
332
  return function (_x) {
325
333
  return _ref.apply(this, arguments);
@@ -351,15 +359,16 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
351
359
  // using setTimeout here to allow the UI to update before setting focus
352
360
  setTimeout(function (lastFocus) {
353
361
  if (lastFocus) {
354
- var _document$getElementB;
355
- (_document$getElementB = document.getElementById(lastFocus)) === null || _document$getElementB === void 0 || _document$getElementB.focus();
362
+ var _getDocument;
363
+ (_getDocument = (0, _browserApis.getDocument)()) === null || _getDocument === void 0 || (_getDocument = _getDocument.getElementById(lastFocus)) === null || _getDocument === void 0 || _getDocument.focus();
356
364
  }
357
365
  }, 0, lastFocusedElementId.current);
358
366
  }, [clearUploadPicker, onUploadCancelled]);
359
367
  var onChooseFileClicked = function onChooseFileClicked() {
360
368
  onFileChooserClicked && onFileChooserClicked();
361
369
  };
362
- var content = !(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') && name && previewImage ? /*#__PURE__*/React.createElement(_EmojiUploadPreview.default, {
370
+ var isDuplicateNameError = errorMessage !== null && errorMessage !== undefined && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh');
371
+ var content = name && previewImage && !(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement(_EmojiUploadPreview.default, {
363
372
  errorMessage: errorMessage,
364
373
  name: name,
365
374
  onAddEmoji: onAddEmoji,
@@ -376,9 +385,10 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
376
385
  previewImage: previewImage,
377
386
  uploadStatus: uploadStatus,
378
387
  errorMessage: chooseEmojiErrorMessage,
388
+ nameErrorMessage: isDuplicateNameError ? errorMessage : undefined,
379
389
  intl: intl
380
390
  });
381
- return disableFocusLock ? content : /*#__PURE__*/React.createElement(_reactFocusLock.default, {
391
+ return disableFocusLock || (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? content : /*#__PURE__*/React.createElement(_reactFocusLock.default, {
382
392
  noFocusGuards: true
383
393
  }, content);
384
394
  };
@@ -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)}
@@ -114,11 +114,11 @@ var FileChooser = function FileChooser(props) {
114
114
  "data-testid": dropzoneTestId,
115
115
  role: "region",
116
116
  "aria-label": label,
117
- className: (0, _runtime.ax)(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec6ebc _6fl45ucs", isDragging && "_1h6dq98m _bfhkufnl"])
117
+ className: (0, _runtime.ax)(["_zulpu2gc _2rko1qi0 _189ee4h9 _1dqogq9o _1h6d1l7x _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _4t3i7l9q _u5f3utpp _19bvutpp _bfhkhfxm _80omtlke _k8m01rje _1oec1ign _6fl4574g", isDragging && "_1h6dq98m _bfhkufnl"])
118
118
  }, previewImage ? /*#__PURE__*/_react.default.createElement("img", {
119
119
  src: previewImage,
120
120
  alt: previewAlt,
121
- className: (0, _runtime.ax)(["_c71lys9h _p12f1osq _5ral1f51"])
121
+ className: (0, _runtime.ax)(["_c71l1j4a _p12f1osq _5ral1f51"])
122
122
  }) : /*#__PURE__*/_react.default.createElement(_new.default, {
123
123
  onClick: handleOnChooseFile,
124
124
  isDisabled: isDisabled,
@@ -216,6 +216,11 @@ var messages = exports.messages = (0, _reactIntl.defineMessages)({
216
216
  defaultMessage: 'Selected image is more than 1 MB',
217
217
  description: 'Error message for image too big, beyond the size limit'
218
218
  },
219
+ emojiDuplicateName: {
220
+ id: 'fabric.emoji.error.duplicate.name',
221
+ defaultMessage: 'An emoji with this name exists already',
222
+ description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
223
+ },
219
224
  emojiPickerTitle: {
220
225
  id: 'fabric.emoji.picker',
221
226
  defaultMessage: 'Emoji picker',
@@ -11,10 +11,13 @@ require("./EmojiPickerComponent.compiled.css");
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var React = _react;
13
13
  var _runtime = require("@compiled/react/runtime");
14
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
15
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
16
18
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
19
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
20
+ var _browserApis = require("@atlaskit/browser-apis");
18
21
  var _reactDom = require("react-dom");
19
22
  var _reactIntl = require("react-intl");
20
23
  var _EmojiRepository = require("../../api/EmojiRepository");
@@ -173,6 +176,12 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
173
176
  setUploadErrorMessage(undefined);
174
177
  });
175
178
  fireAnalytics((0, _analytics.uploadCancelButton)());
179
+ if ((0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
180
+ setTimeout(function () {
181
+ var _getDocument;
182
+ (_getDocument = (0, _browserApis.getDocument)()) === null || _getDocument === void 0 || (_getDocument = _getDocument.getElementById('add-custom-emoji')) === null || _getDocument === void 0 || _getDocument.focus();
183
+ }, 0);
184
+ }
176
185
  }, [fireAnalytics]);
177
186
  var getDynamicCategories = (0, _react.useCallback)(function () {
178
187
  if (!emojiProvider.calculateDynamicCategories) {
@@ -388,23 +397,53 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
388
397
  }, 0);
389
398
  }
390
399
  }, [emojiPickerList]);
391
- var onUploadEmoji = (0, _react.useCallback)(function (upload, retry) {
392
- fireAnalytics((0, _analytics.uploadConfirmButton)({
393
- retry: retry
400
+ var onUploadEmoji = (0, _react.useCallback)( /*#__PURE__*/function () {
401
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(upload, retry) {
402
+ var errorSetter, onSuccess, uploadShortName, existing;
403
+ return _regenerator.default.wrap(function _callee$(_context) {
404
+ while (1) switch (_context.prev = _context.next) {
405
+ case 0:
406
+ fireAnalytics((0, _analytics.uploadConfirmButton)({
407
+ retry: retry
408
+ }));
409
+ errorSetter = function errorSetter(message) {
410
+ setUploadErrorMessage(message);
411
+ };
412
+ onSuccess = function onSuccess(emojiDescription) {
413
+ (0, _reactDom.unstable_batchedUpdates)(function () {
414
+ setActiveCategory(_constants.customCategory);
415
+ setSelectedEmoji(emojiDescription);
416
+ setUploading(false);
417
+ });
418
+ scrollToUploadedEmoji(emojiDescription);
419
+ };
420
+ if (!(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
421
+ _context.next = 11;
422
+ break;
423
+ }
424
+ uploadShortName = ":".concat(upload.name.toLowerCase(), ":");
425
+ _context.next = 7;
426
+ return emojiProvider.findByShortName(uploadShortName);
427
+ case 7:
428
+ existing = _context.sent;
429
+ if (!existing) {
430
+ _context.next = 11;
431
+ break;
432
+ }
433
+ errorSetter(_i18n.messages.emojiDuplicateName);
434
+ return _context.abrupt("return");
435
+ case 11:
436
+ (0, _UploadEmoji.uploadEmoji)(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
437
+ case 12:
438
+ case "end":
439
+ return _context.stop();
440
+ }
441
+ }, _callee);
394
442
  }));
395
- var errorSetter = function errorSetter(message) {
396
- setUploadErrorMessage(message);
397
- };
398
- var onSuccess = function onSuccess(emojiDescription) {
399
- (0, _reactDom.unstable_batchedUpdates)(function () {
400
- setActiveCategory(_constants.customCategory);
401
- setSelectedEmoji(emojiDescription);
402
- setUploading(false);
403
- });
404
- scrollToUploadedEmoji(emojiDescription);
443
+ return function (_x, _x2) {
444
+ return _ref3.apply(this, arguments);
405
445
  };
406
- (0, _UploadEmoji.uploadEmoji)(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
407
- }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
446
+ }(), [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
408
447
  var onTriggerDelete = (0, _react.useCallback)(function (_emojiId, emoji) {
409
448
  if (_emojiId) {
410
449
  fireAnalytics((0, _analytics.deleteBeginEvent)({
@@ -20,7 +20,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
20
20
  actionSubjectId: actionSubjectId,
21
21
  attributes: _objectSpread({
22
22
  packageName: "@atlaskit/emoji",
23
- packageVersion: "70.6.1"
23
+ packageVersion: "70.6.2"
24
24
  }, attributes)
25
25
  };
26
26
  };
@@ -44,7 +44,25 @@ export class EmojiResource extends AbstractResource {
44
44
  return !!repository;
45
45
  });
46
46
  _defineProperty(this, "isLoaded", () => this.initialLoaders !== 0 && this.activeLoaders === 0);
47
- this.emojiProviderConfig = config;
47
+ const rewriteEmojiGatewayPath = url => url.replace('/gateway/api/emoji', '/gateway/api/elements/emoji');
48
+ const stargateEmojiPathEnabled = fg('use-elements-stargate-emoji-path');
49
+ const singleEmojiApi = config.singleEmojiApi;
50
+ const optimisticImageApi = config.optimisticImageApi;
51
+ this.emojiProviderConfig = stargateEmojiPathEnabled ? {
52
+ ...config,
53
+ providers: config.providers.map(provider => ({
54
+ ...provider,
55
+ url: rewriteEmojiGatewayPath(provider.url)
56
+ })),
57
+ singleEmojiApi: singleEmojiApi ? {
58
+ ...singleEmojiApi,
59
+ getUrl: emojiId => rewriteEmojiGatewayPath(singleEmojiApi.getUrl(emojiId))
60
+ } : undefined,
61
+ optimisticImageApi: optimisticImageApi ? {
62
+ ...optimisticImageApi,
63
+ getUrl: emojiId => rewriteEmojiGatewayPath(optimisticImageApi.getUrl(emojiId))
64
+ } : undefined
65
+ } : config;
48
66
  this.recordConfig = config.recordConfig;
49
67
  this.currentUser = config.currentUser;
50
68
  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
  const errorMessageStyles = {
@@ -36,7 +38,9 @@ const EmojiErrorMessage = props => {
36
38
  label: formatMessage(messages.error),
37
39
  spacing: "spacious",
38
40
  testId: emojiErrorIconTestId
39
- }))) : /*#__PURE__*/React.createElement("div", {
41
+ }))) : fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement("div", {
42
+ "data-testid": emojiErrorMessageTestId
43
+ }, /*#__PURE__*/React.createElement(ErrorMessage, null, message)) : /*#__PURE__*/React.createElement("div", {
40
44
  "data-testid": emojiErrorMessageTestId,
41
45
  className: ax([errorMessageStyles[errorStyle]])
42
46
  }, /*#__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}
@@ -18,11 +18,14 @@ import FileChooser from './FileChooser';
18
18
  import { UploadStatus } from './internal-types';
19
19
  import { fg } from '@atlaskit/platform-feature-flags';
20
20
  import Button from '@atlaskit/button/new';
21
+ import { Box } from '@atlaskit/primitives/compiled';
22
+ import { getDocument } from '@atlaskit/browser-apis';
21
23
  const closeEmojiUploadButton = null;
22
24
  const uploadAddRowNew = null;
23
25
  const emojiUpload = null;
24
26
  const emojiUploadNew = null;
25
27
  const emojiUploadTop = null;
28
+ const emojiUploadTopNew = null;
26
29
  const labelStyles = null;
27
30
  const uploadChooseFileEmojiName = null;
28
31
  const uploadChooseFileMessage = null;
@@ -53,6 +56,7 @@ const ChooseEmojiFile = /*#__PURE__*/memo(props => {
53
56
  onUploadCancelled,
54
57
  onAddEmoji,
55
58
  errorMessage,
59
+ nameErrorMessage,
56
60
  previewImage,
57
61
  uploadStatus,
58
62
  intl
@@ -84,13 +88,13 @@ const ChooseEmojiFile = /*#__PURE__*/memo(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, () => /*#__PURE__*/React.createElement(FileChooser, {
96
+ className: ax(["_zulp12x7 _1e0c1txw _2lx21bp4 _1tker0r7"])
97
+ }, /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, () => /*#__PURE__*/React.createElement(FileChooser, {
94
98
  label: emojiChooseFileTitle,
95
99
  onChange: onChooseFile,
96
100
  onClick: onClick,
@@ -98,6 +102,11 @@ const ChooseEmojiFile = /*#__PURE__*/memo(props => {
98
102
  ariaDescribedBy: fileChooserButtonDescriptionId,
99
103
  previewImage: previewImage,
100
104
  previewAlt: name
105
+ })), /*#__PURE__*/React.createElement("div", {
106
+ id: fileChooserButtonDescriptionId
107
+ }, errorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
108
+ errorStyle: "chooseFile",
109
+ message: errorMessage
101
110
  }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
102
111
  htmlFor: "new-emoji-name-input",
103
112
  className: ax(["_1w90azsu", "_11c8wadc _k48p1pd9"])
@@ -110,16 +119,15 @@ const ChooseEmojiFile = /*#__PURE__*/memo(props => {
110
119
  value: name,
111
120
  isCompact: true,
112
121
  autoFocus: true,
122
+ isInvalid: !!nameErrorMessage,
113
123
  testId: uploadEmojiNameInputTestId,
114
124
  ref: inputRef,
115
125
  id: "new-emoji-name-input",
116
126
  "aria-required": true
117
- }))), /*#__PURE__*/React.createElement("div", {
118
- id: fileChooserButtonDescriptionId
119
- }, errorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
127
+ }), nameErrorMessage && /*#__PURE__*/React.createElement(EmojiErrorMessage, {
120
128
  errorStyle: "chooseFile",
121
- message: errorMessage
122
- })), /*#__PURE__*/React.createElement("div", {
129
+ message: nameErrorMessage
130
+ }))), /*#__PURE__*/React.createElement("div", {
123
131
  className: ax(["_zulpu2gc _1e0c1txw _1bahesu3 _4cvr1h6o _ca0qpxbi _n3td1ejb"])
124
132
  }, /*#__PURE__*/React.createElement(Button, {
125
133
  onClick: onUploadCancelled,
@@ -276,6 +284,7 @@ const EmojiUploadPicker = props => {
276
284
  setFilename(file.name);
277
285
  await ImageUtil.parseImage(f.target.result);
278
286
  setPreviewImage(f.target.result);
287
+ setChooseEmojiErrorMessage(undefined);
279
288
  } catch {
280
289
  setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiInvalidImage));
281
290
  cancelChooseFile();
@@ -306,15 +315,16 @@ const EmojiUploadPicker = props => {
306
315
  // using setTimeout here to allow the UI to update before setting focus
307
316
  setTimeout(lastFocus => {
308
317
  if (lastFocus) {
309
- var _document$getElementB;
310
- (_document$getElementB = document.getElementById(lastFocus)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.focus();
318
+ var _getDocument, _getDocument$getEleme;
319
+ (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : (_getDocument$getEleme = _getDocument.getElementById(lastFocus)) === null || _getDocument$getEleme === void 0 ? void 0 : _getDocument$getEleme.focus();
311
320
  }
312
321
  }, 0, lastFocusedElementId.current);
313
322
  }, [clearUploadPicker, onUploadCancelled]);
314
323
  const onChooseFileClicked = () => {
315
324
  onFileChooserClicked && onFileChooserClicked();
316
325
  };
317
- const content = !fg('platform_emoji_picker_refresh') && name && previewImage ? /*#__PURE__*/React.createElement(EmojiUploadPreview, {
326
+ const isDuplicateNameError = errorMessage !== null && errorMessage !== undefined && fg('platform_emoji_picker_refresh');
327
+ const content = name && previewImage && !fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement(EmojiUploadPreview, {
318
328
  errorMessage: errorMessage,
319
329
  name: name,
320
330
  onAddEmoji: onAddEmoji,
@@ -331,9 +341,10 @@ const EmojiUploadPicker = props => {
331
341
  previewImage: previewImage,
332
342
  uploadStatus: uploadStatus,
333
343
  errorMessage: chooseEmojiErrorMessage,
344
+ nameErrorMessage: isDuplicateNameError ? errorMessage : undefined,
334
345
  intl: intl
335
346
  });
336
- return disableFocusLock ? content : /*#__PURE__*/React.createElement(FocusLock, {
347
+ return disableFocusLock || fg('platform_emoji_picker_refresh') ? content : /*#__PURE__*/React.createElement(FocusLock, {
337
348
  noFocusGuards: true
338
349
  }, content);
339
350
  };
@@ -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)}