@atlaskit/emoji 67.8.5 → 67.8.7

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 (34) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/components/common/Emoji.js +3 -1
  3. package/dist/cjs/components/common/RecordSelectionDefault.js +2 -2
  4. package/dist/cjs/components/common/ResourcedEmoji.js +7 -18
  5. package/dist/cjs/components/picker/EmojiPickerComponent.js +1 -1
  6. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +2 -2
  7. package/dist/cjs/util/analytics/analytics.js +27 -6
  8. package/dist/cjs/util/analytics/index.js +12 -0
  9. package/dist/cjs/util/is-ssr.js +20 -0
  10. package/dist/es2019/components/common/Emoji.js +3 -1
  11. package/dist/es2019/components/common/RecordSelectionDefault.js +3 -3
  12. package/dist/es2019/components/common/ResourcedEmoji.js +4 -6
  13. package/dist/es2019/components/picker/EmojiPickerComponent.js +1 -1
  14. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +3 -3
  15. package/dist/es2019/util/analytics/analytics.js +22 -5
  16. package/dist/es2019/util/analytics/index.js +1 -1
  17. package/dist/es2019/util/is-ssr.js +14 -0
  18. package/dist/esm/components/common/Emoji.js +3 -1
  19. package/dist/esm/components/common/RecordSelectionDefault.js +3 -3
  20. package/dist/esm/components/common/ResourcedEmoji.js +4 -12
  21. package/dist/esm/components/picker/EmojiPickerComponent.js +1 -1
  22. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +3 -3
  23. package/dist/esm/util/analytics/analytics.js +26 -5
  24. package/dist/esm/util/analytics/index.js +1 -1
  25. package/dist/esm/util/is-ssr.js +14 -0
  26. package/dist/types/components/common/ResourcedEmoji.d.ts +1 -1
  27. package/dist/types/util/analytics/analytics.d.ts +6 -4
  28. package/dist/types/util/analytics/index.d.ts +1 -1
  29. package/dist/types/util/is-ssr.d.ts +1 -0
  30. package/dist/types-ts4.5/components/common/ResourcedEmoji.d.ts +1 -1
  31. package/dist/types-ts4.5/util/analytics/analytics.d.ts +6 -4
  32. package/dist/types-ts4.5/util/analytics/index.d.ts +1 -1
  33. package/dist/types-ts4.5/util/is-ssr.d.ts +1 -0
  34. package/package.json +5 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.8.7
