@atlaskit/emoji 72.2.6 → 72.3.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 (85) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-products/tsconfig.json +3 -0
  4. package/dist/cjs/api/EmojiRepository.js +2 -9
  5. package/dist/cjs/api/EmojiResource.js +2 -11
  6. package/dist/cjs/api/media/SiteEmojiResource.js +10 -40
  7. package/dist/cjs/components/common/AddEmoji.js +2 -11
  8. package/dist/cjs/components/common/DeleteButton.js +2 -11
  9. package/dist/cjs/components/common/Emoji.js +15 -5
  10. package/dist/cjs/components/common/EmojiDeletePreview.js +3 -12
  11. package/dist/cjs/components/common/EmojiErrorMessage.js +2 -11
  12. package/dist/cjs/components/common/EmojiRadioButton.js +3 -2
  13. package/dist/cjs/components/common/EmojiUploadPicker.js +10 -19
  14. package/dist/cjs/components/common/FileChooser.js +3 -12
  15. package/dist/cjs/components/common/ImageEmoji.js +5 -2
  16. package/dist/cjs/components/common/TonePreviewButton.js +2 -1
  17. package/dist/cjs/components/common/ToneSelectorInternal.js +2 -11
  18. package/dist/cjs/components/common/isRefreshEmojiPickerEnabled.js +2 -14
  19. package/dist/cjs/components/picker/CategorySelector.js +7 -15
  20. package/dist/cjs/components/picker/EmojiPickerComponent.js +16 -25
  21. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +2 -1
  22. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -12
  23. package/dist/cjs/components/picker/EmojiPickerInternal.js +2 -8
  24. package/dist/cjs/components/picker/EmojiPickerList.js +2 -12
  25. package/dist/cjs/components/picker/EmojiPickerListSearch.js +2 -10
  26. package/dist/cjs/components/picker/VirtualList.js +3 -12
  27. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +3 -3
  28. package/dist/cjs/util/analytics/createEvent.js +1 -1
  29. package/dist/cjs/util/teamoji26RefreshEmojiPicker.js +17 -0
  30. package/dist/es2019/api/EmojiRepository.js +2 -9
  31. package/dist/es2019/api/EmojiResource.js +1 -10
  32. package/dist/es2019/api/media/SiteEmojiResource.js +9 -39
  33. package/dist/es2019/components/common/AddEmoji.js +1 -10
  34. package/dist/es2019/components/common/DeleteButton.js +1 -10
  35. package/dist/es2019/components/common/Emoji.js +14 -4
  36. package/dist/es2019/components/common/EmojiDeletePreview.js +1 -10
  37. package/dist/es2019/components/common/EmojiErrorMessage.js +1 -10
  38. package/dist/es2019/components/common/EmojiRadioButton.js +3 -2
  39. package/dist/es2019/components/common/EmojiUploadPicker.js +1 -10
  40. package/dist/es2019/components/common/FileChooser.js +1 -10
  41. package/dist/es2019/components/common/ImageEmoji.js +5 -2
  42. package/dist/es2019/components/common/TonePreviewButton.js +2 -1
  43. package/dist/es2019/components/common/ToneSelectorInternal.js +1 -10
  44. package/dist/es2019/components/common/isRefreshEmojiPickerEnabled.js +2 -13
  45. package/dist/es2019/components/picker/CategorySelector.js +1 -9
  46. package/dist/es2019/components/picker/EmojiPickerComponent.js +1 -10
  47. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +2 -1
  48. package/dist/es2019/components/picker/EmojiPickerFooter.js +1 -10
  49. package/dist/es2019/components/picker/EmojiPickerInternal.js +2 -8
  50. package/dist/es2019/components/picker/EmojiPickerList.js +1 -11
  51. package/dist/es2019/components/picker/EmojiPickerListSearch.js +1 -9
  52. package/dist/es2019/components/picker/VirtualList.js +1 -10
  53. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +1 -1
  54. package/dist/es2019/util/analytics/createEvent.js +1 -1
  55. package/dist/es2019/util/teamoji26RefreshEmojiPicker.js +11 -0
  56. package/dist/esm/api/EmojiRepository.js +2 -9
  57. package/dist/esm/api/EmojiResource.js +1 -10
  58. package/dist/esm/api/media/SiteEmojiResource.js +10 -40
  59. package/dist/esm/components/common/AddEmoji.js +1 -10
  60. package/dist/esm/components/common/DeleteButton.js +1 -10
  61. package/dist/esm/components/common/Emoji.js +15 -5
  62. package/dist/esm/components/common/EmojiDeletePreview.js +1 -10
  63. package/dist/esm/components/common/EmojiErrorMessage.js +1 -10
  64. package/dist/esm/components/common/EmojiRadioButton.js +3 -2
  65. package/dist/esm/components/common/EmojiUploadPicker.js +1 -10
  66. package/dist/esm/components/common/FileChooser.js +1 -10
  67. package/dist/esm/components/common/ImageEmoji.js +5 -2
  68. package/dist/esm/components/common/TonePreviewButton.js +2 -1
  69. package/dist/esm/components/common/ToneSelectorInternal.js +1 -10
  70. package/dist/esm/components/common/isRefreshEmojiPickerEnabled.js +2 -13
  71. package/dist/esm/components/picker/CategorySelector.js +1 -9
  72. package/dist/esm/components/picker/EmojiPickerComponent.js +1 -10
  73. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +2 -1
  74. package/dist/esm/components/picker/EmojiPickerFooter.js +1 -10
  75. package/dist/esm/components/picker/EmojiPickerInternal.js +2 -8
  76. package/dist/esm/components/picker/EmojiPickerList.js +1 -11
  77. package/dist/esm/components/picker/EmojiPickerListSearch.js +1 -9
  78. package/dist/esm/components/picker/VirtualList.js +1 -10
  79. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +1 -1
  80. package/dist/esm/util/analytics/createEvent.js +1 -1
  81. package/dist/esm/util/teamoji26RefreshEmojiPicker.js +11 -0
  82. package/dist/types/components/common/Emoji.d.ts +5 -0
  83. package/dist/types/components/common/isRefreshEmojiPickerEnabled.d.ts +0 -4
  84. package/dist/types/util/teamoji26RefreshEmojiPicker.d.ts +4 -0
  85. package/package.json +12 -7