4
+
5
+ ### Patch Changes
6
+
7
+ - [`b0c0a2b36fb8e`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/b0c0a2b36fb8e) -
8
+ Add a feature gate that can bypass the sampling rate of rendered emoji performance metrics for
9
+ selected tenants, allowing better measurements for those tenants
10
+
11
+ ## 67.8.6
12
+
13
+ ### Patch Changes
14
+
15
+ - [#151665](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/151665)
16
+ [`959c5fa5fc8b4`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/959c5fa5fc8b4) -
17
+ Add emoji attributes to recordEmojiSelection events
18
+
3
19
  ## 67.8.5
4
20
 
5
21
  ### Patch Changes
@@ -25,6 +25,7 @@ var _browserSupport = _interopRequireDefault(require("../../util/browser-support
25
25
  var _useInView3 = require("../../hooks/useInView");
26
26
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
27
27
  var _DeletableEmojiTooltipContent = require("./DeletableEmojiTooltipContent");
28
+ var _isSsr = require("../../util/is-ssr");
28
29
  var _excluded = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "showDelete", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "disableLazyLoad", "autoWidth", "children", "type", "editorEmoji"];
29
30
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
30
31
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -171,7 +172,8 @@ var ImageEmoji = exports.ImageEmoji = function ImageEmoji(props) {
171
172
  if (fitToHeight && width && height) {
172
173
  // Presize image, to prevent reflow due to size changes after loading
173
174
  sizing = {
174
- width: autoWidth ? 'auto' : fitToHeight / height * width,
175
+ // Size of <img> needs to be deterministic when rendered on server-side. Auto will cause width to be 0 before image is loaded.
176
+ width: autoWidth && !(0, _isSsr.isSSR)() ? 'auto' : fitToHeight / height * width,
175
177
  height: fitToHeight
176
178
  };
177
179
  }
@@ -20,10 +20,10 @@ var createRecordSelectionDefault = exports.createRecordSelectionDefault = functi
20
20
  if (provider.recordSelection && emoji) {
21
21
  _analytics.ufoExperiences['emoji-selection-recorded'].start();
22
22
  provider.recordSelection(emoji).then(function () {
23
- fireAnalytics && fireAnalytics(_analytics.recordSucceeded);
23
+ fireAnalytics && fireAnalytics((0, _analytics.recordSucceededEmoji)(emoji));
24
24
  _analytics.ufoExperiences['emoji-selection-recorded'].success();
25
25
  }).catch(function (error) {
26
- fireAnalytics && fireAnalytics(_analytics.recordFailed);
26
+ fireAnalytics && fireAnalytics((0, _analytics.recordFailedEmoji)(emoji));
27
27
  _analytics.ufoExperiences['emoji-selection-recorded'].failure({
28
28
  metadata: {
29
29
  error: (0, _analytics2.extractErrorInfo)(error),
@@ -1,30 +1,18 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
8
  var _react = _interopRequireWildcard(require("react"));
10
- var _reactLoadable = _interopRequireDefault(require("react-loadable"));
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
+ var _ResourcedEmojiComponent = require("./ResourcedEmojiComponent");
11
11
  var _UfoErrorBoundary = require("./UfoErrorBoundary");
12
12
  var _analytics = require("../../util/analytics");
13
13
  var _constants = require("../../util/constants");
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != (0, _typeof2.default)(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
- var ResourcedEmojiComponent = (0, _reactLoadable.default)({
17
- loader: function loader() {
18
- return Promise.resolve().then(function () {
19
- return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_resourcedEmojiComponent" */'./ResourcedEmojiComponent'));
20
- }).then(function (component) {
21
- return component.ResourcedEmojiComponent;
22
- });
23
- },
24
- loading: function loading() {
25
- return null;
26
- }
27
- });
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
28
16
  var ResourcedEmoji = function ResourcedEmoji(props) {
29
17
  var emojiId = props.emojiId,
30
18
  optimisticImageURL = props.optimisticImageURL;
@@ -32,8 +20,9 @@ var ResourcedEmoji = function ResourcedEmoji(props) {
32
20
  if (!emojiId) {
33
21
  return;
34
22
  }
23
+ var shouldAlwaysSample = (0, _platformFeatureFlags.fg)('platform_always_sample_rendered_emoji');
35
24
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).start({
36
- samplingRate: _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP
25
+ samplingRate: shouldAlwaysSample ? 1 : _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP
37
26
  });
38
27
  _analytics.ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName).addMetadata({
39
28
  source: 'ResourcedEmoji',
@@ -51,6 +40,6 @@ var ResourcedEmoji = function ResourcedEmoji(props) {
51
40
  }, [emojiId, optimisticImageURL]);
52
41
  return /*#__PURE__*/_react.default.createElement(_UfoErrorBoundary.UfoErrorBoundary, {
53
42
  experiences: [_analytics.ufoExperiences['emoji-rendered'].getInstance(props.emojiId.id || props.emojiId.shortName)]
54
- }, /*#__PURE__*/_react.default.createElement(ResourcedEmojiComponent, props));
43
+ }, /*#__PURE__*/_react.default.createElement(_ResourcedEmojiComponent.ResourcedEmojiComponent, props));
55
44
  };
56
45
  var _default = exports.default = ResourcedEmoji;
@@ -298,7 +298,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
298
298
  }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, selectedTone]);
299
299
  var recordUsageOnSelection = (0, _react.useMemo)(function () {
300
300
  return (0, _RecordSelectionDefault.createRecordSelectionDefault)(emojiProvider, onSelectWrapper, function (analytic) {
301
- return fireAnalytics(analytic('picker'));
301
+ return fireAnalytics(analytic(_types.SearchSourceTypes.PICKER));
302
302
  });
303
303
  }, [emojiProvider, fireAnalytics, onSelectWrapper]);
304
304
  var formattedErrorMessage = (0, _react.useMemo)(function () {
@@ -118,7 +118,7 @@ var EmojiTypeAheadComponent = exports.default = /*#__PURE__*/function (_PureComp
118
118
  var matchIndex = uniqueExactShortNameMatchIndex(result, query);
119
119
  if (matchIndex !== undefined) {
120
120
  var onSelect = (0, _RecordSelectionDefault.createRecordSelectionDefault)(_this.props.emojiProvider, _this.props.onSelection, function (analytic) {
121
- return _this.fireAnalyticsEvent(analytic('typeahead'));
121
+ return _this.fireAnalyticsEvent(analytic(_types.SearchSourceTypes.TYPEAHEAD));
122
122
  });
123
123
  _this.fireSelectionEvent(result.emojis[matchIndex], true);
124
124
  onSelect((0, _typeHelpers.toEmojiId)(result.emojis[matchIndex]), result.emojis[matchIndex]);
@@ -255,7 +255,7 @@ var EmojiTypeAheadComponent = exports.default = /*#__PURE__*/function (_PureComp
255
255
  onSelection(emojiId, emoji, event);
256
256
  }
257
257
  }, function (analytic) {
258
- return _this2.fireAnalyticsEvent(analytic('typeahead'));
258
+ return _this2.fireAnalyticsEvent(analytic(_types.SearchSourceTypes.TYPEAHEAD));
259
259
  });
260
260
  var _this$state = this.state,
261
261
  visible = _this$state.visible,
@@ -4,9 +4,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.uploadSucceededEvent = exports.uploadFailedEvent = exports.uploadConfirmButton = exports.uploadCancelButton = exports.uploadBeginButton = exports.typeaheadSelectedEvent = exports.typeaheadRenderedEvent = exports.typeaheadCancelledEvent = exports.toneSelectorOpenedEvent = exports.toneSelectorClosedEvent = exports.toneSelectedEvent = exports.selectedFileEvent = exports.recordSucceeded = exports.recordSelectionSucceededSli = exports.recordSelectionFailedSli = exports.recordFailed = exports.pickerSearchedEvent = exports.pickerClickedEvent = exports.openedPickerEvent = exports.extractErrorInfo = exports.deleteConfirmEvent = exports.deleteCancelEvent = exports.deleteBeginEvent = exports.createAndFireEventInElementsChannel = exports.closedPickerEvent = exports.categoryClickedEvent = void 0;
7
+ exports.uploadSucceededEvent = exports.uploadFailedEvent = exports.uploadConfirmButton = exports.uploadCancelButton = exports.uploadBeginButton = exports.typeaheadSelectedEvent = exports.typeaheadRenderedEvent = exports.typeaheadCancelledEvent = exports.toneSelectorOpenedEvent = exports.toneSelectorClosedEvent = exports.toneSelectedEvent = exports.selectedFileEvent = exports.recordSucceededEmoji = exports.recordSucceeded = exports.recordSelectionSucceededSli = exports.recordSelectionFailedSli = exports.recordFailedEmoji = exports.recordFailed = exports.pickerSearchedEvent = exports.pickerClickedEvent = exports.openedPickerEvent = exports.extractErrorInfo = exports.deleteConfirmEvent = exports.deleteCancelEvent = exports.deleteBeginEvent = exports.createAndFireEventInElementsChannel = exports.closedPickerEvent = exports.categoryClickedEvent = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _analyticsNext = require("@atlaskit/analytics-next");
10
+ var _types = require("../../types");
10
11
  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; }
11
12
  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) { (0, _defineProperty2.default)(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; }
12
13
  var createAndFireEventInElementsChannel = exports.createAndFireEventInElementsChannel = (0, _analyticsNext.createAndFireEvent)('fabric-elements');
@@ -19,15 +20,35 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
19
20
  actionSubjectId: actionSubjectId,
20
21
  attributes: _objectSpread({
21
22
  packageName: "@atlaskit/emoji",
22
- packageVersion: "67.8.5"
23
+ packageVersion: "67.8.7"
23
24
  }, attributes)
24
25
  };
25
26
  };
27
+ var recordSucceededEmoji = exports.recordSucceededEmoji = function recordSucceededEmoji(emoji) {
28
+ return function (source) {
29
+ return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
30
+ source: source,
31
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
32
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
33
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
34
+ });
35
+ };
36
+ };
26
37
  var recordSucceeded = exports.recordSucceeded = function recordSucceeded(source) {
27
38
  return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
28
39
  source: source
29
40
  });
30
41
  };