@@ -1,6 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
3
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
4
3
  import { fg } from '@atlaskit/platform-feature-flags/fg';
5
4
  import { AbstractResource, utils as serviceUtils } from '@atlaskit/util-service-support';
6
5
  import { ProviderTypes } from '../types';
@@ -13,19 +12,11 @@ import debug from '../util/logger';
13
12
  import storageAvailable from '../util/storage-available';
14
13
  import { promiseWithTimeout } from '../util/timed-promise';
15
14
  import { toEmojiId } from '../util/to-emoji-id';
15
+ import { isTeamoji26RefreshEmojiPickerEnabled } from '../util/teamoji26RefreshEmojiPicker';
16
16
  import EmojiLoader from './EmojiLoader';
17
17
  import EmojiRepository from './EmojiRepository';
18
18
  import SiteEmojiResource from './media/SiteEmojiResource';
19
- const teamoji26RefreshEmojiPickerExperimentName = 'platform_teamoji_26_refresh_emoji_picker';
20
19
  const teamoji26QueryParam = 'useTeamoji26=true';
21
- const isTeamoji26RefreshEmojiPickerEnabled = () => {
22
- if (!FeatureGates.initializeCompleted()) {
23
- return false;
24
- }
25
-
26
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
27
- return FeatureGates.getExperimentValue(teamoji26RefreshEmojiPickerExperimentName, 'isEnabled', false);
28
- };
29
20
  const addTeamoji26QueryParam = url => {
30
21
  if (!url.includes('/atlassian') || /[?&]useTeamoji26=/.test(url)) {
31
22
  return url;
@@ -1,6 +1,5 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { getMediaClient } from '@atlaskit/media-client-react/get-media-client';
3
- import { fg } from '@atlaskit/platform-feature-flags/fg';
4
3
  import { utils as serviceUtils } from '@atlaskit/util-service-support';
5
4
  import { buildEmojiDescriptionWithAltRepresentation } from '../../util/build-emoji-description-with-alt-representation';
6
5
  import { convertImageToMediaRepresentation } from '../../util/convert-image-to-media-representation';
@@ -152,42 +151,11 @@ export default class SiteEmojiResource {
152
151
  }),
153
152
  useSha256ForUploads: true
154
153
  });
155
- if (fg('add_emoji_media_size_to_media_file_upload_request')) {
156
- mediaClient.file.uploadExternal(upload.dataURL, collectionName, undefined, true).then(({
157
- uploadableFileUpfrontIds
158
- }) => {
159
- const subscription = mediaClient.file.getFileState(uploadableFileUpfrontIds.id, {
160
- collectionName
161
- }).subscribe({
162
- next: state => {
163
- if (state.status === 'uploading' && progressCallback) {
164
- progressCallback({
165
- percent: state.progress * mediaProportionOfProgress
166
- });
167
- } else if (state.status === 'processing' || state.status === 'processed') {
168
- subscription.unsubscribe();
169
- const totalUploadTime = Date.now() - startTime;
170
- const mediaUploadTime = totalUploadTime - tokenLoadTime;
171
- debug('total upload / media upload times', totalUploadTime, mediaUploadTime);
172
- this.postToEmojiService(upload, uploadableFileUpfrontIds.id).then(emoji => {
173
- resolve(emoji);
174
- }).catch(httpError => {
175
- reject(httpError.reason || httpError);
176
- });
177
- }
178
- },
179
- error(error) {
180
- reject(error);
181
- }
182
- });
183
- }).catch(error => {
184
- reject(error);
185
- });
186
- } else {
187
- const subscription = mediaClient.file.upload({
188
- content: upload.dataURL,
189
- name: upload.filename,
190
- collection: collectionName
154
+ mediaClient.file.uploadExternal(upload.dataURL, collectionName, undefined, true).then(({
155
+ uploadableFileUpfrontIds
156
+ }) => {
157
+ const subscription = mediaClient.file.getFileState(uploadableFileUpfrontIds.id, {
158
+ collectionName
191
159
  }).subscribe({
192
160
  next: state => {
193
161
  if (state.status === 'uploading' && progressCallback) {
@@ -199,7 +167,7 @@ export default class SiteEmojiResource {
199
167
  const totalUploadTime = Date.now() - startTime;
200
168
  const mediaUploadTime = totalUploadTime - tokenLoadTime;
201
169
  debug('total upload / media upload times', totalUploadTime, mediaUploadTime);
202
- this.postToEmojiService(upload, state.id).then(emoji => {
170
+ this.postToEmojiService(upload, uploadableFileUpfrontIds.id).then(emoji => {
203
171
  resolve(emoji);
204
172
  }).catch(httpError => {
205
173
  reject(httpError.reason || httpError);
@@ -210,7 +178,9 @@ export default class SiteEmojiResource {
210
178
  reject(error);
211
179
  }
212
180
  });
213
- }
181
+ }).catch(error => {
182
+ reject(error);
183
+ });
214
184
  });
215
185
  });
216
186
  }
@@ -4,21 +4,12 @@ import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { Fragment, useCallback } from 'react';
6
6
  import { fg } from '@atlaskit/platform-feature-flags/fg';
7
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
8
7
  import { FormattedMessage } from 'react-intl';
9
8
  import { messages } from '../i18n';
10
9
  import Button from '@atlaskit/button/default/button';
10
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
11
11
  export const emojiActionsTestId = 'emoji-actions';
12
12
  export const uploadEmojiTestId = 'upload-emoji';
13
- const isRefreshEmojiPickerEnabled = () => {
14
- if (!FeatureGates.initializeCompleted()) {
15
- return false;
16
- }
17
-
18
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
19
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
20
- return isEnabled;
21
- };
22
13
  const addCustomEmoji = null;
23
14
 
24
15
  // Generic Type for the wrapped functional component
@@ -7,16 +7,7 @@ import CrossCircleIcon from '@atlaskit/icon/core/cross-circle';
7
7
  import { deleteEmojiLabel } from '../../util/constants';
8
8
  import { emojiDeleteButton } from './styles';
9
9
  import { Box } from '@atlaskit/primitives/compiled';
10
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
11
- const isRefreshEmojiPickerEnabled = () => {
12
- if (!FeatureGates.initializeCompleted()) {
13
- return false;
14
- }
15
-
16
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
17
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
18
- return isEnabled;
19
- };
10
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
20
11
  const styles = {
21
12
  boxWrapperStyle: "_1bsbf6fq _4t3if6fq"
22
13
  };
@@ -21,6 +21,7 @@ import { handleDelete } from './handleDelete';
21
21
  import { ImageEmoji } from './ImageEmoji';
22
22
  import { SpriteEmoji } from './SpriteEmoji';
23
23
  import { UnicodeEmoji } from './UnicodeEmoji';
24
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
24
25
  const emojiSpriteContainer = null;
25
26
  const emojiImageContainer = null;
26
27
 
@@ -81,7 +82,6 @@ const handleFocus = (props, event) => {
81
82
  }
82
83
  };
83
84
  export const EmojiNodeWrapper = /*#__PURE__*/forwardRef((props, ref) => {
84
- var _emoji$name;
85
85
  const {
86
86
  emoji,
87
87
  fitToHeight,
@@ -104,12 +104,22 @@ export const EmojiNodeWrapper = /*#__PURE__*/forwardRef((props, ref) => {
104
104
  type,
105
105
  editorEmoji,
106
106
  renderUnicodeEmojiAsImage,
107
+ isDecorative,
107
108
  ...other
108
109
  } = props;
109
110
  const intl = useContext(IntlContext);
110
- const ariaLabel = editorEmoji ? undefined : intl ? intl.formatMessage(messages.changeEmojiShortnameButtonLabel, {
111
- shortName: (_emoji$name = emoji.name) !== null && _emoji$name !== void 0 ? _emoji$name : emoji.shortName
112
- }) : emoji.shortName;
111
+ const isAriaLabelEmpty = editorEmoji || isDecorative && fg('emoji_decorative_label');
112
+ let ariaLabel;
113
+ if (isAriaLabelEmpty) {
114
+ ariaLabel = undefined;
115
+ } else if (intl) {
116
+ var _emoji$name;
117
+ ariaLabel = intl.formatMessage(messages.changeEmojiShortnameButtonLabel, {
118
+ shortName: (_emoji$name = emoji.name) !== null && _emoji$name !== void 0 ? _emoji$name : emoji.shortName
119
+ });
120
+ } else {
121
+ ariaLabel = emoji.shortName;
122
+ }
113
123
  const tooltipContent = showTooltip && expValEquals('platform_editor_emoji_hover_show_tooltip', 'isEnabled', true) ? emoji.shortName || emoji.name || undefined : undefined;
114
124
  const emojiSpan = /*#__PURE__*/React.createElement("span", _extends({
115
125
  role: editorEmoji ? undefined : shouldBeInteractive ? 'button' : ariaLabel ? 'img' : 'presentation',
@@ -5,7 +5,6 @@ import "./EmojiDeletePreview.compiled.css";
5
5
  import * as React from 'react';
6
6
  import { ax, ix } from "@compiled/react/runtime";
7
7
  import { Component } from 'react';
8
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
9
8
  import { FormattedMessage, injectIntl } from 'react-intl';
10
9
  import AkButton from '@atlaskit/button/default/button';
11
10
  import Heading from '@atlaskit/heading/heading';
@@ -16,15 +15,7 @@ import CachingEmoji from './CachingEmoji';
16
15
  import EmojiErrorMessage, { emojiErrorScreenreaderTestId } from './EmojiErrorMessage';
17
16
  import RetryableButton from './RetryableButton';
18
17
  import VisuallyHidden from '@atlaskit/visually-hidden/visually-hidden';
19
- const isRefreshEmojiPickerEnabled = () => {
20
- if (!FeatureGates.initializeCompleted()) {
21
- return false;
22
- }
23
-
24
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
25
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
26
- return isEnabled;
27
- };
18
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
28
19
  const deleteFooter = null;
29
20
  const deletePreview = null;
30
21
  const deleteText = null;
@@ -6,17 +6,8 @@ import Tooltip from '@atlaskit/tooltip/Tooltip';
6
6
  import ErrorIcon from '@atlaskit/icon/core/status-error';
7
7
  import { ErrorMessage } from '@atlaskit/form/error-message';
8
8
  import { useIntl } from 'react-intl';
9
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
10
9
  import { messages } from '../i18n';
11
- const isRefreshEmojiPickerEnabled = () => {
12
- if (!FeatureGates.initializeCompleted()) {
13
- return false;
14
- }
15
-
16
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
17
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
18
- return isEnabled;
19
- };
10
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
20
11
  const errorMessageStyles = {
21
12
  chooseFile: "_1e0c1txw _syaz1tmw _u5f319bv _1bah1y6m",
22
13
  delete: "_1e0c1txw _syaz1tmw _4cvr1h6o _1bahesu3 _u5f31b66",
@@ -4,6 +4,7 @@ import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { memo, forwardRef } from 'react';
5
5
  import Emoji from './Emoji';
6
6
  import { TONESELECTOR_KEYBOARD_KEYS_SUPPORTED } from '../../util/constants';
7
+ import { isTeamoji26RefreshEmojiPickerEnabledNoExposure } from '../../util/teamoji26RefreshEmojiPicker';
7
8
  import VisuallyHidden from '@atlaskit/visually-hidden/visually-hidden';
8
9
  import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
9
10
  const emojiButton = null;
@@ -11,7 +12,7 @@ const emojiRadio = {
11
12
  default: "_tzy4idpf _kqswstnw _154i14id _1ltv14id _3y8mfajl _157z1r31 _1dzmglyw _1sqm1o36 _fh6w1y54 _1i1213zc"
12
13
  };
13
14
  const handleKeyDown = (props, event) => {
14
- if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && expValEqualsNoExposure('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true)) {
15
+ if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTeamoji26RefreshEmojiPickerEnabledNoExposure()) {
15
16
  var _props$onArrowKey;
16
17
  event.preventDefault();
17
18
  event.stopPropagation();
@@ -50,7 +51,7 @@ export const EmojiRadioButton = /*#__PURE__*/forwardRef((props, ref) => {
50
51
  return (_props$onSelected = props.onSelected) === null || _props$onSelected === void 0 ? void 0 : _props$onSelected.call(props);
51
52
  },
52
53
  onKeyDown: event => handleKeyDown(props, event),
53
- onChange: expValEqualsNoExposure('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true) ? e => e.preventDefault() : undefined,
54
+ onChange: isTeamoji26RefreshEmojiPickerEnabledNoExposure() ? e => e.preventDefault() : undefined,
54
55
  className: ax([emojiRadio.default])
55
56
  }), /*#__PURE__*/React.createElement(Emoji, {
56
57
  emoji: emoji,
@@ -18,20 +18,11 @@ import EmojiUploadPreview from './EmojiUploadPreview';
18
18
  import FileChooser from './FileChooser';
19
19
  import { UploadStatus } from './internal-types';
20
20
  import { fg } from '@atlaskit/platform-feature-flags/fg';
21
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
22
21
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
23
22
  import Button from '@atlaskit/button/default/button';
24
23
  import { Box } from '@atlaskit/primitives/compiled';
25
24
  import { getDocument } from '@atlaskit/browser-apis';
26
- const isRefreshEmojiPickerEnabled = () => {
27
- if (!FeatureGates.initializeCompleted()) {
28
- return false;
29
- }
30
-
31
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
32
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
33
- return isEnabled;
34
- };
25
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
35
26
  const closeEmojiUploadButton = null;
36
27
  const uploadAddRowNew = null;
37
28
  const emojiUpload = null;
@@ -7,16 +7,7 @@ import UploadIcon from '@atlaskit/icon/core/upload';
7
7
  import { dropTargetForExternal } from '@atlaskit/pragmatic-drag-and-drop/adapter/drop-target-for-external';
8
8
  import { containsFiles } from '@atlaskit/pragmatic-drag-and-drop/utils/contains-files';
9
9
  import { getFiles } from '@atlaskit/pragmatic-drag-and-drop/utils/get-files';
10
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
11
- const isRefreshEmojiPickerEnabled = () => {
12
- if (!FeatureGates.initializeCompleted()) {
13
- return false;
14
- }
15
-
16
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
17
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
18
- return isEnabled;
19
- };
10
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
20
11
  export const chooseFileButtonTestId = 'choose-file-button';
21
12
  export const fileUploadInputTestId = 'file-upload';
22
13
  export const dropzoneTestId = 'file-dropzone';
@@ -19,6 +19,7 @@ import DeleteButton from './DeleteButton';
19
19
  import { EmojiNodeWrapper } from './Emoji';
20
20
  import { handleDelete } from './handleDelete';
21
21
  import { emojiNodeStyles, commonSelectedStyles, selectOnHoverStyles, emojiMainStyle, emojiImage, deletableEmoji } from './styles';
22
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
22
23
  const handleImageError = (props, event) => {
23
24
  const {
24
25
  emoji,
@@ -46,7 +47,8 @@ export const ImageEmoji = props => {
46
47
  showDelete,
47
48
  onLoadSuccess,
48
49
  disableLazyLoad,
49
- autoWidth
50
+ autoWidth,
51
+ isDecorative
50
52
  } = props;
51
53
  const [ref, inView] = useInView({
52
54
  triggerOnce: true
@@ -125,11 +127,12 @@ export const ImageEmoji = props => {
125
127
  onBeforeLoad();
126
128
  }
127
129
  }, [inView, onBeforeLoad]);
130
+ const imgAlt = isDecorative && fg('emoji_decorative_label') ? '' : emoji.name || emoji.shortName || '';
128
131
  const emojiNode = /*#__PURE__*/React.createElement("img", _extends({
129
132
  loading: disableLazyLoad ? 'eager' : 'lazy',
130
133
  src: src,
131
134
  key: src,
132
- alt: emoji.name || emoji.shortName || '',
135
+ alt: imgAlt,
133
136
  "data-emoji-short-name": emoji.shortName,
134
137
  "data-emoji-id": emoji.id,
135
138
  "data-emoji-text": emoji.fallback || emoji.shortName
@@ -3,6 +3,7 @@ import "./TonePreviewButton.compiled.css";
3
3
  import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { forwardRef, memo } from 'react';
6
+ import { isTeamoji26RefreshEmojiPickerEnabledNoExposure } from '../../util/teamoji26RefreshEmojiPicker';
6
7
  import Emoji from './Emoji';
7
8
  import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
8
9
  export const tonePreviewTestId = 'tone-preview';
@@ -22,7 +23,7 @@ export const TonePreviewButton = /*#__PURE__*/forwardRef((props, ref) => {
22
23
  isVisible = true
23
24
  } = props;
24
25
  const fitToHeight = expValEqualsNoExposure('platform_use_unicode_emojis', 'isEnabled', true) ? 24 : undefined;
25
- return expValEqualsNoExposure('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true) ? /*#__PURE__*/React.createElement("button", {
26
+ return isTeamoji26RefreshEmojiPickerEnabledNoExposure() ? /*#__PURE__*/React.createElement("button", {
26
27
  ref: ref,
27
28
  onClick: onSelected,
28
29
  onKeyDown: onKeyDown,
@@ -3,7 +3,6 @@ import "./ToneSelectorInternal.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { useCallback, useEffect, useMemo, useRef } from 'react';
5
5
  import { useIntl } from 'react-intl';
6
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
7
6
  import { createAndFireEventInElementsChannel } from '../../util/analytics/analytics';
8
7
  import { toneSelectedEvent } from '../../util/analytics/toneSelectedEvent';
9
8
  import { toneSelectorOpenedEvent } from '../../util/analytics/toneSelectorOpenedEvent';
@@ -11,15 +10,7 @@ import { messages } from '../i18n';
11
10
  import EmojiRadioButton from './EmojiRadioButton';
12
11
  import { toneSelectorTestId } from './ToneSelector';
13
12
  import { setSkinToneAriaLabelText } from './setSkinToneAriaLabelText';
14
- const isRefreshEmojiPickerEnabled = () => {
15
- if (!FeatureGates.initializeCompleted()) {
16
- return false;
17
- }
18
-
19
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
20
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
21
- return isEnabled;
22
- };
13
+ import { isRefreshEmojiPickerEnabled } from './isRefreshEmojiPickerEnabled';
23
14
  const hidden = null;
24
15
  const extractAllTones = emoji => {
25
16
  if (emoji.skinVariations) {
@@ -1,15 +1,4 @@
1
- /**
2
- * @jsxRuntime classic
3
- * @jsx jsx
4
- */
5
-
6
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
1
+ import { isTeamoji26RefreshEmojiPickerEnabled } from '../../util/teamoji26RefreshEmojiPicker';
7
2
  export const isRefreshEmojiPickerEnabled = () => {
8
- if (!FeatureGates.initializeCompleted()) {
9
- return false;
10
- }
11
-
12
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
13
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
14
- return isEnabled;
3
+ return isTeamoji26RefreshEmojiPickerEnabled();
15
4
  };
@@ -16,15 +16,7 @@ import { categorySelectorCategoryTestId } from './categorySelectorCategoryTestId
16
16
  import { RENDER_EMOJI_PICKER_LIST_TESTID } from './EmojiPickerList';
17
17
  import { sortCategories } from './sortCategories';
18
18
  import { sortCategoriesNew } from './sortCategoriesNew';
19
- const isRefreshEmojiPickerEnabled = () => {
20
- if (!FeatureGates.initializeCompleted()) {
21
- return false;
22
- }
23
-
24
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
25
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
26
- return isEnabled;
27
- };
19
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
28
20
  const isEmojiPickerInitialFocusFixEnabled = () => {
29
21
  if (!FeatureGates.initializeCompleted()) {
30
22
  return false;
@@ -6,7 +6,6 @@ import { useCallback, useEffect, useMemo, useRef, useState, createRef, memo } fr
6
6
  import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
7
7
  import { FormattedMessage, useIntl } from 'react-intl';
8
8
  import { getDocument } from '@atlaskit/browser-apis';
9
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
10
9
  import { combine } from '@atlaskit/pragmatic-drag-and-drop/utils/combine';
11
10
  import { dropTargetForExternal } from '@atlaskit/pragmatic-drag-and-drop/adapter/drop-target-for-external';
12
11
  import { monitorForExternal } from '@atlaskit/pragmatic-drag-and-drop/adapter/monitor-for-external';
@@ -42,19 +41,11 @@ import { isPromise } from '../../util/is-promise';
42
41
  import { defaultProductivityColor, getStoredProductivityColor, storeProductivityColor } from '../../util/productivity-colors';
43
42
  import { createRecordSelectionDefault } from '../common/RecordSelectionDefault';
44
43
  import { uploadEmoji } from '../common/UploadEmoji';
44
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
45
45
  import { messages } from '../i18n';
46
46
  import CategorySelector from './CategorySelector';
47
47
  import EmojiPickerFooter from './EmojiPickerFooter';
48
48
  import { EmojiPickerVirtualListInternal as EmojiPickerList } from './EmojiPickerList';
49
- const isRefreshEmojiPickerEnabled = () => {
50
- if (!FeatureGates.initializeCompleted()) {
51
- return false;
52
- }
53
-
54
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
55
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
56
- return isEnabled;
57
- };
58
49
  const emojiPickerBoxShadow = "var(--ds-shadow-overlay, 0px 8px 12px #1E1F2126, 0px 0px 1px #1E1F214f)";
59
50
  const emojiPickerHeight = 295;
60
51
  const emojiPickerHeightWithPreview = 349; // emojiPickerHeight + emojiPickerPreviewHeight;
@@ -6,6 +6,7 @@ import { memo } from 'react';
6
6
  import { useIntl } from 'react-intl';
7
7
  import CachingEmoji from '../common/CachingEmoji';
8
8
  import { useEmojiPickerListContext } from '../../hooks/useEmojiPickerListContext';
9
+ import { isTeamoji26RefreshEmojiPickerEnabledNoExposure } from '../../util/teamoji26RefreshEmojiPicker';
9
10
  import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
10
11
  import { messages } from '../i18n';
11
12
  const emojiItem = null;
@@ -30,7 +31,7 @@ const EmojiPickerEmojiRow = ({
30
31
  formatMessage
31
32
  } = useIntl();
32
33
  const fitToHeight = expValEqualsNoExposure('platform_use_unicode_emojis', 'isEnabled', true) ? 24 : undefined;
33
- const preventFocusOnMouseDown = expValEqualsNoExposure('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true);
34
+ const preventFocusOnMouseDown = isTeamoji26RefreshEmojiPickerEnabledNoExposure();
34
35
  const handleFocus = index => (emojiId, emoji, event) => {
35
36
  setEmojisFocus({
36
37
  rowIndex,
@@ -7,16 +7,7 @@ import { useIntl } from 'react-intl';
7
7
  import { Box } from '@atlaskit/primitives/compiled';
8
8
  import { EmojiPreviewComponent } from '../common/EmojiPreviewComponent';
9
9
  import { AddOwnEmoji } from '../common/AddEmoji';
10
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
11
- const isRefreshEmojiPickerEnabled = () => {
12
- if (!FeatureGates.initializeCompleted()) {
13
- return false;
14
- }
15
-
16
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
17
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
18
- return isEnabled;
19
- };
10
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
20
11
  const emojiPickerFooter = null;
21
12
  const emojiPickerFooterWithTopShadow = null;
22
13
  const emojiPickerFooterWithTopShadowNew = null;
@@ -3,22 +3,16 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import "./EmojiPickerInternal.compiled.css";
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import React from 'react';
6
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
7
6
  import { EmojiCommonProvider } from '../../context/EmojiCommonProvider';
8
7
  import { ufoExperiences } from '../../util/analytics/ufoExperiences';
9
8
  import { defaultEmojiPickerSize } from '../../util/constants';
9
+ import { isTeamoji26RefreshEmojiPickerEnabled } from '../../util/teamoji26RefreshEmojiPicker';
10
10
  import LoadingEmojiComponent from '../common/LoadingEmojiComponent';
11
11
  import { UfoErrorBoundary } from '../common/UfoErrorBoundary';
12
12
  import { LoadingItem } from './LoadingItem';
13
13
  import { emojiPickerLoader } from './emojiPickerLoader';
14
14
  const isRefreshEmojiPickerEnabled = () => {
15
- if (!FeatureGates.initializeCompleted()) {
16
- return false;
17
- }
18
-
19
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
20
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
21
- return isEnabled;
15
+ return isTeamoji26RefreshEmojiPickerEnabled();
22
16
  };
23
17
  const emojiPicker = null;
24
18
  const emojiPickerNew = null;
@@ -1,11 +1,11 @@
1
1
  import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
4
3
  import { EmojiPickerListContextProvider } from '../../context/EmojiPickerListContext';
5
4
  import { customCategory, defaultEmojiPickerSize, emojiPickerPreviewHeight, frequentCategory, searchCategory, userCustomTitle, yourUploadsCategory } from '../../util/constants';
6
5
  import { filterHiddenEmojis } from '../../util/filter-hidden-emojis';
7
6
  import { filterProductivityEmojisByColor, getProductivityColorPreviewEmojis } from '../../util/productivity-colors';
8
7
  import EmojiActions from '../common/EmojiActions';
8
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
9
9
  import { messages } from '../i18n';
10
10
  import { CategoryDescriptionMap, CategoryDescriptionMapNew } from './categories';
11
11
  import { CategoryHeadingItem } from './CategoryHeadingItem';
@@ -25,16 +25,6 @@ import { virtualItemRenderer } from './virtualItemRenderer';
25
25
  */
26
26
  export const RENDER_EMOJI_PICKER_LIST_TESTID = 'render-emoji-picker-list';
27
27
  const categoryClassname = 'emoji-category';
28
- const teamojiRefreshExperimentName = 'platform_teamoji_26_refresh_emoji_picker';
29
- const isRefreshEmojiPickerEnabled = () => {
30
- if (!FeatureGates.initializeCompleted()) {
31
- return false;
32
- }
33
-
34
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
35
- const isEnabled = FeatureGates.getExperimentValue(teamojiRefreshExperimentName, 'isEnabled', false);
36
- return isEnabled;
37
- };
38
28
  const atlassianCategory = 'ATLASSIAN';
39
29
  const productivityAtlassianSubcategory = 'Productivity';
40
30
  const atlassianSubcategoryOrder = ['Faces', 'Hands', 'Reactions', 'Objects', productivityAtlassianSubcategory, 'Logos'];
@@ -10,15 +10,7 @@ import { useDebouncedCallback } from 'use-debounce';
10
10
  import { EMOJI_SEARCH_DEBOUNCE } from '../../util/constants';
11
11
  import { messages } from '../i18n';
12
12
  import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
13
- const isRefreshEmojiPickerEnabled = () => {
14
- if (!FeatureGates.initializeCompleted()) {
15
- return false;
16
- }
17
-
18
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
19
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
20
- return isEnabled;
21
- };
13
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
22
14
  const isEmojiPickerInitialFocusFixEnabled = () => {
23
15
  if (!FeatureGates.initializeCompleted()) {
24
16
  return false;
@@ -3,18 +3,9 @@ import "./VirtualList.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { useCallback, useImperativeHandle } from 'react';
5
5
  import { useVirtualizer } from '@tanstack/react-virtual';
6
- import FeatureGates from '@atlaskit/feature-gate-js-client/feature-gates';
7
6
  import { useEmojiPickerListContext } from '../../hooks/useEmojiPickerListContext';
8
7
  import { EMOJIPICKERLIST_KEYBOARD_KEYS_SUPPORTED, EMOJI_LIST_COLUMNS, EMOJI_LIST_PAGE_COUNT, KeyboardNavigationDirection, KeyboardKeys } from '../../util/constants';
9
- const isRefreshEmojiPickerEnabled = () => {
10
- if (!FeatureGates.initializeCompleted()) {
11
- return false;
12
- }
13
-
14
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils
15
- const isEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
16
- return isEnabled;
17
- };
8
+ import { isRefreshEmojiPickerEnabled } from '../common/isRefreshEmojiPickerEnabled';
18
9
  const virtualList = null;
19
10
  const virtualRowStyle = null;
20
11
  export const virtualListScrollContainerTestId = 'virtual-list-scroll-container';
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import { PureComponent } from 'react';
4
4
  import { flushSync } from 'react-dom';
5
5
  // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
6
- import uuid from 'uuid';
6
+ import { v4 as uuid } from 'uuid';
7
7
  import { EmojiCommonProvider } from '../../context/EmojiCommonProvider';
8
8
  import { SearchSort, SearchSourceTypes } from '../../types';
9
9
  import { typeaheadCancelledEvent } from '../../util/analytics/typeaheadCancelledEvent';
@@ -7,7 +7,7 @@ export const createEvent = (eventType, action, actionSubject, actionSubjectId, a
7
7
  actionSubjectId,
8
8
  attributes: {
9
9
  packageName: "@atlaskit/emoji",
10
- packageVersion: "72.2.5",
10
+ packageVersion: "72.3.0",
11
11
  ...attributes
12
12
  }
13
13
  });
@@ -0,0 +1,11 @@
1
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
2
+ import { UNSAFE_expValNoExposure } from '@atlaskit/platform-feature-experiments/unsafe-exp-val-no-exposure';
3
+ import { fg } from '@atlaskit/platform-feature-flags/fg';
4
+ export const teamoji26RefreshEmojiPickerExperimentName = 'platform_teamoji_26_refresh_emoji_picker';
5
+ export const teamoji26RefreshEmojiPickerUserIdGateName = 'platform_teamoji_26_refresh_emoji_picker_user_id';
6
+ export const isTeamoji26RefreshEmojiPickerEnabled = () => {
7
+ return isExperimentEnabled(teamoji26RefreshEmojiPickerExperimentName) || fg(teamoji26RefreshEmojiPickerUserIdGateName);
8
+ };
9
+ export const isTeamoji26RefreshEmojiPickerEnabledNoExposure = () => {
10
+ return UNSAFE_expValNoExposure(teamoji26RefreshEmojiPickerExperimentName, 'isEnabled', false) === true || fg(teamoji26RefreshEmojiPickerUserIdGateName);
11
+ };