42
+ var recordFailedEmoji = exports.recordFailedEmoji = function recordFailedEmoji(emoji) {
43
+ return function (source) {
44
+ return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
45
+ source: source,
46
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
47
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
48
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
49
+ });
50
+ };
51
+ };
31
52
  var recordFailed = exports.recordFailed = function recordFailed(source) {
32
53
  return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
33
54
  source: source
@@ -168,19 +189,19 @@ var typeaheadRenderedEvent = exports.typeaheadRenderedEvent = function typeahead
168
189
  };
169
190
 
170
191
  // it's used in editor typeahead to fire success record analytics
171
- var recordSelectionSucceededSli = exports.recordSelectionSucceededSli = function recordSelectionSucceededSli(options) {
192
+ var recordSelectionSucceededSli = exports.recordSelectionSucceededSli = function recordSelectionSucceededSli(emoji, options) {
172
193
  return function () {
173
194
  if (options && options.createAnalyticsEvent) {
174
- (0, _analyticsNext.createAndFireEvent)('editor')(recordSucceeded('typeahead'))(options.createAnalyticsEvent);
195
+ (0, _analyticsNext.createAndFireEvent)('editor')(recordSucceededEmoji(emoji)(_types.SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
175
196
  }
176
197
  };
177
198
  };
178
199
 
179
200
  // it's used in editor typeahead to fire failure record analytics
180
- var recordSelectionFailedSli = exports.recordSelectionFailedSli = function recordSelectionFailedSli(options) {
201
+ var recordSelectionFailedSli = exports.recordSelectionFailedSli = function recordSelectionFailedSli(emoji, options) {
181
202
  return function (err) {
182
203
  if (options && options.createAnalyticsEvent) {
183
- (0, _analyticsNext.createAndFireEvent)('editor')(recordFailed('typeahead'))(options.createAnalyticsEvent);
204
+ (0, _analyticsNext.createAndFireEvent)('editor')(recordFailedEmoji(emoji)(_types.SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
184
205
  }
185
206
  return Promise.reject(err);
186
207
  };
@@ -75,6 +75,12 @@ Object.defineProperty(exports, "recordFailed", {
75
75
  return _analytics.recordFailed;
76
76
  }
77
77
  });
78
+ Object.defineProperty(exports, "recordFailedEmoji", {
79
+ enumerable: true,
80
+ get: function get() {
81
+ return _analytics.recordFailedEmoji;
82
+ }
83
+ });
78
84
  Object.defineProperty(exports, "recordSelectionFailedSli", {
79
85
  enumerable: true,
80
86
  get: function get() {
@@ -93,6 +99,12 @@ Object.defineProperty(exports, "recordSucceeded", {
93
99
  return _analytics.recordSucceeded;
94
100
  }
95
101
  });
102
+ Object.defineProperty(exports, "recordSucceededEmoji", {
103
+ enumerable: true,
104
+ get: function get() {
105
+ return _analytics.recordSucceededEmoji;
106
+ }
107
+ });
96
108
  Object.defineProperty(exports, "sampledUfoRenderedEmoji", {
97
109
  enumerable: true,
98
110
  get: function get() {
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isSSR = isSSR;
7
+ function isSSR() {
8
+ try {
9
+ var _process;
10
+ return Boolean(
11
+ // In most places there is no document when running on server-side
12
+ typeof document === 'undefined' ||
13
+ // When SSRing editor with full cycle mode we define the document
14
+ // Check Confluence specific environment variable
15
+ typeof process !== 'undefined' && ((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.REACT_SSR));
16
+ } catch (e) {
17
+ // Catch possible error that might occur and just return false
18
+ return false;
19
+ }
20
+ }
@@ -19,6 +19,7 @@ import browserSupport from '../../util/browser-support';
19
19
  import { useInView } from '../../hooks/useInView';
20
20
  import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
21
21
  import { DeletableEmojiTooltipContent, DeletableEmojiTooltipContentForScreenReader } from './DeletableEmojiTooltipContent';
22
+ import { isSSR } from '../../util/is-ssr';
22
23
  const handleMouseDown = (props, event) => {
23
24
  // Clicked emoji delete button
24
25
  if (event.target instanceof Element && event.target.getAttribute('aria-label') === deleteEmojiLabel) {
@@ -171,7 +172,8 @@ export const ImageEmoji = props => {
171
172
  if (fitToHeight && width && height) {
172
173
  // Presize image, to prevent reflow due to size changes after loading
173
174
  sizing = {
174
- width: autoWidth ? 'auto' : fitToHeight / height * width,
175
+ // Size of <img> needs to be deterministic when rendered on server-side. Auto will cause width to be 0 before image is loaded.
176
+ width: autoWidth && !isSSR() ? 'auto' : fitToHeight / height * width,
175
177
  height: fitToHeight
176
178
  };
177
179
  }
@@ -1,4 +1,4 @@
1
- import { recordFailed, recordSucceeded, ufoExperiences } from '../../util/analytics';
1
+ import { recordFailedEmoji, recordSucceededEmoji, ufoExperiences } from '../../util/analytics';
2
2
  import { extractErrorInfo } from '../../util/analytics/analytics';
3
3
 
4
4
  /**
@@ -15,10 +15,10 @@ export const createRecordSelectionDefault = (provider, onSelect, fireAnalytics)
15
15
  if (provider.recordSelection && emoji) {
16
16
  ufoExperiences['emoji-selection-recorded'].start();
17
17
  provider.recordSelection(emoji).then(() => {
18
- fireAnalytics && fireAnalytics(recordSucceeded);
18
+ fireAnalytics && fireAnalytics(recordSucceededEmoji(emoji));
19
19
  ufoExperiences['emoji-selection-recorded'].success();
20
20
  }).catch(error => {
21
- fireAnalytics && fireAnalytics(recordFailed);
21
+ fireAnalytics && fireAnalytics(recordFailedEmoji(emoji));
22
22
  ufoExperiences['emoji-selection-recorded'].failure({
23
23
  metadata: {
24
24
  error: extractErrorInfo(error),
@@ -1,12 +1,9 @@
1
1
  import React, { useEffect } from 'react';
2
- import Loadable from 'react-loadable';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
3
+ import { ResourcedEmojiComponent } from './ResourcedEmojiComponent';
3
4
  import { UfoErrorBoundary } from './UfoErrorBoundary';
4
5
  import { sampledUfoRenderedEmoji, ufoExperiences } from '../../util/analytics';
5
6
  import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
6
- const ResourcedEmojiComponent = Loadable({
7
- loader: () => import( /* webpackChunkName: "@atlaskit-internal_resourcedEmojiComponent" */'./ResourcedEmojiComponent').then(component => component.ResourcedEmojiComponent),
8
- loading: () => null
9
- });
10
7
  const ResourcedEmoji = props => {
11
8
  const {
12
9
  emojiId,
@@ -16,8 +13,9 @@ const ResourcedEmoji = props => {
16
13
  if (!emojiId) {
17
14
  return;
18
15
  }
16
+ var shouldAlwaysSample = fg('platform_always_sample_rendered_emoji');
19
17
  sampledUfoRenderedEmoji(emojiId).start({
20
- samplingRate: SAMPLING_RATE_EMOJI_RENDERED_EXP
18
+ samplingRate: shouldAlwaysSample ? 1 : SAMPLING_RATE_EMOJI_RENDERED_EXP
21
19
  });
22
20
  ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName).addMetadata({
23
21
  source: 'ResourcedEmoji',
@@ -246,7 +246,7 @@ const EmojiPickerComponent = ({
246
246
  }
247
247
  });
248
248
  }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, selectedTone]);
249
- const recordUsageOnSelection = useMemo(() => createRecordSelectionDefault(emojiProvider, onSelectWrapper, analytic => fireAnalytics(analytic('picker'))), [emojiProvider, fireAnalytics, onSelectWrapper]);
249
+ const recordUsageOnSelection = useMemo(() => createRecordSelectionDefault(emojiProvider, onSelectWrapper, analytic => fireAnalytics(analytic(SearchSourceTypes.PICKER))), [emojiProvider, fireAnalytics, onSelectWrapper]);
250
250
  const formattedErrorMessage = useMemo(() => uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null, [uploadErrorMessage]);
251
251
  const onFileChooserClicked = useCallback(() => {
252
252
  fireAnalytics(selectedFileEvent());
@@ -10,7 +10,7 @@ import { PureComponent } from 'react';
10
10
  import { flushSync } from 'react-dom';
11
11
  import uuid from 'uuid';
12
12
  import { EmojiCommonProvider } from '../../context/EmojiCommonProvider';
13
- import { SearchSort } from '../../types';
13
+ import { SearchSort, SearchSourceTypes } from '../../types';
14
14
  import { typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, ufoExperiences } from '../../util/analytics';
15
15
  import { defaultListLimit } from '../../util/constants';
16
16
  import debug from '../../util/logger';
@@ -91,7 +91,7 @@ export default class EmojiTypeAheadComponent extends PureComponent {
91
91
  if (isFullShortName(query)) {
92
92
  const matchIndex = uniqueExactShortNameMatchIndex(result, query);
93
93
  if (matchIndex !== undefined) {
94
- const onSelect = createRecordSelectionDefault(this.props.emojiProvider, this.props.onSelection, analytic => this.fireAnalyticsEvent(analytic('typeahead')));
94
+ const onSelect = createRecordSelectionDefault(this.props.emojiProvider, this.props.onSelection, analytic => this.fireAnalyticsEvent(analytic(SearchSourceTypes.TYPEAHEAD)));
95
95
  this.fireSelectionEvent(result.emojis[matchIndex], true);
96
96
  onSelect(toEmojiId(result.emojis[matchIndex]), result.emojis[matchIndex]);
97
97
  }
@@ -221,7 +221,7 @@ export default class EmojiTypeAheadComponent extends PureComponent {
221
221
  if (onSelection) {
222
222
  onSelection(emojiId, emoji, event);
223
223
  }
224
- }, analytic => this.fireAnalyticsEvent(analytic('typeahead')));
224
+ }, analytic => this.fireAnalyticsEvent(analytic(SearchSourceTypes.TYPEAHEAD)));
225
225
  const {
226
226
  visible,
227
227
  emojis,
@@ -1,4 +1,5 @@
1
1
  import { createAndFireEvent } from '@atlaskit/analytics-next';
2
+ import { SearchSourceTypes } from '../../types';
2
3
  export const createAndFireEventInElementsChannel = createAndFireEvent('fabric-elements');
3
4
  const createEvent = (eventType, action, actionSubject, actionSubjectId, attributes = {}) => ({
4
5
  eventType,
@@ -7,15 +8,31 @@ const createEvent = (eventType, action, actionSubject, actionSubjectId, attribut
7
8
  actionSubjectId,
8
9
  attributes: {
9
10
  packageName: "@atlaskit/emoji",
10
- packageVersion: "67.8.5",
11
+ packageVersion: "67.8.7",
11
12
  ...attributes
12
13
  }
13
14
  });
15
+ export const recordSucceededEmoji = emoji => source => {
16
+ return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
17
+ source,
18
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
19
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
20
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
21
+ });
22
+ };
14
23
  export const recordSucceeded = source => {
15
24
  return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
16
25
  source
17
26
  });
18
27
  };
28
+ export const recordFailedEmoji = emoji => source => {
29
+ return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
30
+ source,
31
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
32
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
33
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
34
+ });
35
+ };
19
36
  export const recordFailed = source => {
20
37
  return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
21
38
  source
@@ -109,16 +126,16 @@ export const typeaheadRenderedEvent = (duration, query, emojiList) => createEven
109
126
  });
110
127
 
111
128
  // it's used in editor typeahead to fire success record analytics
112
- export const recordSelectionSucceededSli = options => () => {
129
+ export const recordSelectionSucceededSli = (emoji, options) => () => {
113
130
  if (options && options.createAnalyticsEvent) {
114
- createAndFireEvent('editor')(recordSucceeded('typeahead'))(options.createAnalyticsEvent);
131
+ createAndFireEvent('editor')(recordSucceededEmoji(emoji)(SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
115
132
  }
116
133
  };
117
134
 
118
135
  // it's used in editor typeahead to fire failure record analytics
119
- export const recordSelectionFailedSli = options => err => {
136
+ export const recordSelectionFailedSli = (emoji, options) => err => {
120
137
  if (options && options.createAnalyticsEvent) {
121
- createAndFireEvent('editor')(recordFailed('typeahead'))(options.createAnalyticsEvent);
138
+ createAndFireEvent('editor')(recordFailedEmoji(emoji)(SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
122
139
  }
123
140
  return Promise.reject(err);
124
141
  };
@@ -1,4 +1,4 @@
1
1
  export { ufoExperiencesSampled, clearSampled, isExperienceSampled, withSampling } from './samplingUfo';
2
- export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordSucceeded, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent } from './analytics';
2
+ export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordFailedEmoji, recordSucceeded, recordSucceededEmoji, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent } from './analytics';
3
3
  export { sampledUfoRenderedEmoji, ufoExperiences } from './ufoExperiences';
4
4
  export { useSampledUFOComponentExperience } from './useSampledUFOComponentExperience';
@@ -0,0 +1,14 @@
1
+ export function isSSR() {
2
+ try {
3
+ var _process, _process$env;
4
+ return Boolean(
5
+ // In most places there is no document when running on server-side
6
+ typeof document === 'undefined' ||
7
+ // When SSRing editor with full cycle mode we define the document
8
+ // Check Confluence specific environment variable
9
+ typeof process !== 'undefined' && ((_process = process) === null || _process === void 0 ? void 0 : (_process$env = _process.env) === null || _process$env === void 0 ? void 0 : _process$env.REACT_SSR));
10
+ } catch (e) {
11
+ // Catch possible error that might occur and just return false
12
+ return false;
13
+ }
14
+ }
@@ -25,6 +25,7 @@ import browserSupport from '../../util/browser-support';
25
25
  import { useInView } from '../../hooks/useInView';
26
26
  import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
27
27
  import { DeletableEmojiTooltipContent, DeletableEmojiTooltipContentForScreenReader } from './DeletableEmojiTooltipContent';
28
+ import { isSSR } from '../../util/is-ssr';
28
29
  var handleMouseDown = function handleMouseDown(props, event) {
29
30
  // Clicked emoji delete button
30
31
  if (event.target instanceof Element && event.target.getAttribute('aria-label') === deleteEmojiLabel) {
@@ -163,7 +164,8 @@ export var ImageEmoji = function ImageEmoji(props) {
163
164
  if (fitToHeight && width && height) {
164
165
  // Presize image, to prevent reflow due to size changes after loading
165
166
  sizing = {
166
- width: autoWidth ? 'auto' : fitToHeight / height * width,
167
+ // Size of <img> needs to be deterministic when rendered on server-side. Auto will cause width to be 0 before image is loaded.
168
+ width: autoWidth && !isSSR() ? 'auto' : fitToHeight / height * width,
167
169
  height: fitToHeight
168
170
  };
169
171
  }
@@ -1,4 +1,4 @@
1
- import { recordFailed, recordSucceeded, ufoExperiences } from '../../util/analytics';
1
+ import { recordFailedEmoji, recordSucceededEmoji, ufoExperiences } from '../../util/analytics';
2
2
  import { extractErrorInfo } from '../../util/analytics/analytics';
3
3
 
4
4
  /**
@@ -15,10 +15,10 @@ export var createRecordSelectionDefault = function createRecordSelectionDefault(
15
15
  if (provider.recordSelection && emoji) {
16
16
  ufoExperiences['emoji-selection-recorded'].start();
17
17
  provider.recordSelection(emoji).then(function () {
18
- fireAnalytics && fireAnalytics(recordSucceeded);
18
+ fireAnalytics && fireAnalytics(recordSucceededEmoji(emoji));
19
19
  ufoExperiences['emoji-selection-recorded'].success();
20
20
  }).catch(function (error) {
21
- fireAnalytics && fireAnalytics(recordFailed);
21
+ fireAnalytics && fireAnalytics(recordFailedEmoji(emoji));
22
22
  ufoExperiences['emoji-selection-recorded'].failure({
23
23
  metadata: {
24
24
  error: extractErrorInfo(error),
@@ -1,18 +1,9 @@
1
1
  import React, { useEffect } from 'react';
2
- import Loadable from 'react-loadable';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
3
+ import { ResourcedEmojiComponent } from './ResourcedEmojiComponent';
3
4
  import { UfoErrorBoundary } from './UfoErrorBoundary';
4
5
  import { sampledUfoRenderedEmoji, ufoExperiences } from '../../util/analytics';
5
6
  import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
6
- var ResourcedEmojiComponent = Loadable({
7
- loader: function loader() {
8
- return import( /* webpackChunkName: "@atlaskit-internal_resourcedEmojiComponent" */'./ResourcedEmojiComponent').then(function (component) {
9
- return component.ResourcedEmojiComponent;
10
- });
11
- },
12
- loading: function loading() {
13
- return null;
14
- }
15
- });
16
7
  var ResourcedEmoji = function ResourcedEmoji(props) {
17
8
  var emojiId = props.emojiId,
18
9
  optimisticImageURL = props.optimisticImageURL;
@@ -20,8 +11,9 @@ var ResourcedEmoji = function ResourcedEmoji(props) {
20
11
  if (!emojiId) {
21
12
  return;
22
13
  }
14
+ var shouldAlwaysSample = fg('platform_always_sample_rendered_emoji');
23
15
  sampledUfoRenderedEmoji(emojiId).start({
24
- samplingRate: SAMPLING_RATE_EMOJI_RENDERED_EXP
16
+ samplingRate: shouldAlwaysSample ? 1 : SAMPLING_RATE_EMOJI_RENDERED_EXP
25
17
  });
26
18
  ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName).addMetadata({
27
19
  source: 'ResourcedEmoji',
@@ -293,7 +293,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
293
293
  }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, selectedTone]);
294
294
  var recordUsageOnSelection = useMemo(function () {
295
295
  return createRecordSelectionDefault(emojiProvider, onSelectWrapper, function (analytic) {
296
- return fireAnalytics(analytic('picker'));
296
+ return fireAnalytics(analytic(SearchSourceTypes.PICKER));
297
297
  });
298
298
  }, [emojiProvider, fireAnalytics, onSelectWrapper]);
299
299
  var formattedErrorMessage = useMemo(function () {
@@ -21,7 +21,7 @@ import { PureComponent } from 'react';
21
21
  import { flushSync } from 'react-dom';
22
22
  import uuid from 'uuid';
23
23
  import { EmojiCommonProvider } from '../../context/EmojiCommonProvider';
24
- import { SearchSort } from '../../types';
24
+ import { SearchSort, SearchSourceTypes } from '../../types';
25
25
  import { typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, ufoExperiences } from '../../util/analytics';
26
26
  import { defaultListLimit } from '../../util/constants';
27
27
  import debug from '../../util/logger';
@@ -114,7 +114,7 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
114
114
  var matchIndex = uniqueExactShortNameMatchIndex(result, query);
115
115
  if (matchIndex !== undefined) {
116
116
  var onSelect = createRecordSelectionDefault(_this.props.emojiProvider, _this.props.onSelection, function (analytic) {
117
- return _this.fireAnalyticsEvent(analytic('typeahead'));
117
+ return _this.fireAnalyticsEvent(analytic(SearchSourceTypes.TYPEAHEAD));
118
118
  });
119
119
  _this.fireSelectionEvent(result.emojis[matchIndex], true);
120
120
  onSelect(toEmojiId(result.emojis[matchIndex]), result.emojis[matchIndex]);
@@ -251,7 +251,7 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
251
251
  onSelection(emojiId, emoji, event);
252
252
  }
253
253
  }, function (analytic) {
254
- return _this2.fireAnalyticsEvent(analytic('typeahead'));
254
+ return _this2.fireAnalyticsEvent(analytic(SearchSourceTypes.TYPEAHEAD));
255
255
  });
256
256
  var _this$state = this.state,
257
257
  visible = _this$state.visible,
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  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; }
3
3
  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; }
4
4
  import { createAndFireEvent } from '@atlaskit/analytics-next';
5
+ import { SearchSourceTypes } from '../../types';
5
6
  export var createAndFireEventInElementsChannel = createAndFireEvent('fabric-elements');
6
7
  var createEvent = function createEvent(eventType, action, actionSubject, actionSubjectId) {
7
8
  var attributes = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
@@ -12,15 +13,35 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
12
13
  actionSubjectId: actionSubjectId,
13
14
  attributes: _objectSpread({
14
15
  packageName: "@atlaskit/emoji",
15
- packageVersion: "67.8.5"
16
+ packageVersion: "67.8.7"
16
17
  }, attributes)
17
18
  };
18
19
  };
20
+ export var recordSucceededEmoji = function recordSucceededEmoji(emoji) {
21
+ return function (source) {
22
+ return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
23
+ source: source,
24
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
25
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
26
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
27
+ });
28
+ };
29
+ };
19
30
  export var recordSucceeded = function recordSucceeded(source) {
20
31
  return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
21
32
  source: source
22
33
  });
23
34
  };
35
+ export var recordFailedEmoji = function recordFailedEmoji(emoji) {
36
+ return function (source) {
37
+ return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
38
+ source: source,
39
+ emojiId: emoji === null || emoji === void 0 ? void 0 : emoji.id,
40
+ emojiType: emoji === null || emoji === void 0 ? void 0 : emoji.type,
41
+ emojiCategory: emoji === null || emoji === void 0 ? void 0 : emoji.category
42
+ });
43
+ };
44
+ };
24
45
  export var recordFailed = function recordFailed(source) {
25
46
  return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
26
47
  source: source
@@ -161,19 +182,19 @@ export var typeaheadRenderedEvent = function typeaheadRenderedEvent(duration, qu
161
182
  };
162
183
 
163
184
  // it's used in editor typeahead to fire success record analytics
164
- export var recordSelectionSucceededSli = function recordSelectionSucceededSli(options) {
185
+ export var recordSelectionSucceededSli = function recordSelectionSucceededSli(emoji, options) {
165
186
  return function () {
166
187
  if (options && options.createAnalyticsEvent) {
167
- createAndFireEvent('editor')(recordSucceeded('typeahead'))(options.createAnalyticsEvent);
188
+ createAndFireEvent('editor')(recordSucceededEmoji(emoji)(SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
168
189
  }
169
190
  };
170
191
  };
171
192
 
172
193
  // it's used in editor typeahead to fire failure record analytics
173
- export var recordSelectionFailedSli = function recordSelectionFailedSli(options) {
194
+ export var recordSelectionFailedSli = function recordSelectionFailedSli(emoji, options) {
174
195
  return function (err) {
175
196
  if (options && options.createAnalyticsEvent) {
176
- createAndFireEvent('editor')(recordFailed('typeahead'))(options.createAnalyticsEvent);
197
+ createAndFireEvent('editor')(recordFailedEmoji(emoji)(SearchSourceTypes.TYPEAHEAD))(options.createAnalyticsEvent);
177
198
  }
178
199
  return Promise.reject(err);
179
200
  };
@@ -1,4 +1,4 @@
1
1
  export { ufoExperiencesSampled, clearSampled, isExperienceSampled, withSampling } from './samplingUfo';
2
- export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordSucceeded, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent } from './analytics';
2
+ export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordFailedEmoji, recordSucceeded, recordSucceededEmoji, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent } from './analytics';
3
3
  export { sampledUfoRenderedEmoji, ufoExperiences } from './ufoExperiences';
4
4
  export { useSampledUFOComponentExperience } from './useSampledUFOComponentExperience';
@@ -0,0 +1,14 @@
1
+ export function isSSR() {
2
+ try {
3
+ var _process;
4
+ return Boolean(
5
+ // In most places there is no document when running on server-side
6
+ typeof document === 'undefined' ||
7
+ // When SSRing editor with full cycle mode we define the document
8
+ // Check Confluence specific environment variable
9
+ typeof process !== 'undefined' && ((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.REACT_SSR));
10
+ } catch (e) {
11
+ // Catch possible error that might occur and just return false
12
+ return false;
13
+ }
14
+ }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Props as ResourcedEmojiProps } from './ResourcedEmojiComponent';
2
+ import { type Props as ResourcedEmojiProps } from './ResourcedEmojiComponent';
3
3
  export interface Props extends ResourcedEmojiProps {
4
4
  }
5
5
  declare const ResourcedEmoji: (props: React.PropsWithChildren<Props>) => JSX.Element;
@@ -1,8 +1,10 @@
1
1
  import { type AnalyticsEventPayload, type CreateUIAnalyticsEvent } from '@atlaskit/analytics-next';
2
- import type { EmojiDescription } from '../../types';
2
+ import { type EmojiDescription, type OptionalEmojiDescription, SearchSourceTypes } from '../../types';
3
3
  export declare const createAndFireEventInElementsChannel: (payload: AnalyticsEventPayload) => (createAnalyticsEvent: CreateUIAnalyticsEvent) => import("@atlaskit/analytics-next").UIAnalyticsEvent;
4
- export type EmojiInsertionAnalytic = (source: 'picker' | 'typeahead') => AnalyticsEventPayload;
4
+ export type EmojiInsertionAnalytic = (source: SearchSourceTypes.PICKER | SearchSourceTypes.TYPEAHEAD) => AnalyticsEventPayload;
5
+ export declare const recordSucceededEmoji: (emoji: OptionalEmojiDescription) => (source: SearchSourceTypes) => AnalyticsEventPayload;
5
6
  export declare const recordSucceeded: EmojiInsertionAnalytic;
7
+ export declare const recordFailedEmoji: (emoji: OptionalEmojiDescription) => (source: SearchSourceTypes) => AnalyticsEventPayload;
6
8
  export declare const recordFailed: EmojiInsertionAnalytic;
7
9
  interface Duration {
8
10
  duration: number;
@@ -52,10 +54,10 @@ export declare const selectedFileEvent: () => AnalyticsEventPayload;
52
54
  export declare const typeaheadCancelledEvent: (duration: number, query?: string, emojiList?: EmojiDescription[]) => AnalyticsEventPayload;
53
55
  export declare const typeaheadSelectedEvent: (pressed: boolean, duration: number, emoji: EmojiDescription, emojiList?: EmojiDescription[], query?: string, exactMatch?: boolean) => AnalyticsEventPayload;
54
56
  export declare const typeaheadRenderedEvent: (duration: number, query?: string, emojiList?: EmojiDescription[]) => AnalyticsEventPayload;
55
- export declare const recordSelectionSucceededSli: (options?: {
57
+ export declare const recordSelectionSucceededSli: (emoji: OptionalEmojiDescription, options?: {
56
58
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
57
59
  }) => () => void;
58
- export declare const recordSelectionFailedSli: (options?: {
60
+ export declare const recordSelectionFailedSli: (emoji: OptionalEmojiDescription, options?: {
59
61
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
60
62
  }) => (err: Error) => Promise<never>;
61
63
  /**
@@ -1,6 +1,6 @@
1
1
  export { ufoExperiencesSampled, clearSampled, isExperienceSampled, withSampling, } from './samplingUfo';
2
2
  export type { UFOExperienceSampledRecords, WithSamplingUFOExperience } from './samplingUfo';
3
- export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordSucceeded, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent, } from './analytics';
3
+ export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordFailedEmoji, recordSucceeded, recordSucceededEmoji, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent, } from './analytics';
4
4
  export { sampledUfoRenderedEmoji, ufoExperiences } from './ufoExperiences';
5
5
  export type { EmojiInsertionAnalytic } from './analytics';
6
6
  export { useSampledUFOComponentExperience } from './useSampledUFOComponentExperience';
@@ -0,0 +1 @@
1
+ export declare function isSSR(): boolean;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { Props as ResourcedEmojiProps } from './ResourcedEmojiComponent';
2
+ import { type Props as ResourcedEmojiProps } from './ResourcedEmojiComponent';
3
3
  export interface Props extends ResourcedEmojiProps {
4
4
  }
5
5
  declare const ResourcedEmoji: (props: React.PropsWithChildren<Props>) => JSX.Element;
@@ -1,8 +1,10 @@
1
1
  import { type AnalyticsEventPayload, type CreateUIAnalyticsEvent } from '@atlaskit/analytics-next';
2
- import type { EmojiDescription } from '../../types';
2
+ import { type EmojiDescription, type OptionalEmojiDescription, SearchSourceTypes } from '../../types';
3
3
  export declare const createAndFireEventInElementsChannel: (payload: AnalyticsEventPayload) => (createAnalyticsEvent: CreateUIAnalyticsEvent) => import("@atlaskit/analytics-next").UIAnalyticsEvent;
4
- export type EmojiInsertionAnalytic = (source: 'picker' | 'typeahead') => AnalyticsEventPayload;
4
+ export type EmojiInsertionAnalytic = (source: SearchSourceTypes.PICKER | SearchSourceTypes.TYPEAHEAD) => AnalyticsEventPayload;
5
+ export declare const recordSucceededEmoji: (emoji: OptionalEmojiDescription) => (source: SearchSourceTypes) => AnalyticsEventPayload;
5
6
  export declare const recordSucceeded: EmojiInsertionAnalytic;
7
+ export declare const recordFailedEmoji: (emoji: OptionalEmojiDescription) => (source: SearchSourceTypes) => AnalyticsEventPayload;
6
8
  export declare const recordFailed: EmojiInsertionAnalytic;
7
9
  interface Duration {
8
10
  duration: number;
@@ -52,10 +54,10 @@ export declare const selectedFileEvent: () => AnalyticsEventPayload;
52
54
  export declare const typeaheadCancelledEvent: (duration: number, query?: string, emojiList?: EmojiDescription[]) => AnalyticsEventPayload;
53
55
  export declare const typeaheadSelectedEvent: (pressed: boolean, duration: number, emoji: EmojiDescription, emojiList?: EmojiDescription[], query?: string, exactMatch?: boolean) => AnalyticsEventPayload;
54
56
  export declare const typeaheadRenderedEvent: (duration: number, query?: string, emojiList?: EmojiDescription[]) => AnalyticsEventPayload;
55
- export declare const recordSelectionSucceededSli: (options?: {
57
+ export declare const recordSelectionSucceededSli: (emoji: OptionalEmojiDescription, options?: {
56
58
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
57
59
  }) => () => void;
58
- export declare const recordSelectionFailedSli: (options?: {
60
+ export declare const recordSelectionFailedSli: (emoji: OptionalEmojiDescription, options?: {
59
61
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
60
62
  }) => (err: Error) => Promise<never>;
61
63
  /**
@@ -1,6 +1,6 @@
1
1
  export { ufoExperiencesSampled, clearSampled, isExperienceSampled, withSampling, } from './samplingUfo';
2
2
  export type { UFOExperienceSampledRecords, WithSamplingUFOExperience } from './samplingUfo';
3
- export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordSucceeded, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent, } from './analytics';
3
+ export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordFailedEmoji, recordSucceeded, recordSucceededEmoji, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent, } from './analytics';
4
4
  export { sampledUfoRenderedEmoji, ufoExperiences } from './ufoExperiences';
5
5
  export type { EmojiInsertionAnalytic } from './analytics';
6
6
  export { useSampledUFOComponentExperience } from './useSampledUFOComponentExperience';
@@ -0,0 +1 @@
1
+ export declare function isSSR(): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "67.8.5",
3
+ "version": "67.8.7",
4
4
  "description": "Fabric emoji React components",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -42,7 +42,7 @@
42
42
  "@atlaskit/primitives": "^12.2.0",
43
43
  "@atlaskit/spinner": "^16.3.0",
44
44
  "@atlaskit/textfield": "^6.5.0",
45
- "@atlaskit/theme": "^13.0.0",
45
+ "@atlaskit/theme": "^13.1.0",
46
46
  "@atlaskit/tokens": "^2.0.0",
47
47
  "@atlaskit/tooltip": "^18.8.0",
48
48
  "@atlaskit/ufo": "^0.3.0",
@@ -120,6 +120,9 @@
120
120
  "platform_index_emoji_just_in_time": {
121
121
  "type": "boolean"
122
122
  },
123
+ "platform_always_sample_rendered_emoji": {
124
+ "type": "boolean"
125
+ },
123
126
  "platform_editor_react18_phase2": {
124
127
  "type": "boolean"
125
128
  }