@atlaskit/emoji 64.6.0 → 64.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/api/EmojiRepository.js +4 -0
  3. package/dist/cjs/api/EmojiResource.js +13 -1
  4. package/dist/cjs/api/EmojiUtils.js +4 -0
  5. package/dist/cjs/api/internal/UsageFrequencyTracker.js +4 -1
  6. package/dist/cjs/components/common/CachingEmoji.js +33 -12
  7. package/dist/cjs/components/common/DeleteButton.js +2 -1
  8. package/dist/cjs/components/common/Emoji.js +98 -21
  9. package/dist/cjs/components/common/EmojiPlaceholder.js +1 -0
  10. package/dist/cjs/components/common/Popup.js +21 -1
  11. package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
  12. package/dist/cjs/components/common/ResourcedEmoji.js +13 -3
  13. package/dist/cjs/components/common/ResourcedEmojiComponent.js +32 -3
  14. package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
  15. package/dist/cjs/components/common/UploadEmoji.js +17 -1
  16. package/dist/cjs/components/picker/EmojiPickerComponent.js +16 -4
  17. package/dist/cjs/components/picker/EmojiPickerListSearch.js +5 -0
  18. package/dist/cjs/components/picker/styles.js +2 -0
  19. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  20. package/dist/cjs/components/uploader/EmojiUploadComponent.js +6 -1
  21. package/dist/cjs/types.js +27 -2
  22. package/dist/cjs/util/analytics/ufoExperiences.js +46 -3
  23. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
  24. package/dist/cjs/util/browser-support.js +8 -0
  25. package/dist/cjs/util/constants.js +4 -5
  26. package/dist/cjs/util/storage-available.js +4 -0
  27. package/dist/cjs/util/useInView.js +23 -0
  28. package/dist/cjs/version.json +1 -1
  29. package/dist/es2019/api/EmojiRepository.js +4 -0
  30. package/dist/es2019/api/EmojiResource.js +13 -1
  31. package/dist/es2019/api/EmojiUtils.js +4 -0
  32. package/dist/es2019/api/internal/UsageFrequencyTracker.js +4 -1
  33. package/dist/es2019/components/common/CachingEmoji.js +28 -9
  34. package/dist/es2019/components/common/DeleteButton.js +2 -1
  35. package/dist/es2019/components/common/Emoji.js +76 -24
  36. package/dist/es2019/components/common/EmojiPlaceholder.js +1 -0
  37. package/dist/es2019/components/common/Popup.js +21 -1
  38. package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
  39. package/dist/es2019/components/common/ResourcedEmoji.js +14 -4
  40. package/dist/es2019/components/common/ResourcedEmojiComponent.js +28 -3
  41. package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
  42. package/dist/es2019/components/common/UploadEmoji.js +10 -1
  43. package/dist/es2019/components/picker/EmojiPickerComponent.js +16 -3
  44. package/dist/es2019/components/picker/EmojiPickerListSearch.js +5 -0
  45. package/dist/es2019/components/picker/styles.js +3 -0
  46. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  47. package/dist/es2019/components/uploader/EmojiUploadComponent.js +6 -1
  48. package/dist/es2019/types.js +24 -1
  49. package/dist/es2019/util/analytics/ufoExperiences.js +37 -2
  50. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
  51. package/dist/es2019/util/browser-support.js +1 -0
  52. package/dist/es2019/util/constants.js +2 -2
  53. package/dist/es2019/util/storage-available.js +4 -0
  54. package/dist/es2019/util/useInView.js +12 -0
  55. package/dist/es2019/version.json +1 -1
  56. package/dist/esm/api/EmojiRepository.js +4 -0
  57. package/dist/esm/api/EmojiResource.js +13 -1
  58. package/dist/esm/api/EmojiUtils.js +4 -0
  59. package/dist/esm/api/internal/UsageFrequencyTracker.js +4 -1
  60. package/dist/esm/components/common/CachingEmoji.js +32 -13
  61. package/dist/esm/components/common/DeleteButton.js +2 -1
  62. package/dist/esm/components/common/Emoji.js +84 -24
  63. package/dist/esm/components/common/EmojiPlaceholder.js +1 -0
  64. package/dist/esm/components/common/Popup.js +21 -1
  65. package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
  66. package/dist/esm/components/common/ResourcedEmoji.js +14 -4
  67. package/dist/esm/components/common/ResourcedEmojiComponent.js +30 -3
  68. package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
  69. package/dist/esm/components/common/UploadEmoji.js +15 -1
  70. package/dist/esm/components/picker/EmojiPickerComponent.js +16 -3
  71. package/dist/esm/components/picker/EmojiPickerListSearch.js +5 -0
  72. package/dist/esm/components/picker/styles.js +2 -0
  73. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  74. package/dist/esm/components/uploader/EmojiUploadComponent.js +6 -1
  75. package/dist/esm/types.js +24 -1
  76. package/dist/esm/util/analytics/ufoExperiences.js +39 -2
  77. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
  78. package/dist/esm/util/browser-support.js +1 -0
  79. package/dist/esm/util/constants.js +2 -2
  80. package/dist/esm/util/storage-available.js +4 -0
  81. package/dist/esm/util/useInView.js +12 -0
  82. package/dist/esm/version.json +1 -1
  83. package/dist/types/components/common/CachingEmoji.d.ts +0 -1
  84. package/dist/types/components/common/Emoji.d.ts +2 -0
  85. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +1 -0
  86. package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
  87. package/dist/types/types.d.ts +17 -0
  88. package/dist/types/util/analytics/samplingUfo.d.ts +7 -0
  89. package/dist/types/util/analytics/ufoExperiences.d.ts +4 -1
  90. package/dist/types/util/browser-support.d.ts +1 -0
  91. package/dist/types/util/constants.d.ts +1 -1
  92. package/dist/types/util/useInView.d.ts +4 -0
  93. package/package.json +7 -6
@@ -19,6 +19,12 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
19
19
 
20
20
  var _react = _interopRequireDefault(require("react"));
21
21
 
22
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
23
+
24
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
+
26
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
+
22
28
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
23
29
 
24
30
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
@@ -35,10 +41,30 @@ var UfoErrorBoundary = /*#__PURE__*/function (_React$Component) {
35
41
 
36
42
  (0, _createClass2.default)(UfoErrorBoundary, [{
37
43
  key: "componentDidCatch",
38
- value: function componentDidCatch() {
39
- this.props.experiences.forEach(function (e) {
40
- return e.failure();
41
- });
44
+ value: function componentDidCatch(error, errorInfo) {
45
+ var _iterator = _createForOfIteratorHelper(this.props.experiences),
46
+ _step;
47
+
48
+ try {
49
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
50
+ var exp = _step.value;
51
+ exp.failure({
52
+ metadata: {
53
+ source: 'UfoErrorBoundary',
54
+ reason: 'error',
55
+ error: {
56
+ name: error.name,
57
+ message: error.message,
58
+ infoStack: errorInfo.componentStack
59
+ }
60
+ }
61
+ });
62
+ }
63
+ } catch (err) {
64
+ _iterator.e(err);
65
+ } finally {
66
+ _iterator.f();
67
+ }
42
68
  }
43
69
  }, {
44
70
  key: "render",
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.uploadEmoji = void 0;
7
9
 
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
8
12
  var _EmojiResource = require("../../api/EmojiResource");
9
13
 
10
14
  var _analytics = require("../../util/analytics");
@@ -13,6 +17,10 @@ var _i18n = require("../i18n");
13
17
 
14
18
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
15
19
 
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
+
16
24
  var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) {
17
25
  var startTime = Date.now();
18
26
  errorSetter(undefined);
@@ -36,7 +44,15 @@ var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuc
36
44
  reason: _i18n.messages.emojiUploadFailed.defaultMessage
37
45
  }));
38
46
 
39
- _ufoExperiences.ufoExperiences['emoji-uploaded'].failure();
47
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].failure({
48
+ metadata: {
49
+ source: 'UploadEmoji',
50
+ error: err,
51
+ data: {
52
+ upload: _objectSpread({}, upload)
53
+ }
54
+ }
55
+ });
40
56
  });
41
57
  }
42
58
  };
@@ -329,6 +329,10 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
329
329
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "scrollToEndOfList", function () {
330
330
  var emojiPickerList = _this.refs.emojiPickerList;
331
331
 
332
+ if (typeof window === 'undefined') {
333
+ return;
334
+ }
335
+
332
336
  if (emojiPickerList) {
333
337
  // Wait a tick to ensure repaint and updated height for picker list
334
338
  window.setTimeout(function () {
@@ -430,11 +434,19 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
430
434
  duration: this.calculateElapsedTime()
431
435
  }));
432
436
 
433
- _analytics.ufoExperiences['emoji-picker-opened'].abort();
434
-
435
- _analytics.ufoExperiences['emoji-searched'].abort();
437
+ _analytics.ufoExperiences['emoji-picker-opened'].abort({
438
+ metadata: {
439
+ source: 'EmojiPickerComponent',
440
+ reason: 'unmount'
441
+ }
442
+ });
436
443
 
437
- _analytics.ufoExperiences['emoji-selection-recorded'].abort();
444
+ _analytics.ufoExperiences['emoji-searched'].abort({
445
+ metadata: {
446
+ source: 'EmojiPickerComponent',
447
+ reason: 'unmount'
448
+ }
449
+ });
438
450
  }
439
451
  }, {
440
452
  key: "UNSAFE_componentWillReceiveProps",
@@ -84,6 +84,11 @@ var EmojiPickerListSearch = /*#__PURE__*/function (_PureComponent) {
84
84
  // setting the focus to search input.
85
85
  // see FS-2056
86
86
  _this.inputRef = input;
87
+
88
+ if (typeof window === 'undefined') {
89
+ return;
90
+ }
91
+
87
92
  window.setTimeout(_this.focusInput);
88
93
  }
89
94
  });
@@ -181,6 +181,8 @@ var emojiItem = (0, _core.css)((_css6 = {
181
181
  margin: '7px',
182
182
  minWidth: '24px',
183
183
  maxWidth: '24px'
184
+ }), (0, _defineProperty2.default)(_css6, "& .".concat(_styles.emojiNodeStyles, " .").concat(_styles.placeholder), {
185
+ margin: '0'
184
186
  }), (0, _defineProperty2.default)(_css6, "& .".concat(_styles.emojiNodeStyles, " > img"), {
185
187
  position: 'relative',
186
188
  left: '50%',
@@ -224,9 +224,25 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
224
224
  this.fireAnalyticsEvent((0, _analytics.typeaheadCancelledEvent)(Date.now() - this.openTime, query, emojis));
225
225
  }
226
226
 
227
- _analytics.ufoExperiences['emoji-searched'].abort();
227
+ _analytics.ufoExperiences['emoji-searched'].abort({
228
+ metadata: {
229
+ source: 'EmojiTypeAheadComponent',
230
+ reason: 'unmount',
231
+ data: {
232
+ query: query
233
+ }
234
+ }
235
+ });
228
236
 
229
- _analytics.ufoExperiences['emoji-selection-recorded'].abort();
237
+ _analytics.ufoExperiences['emoji-selection-recorded'].abort({
238
+ metadata: {
239
+ source: 'EmojiTypeAheadComponent',
240
+ reason: 'unmount',
241
+ data: {
242
+ query: query
243
+ }
244
+ }
245
+ });
230
246
 
231
247
  this.sessionId = (0, _uuid.default)();
232
248
  this.selected = false;
@@ -119,7 +119,12 @@ var EmojiUploadComponent = /*#__PURE__*/function (_PureComponent) {
119
119
  (0, _createClass2.default)(EmojiUploadComponent, [{
120
120
  key: "componentWillUnmount",
121
121
  value: function componentWillUnmount() {
122
- _ufoExperiences.ufoExperiences['emoji-uploaded'].abort();
122
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].abort({
123
+ metadata: {
124
+ source: 'EmojiUploadComponent',
125
+ reason: 'unmount'
126
+ }
127
+ });
123
128
  }
124
129
  }, {
125
130
  key: "render",
package/dist/cjs/types.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.UfoExperienceName = exports.UfoComponentName = exports.SearchSort = exports.ProviderTypes = void 0;
6
+ exports.UfoExperienceName = exports.UfoEmojiTimingsKeys = exports.UfoEmojiTimings = exports.UfoComponentName = exports.SearchSort = exports.ProviderTypes = void 0;
7
7
 
8
8
  /**
9
9
  * Minimum information to defined an emoji is the shortName.
@@ -72,4 +72,29 @@ exports.UfoComponentName = UfoComponentName;
72
72
  UfoComponentName["EMOJI"] = "emoji";
73
73
  UfoComponentName["EMOJI_PICKER"] = "emoji-picker";
74
74
  UfoComponentName["EMOJI_PROVIDER"] = "emoji-provider";
75
- })(UfoComponentName || (exports.UfoComponentName = UfoComponentName = {}));
75
+ })(UfoComponentName || (exports.UfoComponentName = UfoComponentName = {}));
76
+
77
+ var UfoEmojiTimingsKeys;
78
+ exports.UfoEmojiTimingsKeys = UfoEmojiTimingsKeys;
79
+
80
+ (function (UfoEmojiTimingsKeys) {
81
+ UfoEmojiTimingsKeys["FMP"] = "fmp";
82
+ UfoEmojiTimingsKeys["MOUNTED"] = "emoji-mount";
83
+ UfoEmojiTimingsKeys["METADATA"] = "emoji-metadata";
84
+ UfoEmojiTimingsKeys["MEDIADATA"] = "emoji-media";
85
+ UfoEmojiTimingsKeys["ONLOAD"] = "emoji-onload";
86
+ })(UfoEmojiTimingsKeys || (exports.UfoEmojiTimingsKeys = UfoEmojiTimingsKeys = {}));
87
+
88
+ var UfoEmojiTimings;
89
+ exports.UfoEmojiTimings = UfoEmojiTimings;
90
+
91
+ (function (UfoEmojiTimings) {
92
+ UfoEmojiTimings["FMP_END"] = "fmp";
93
+ UfoEmojiTimings["MOUNTED_END"] = "emoji-mount_end";
94
+ UfoEmojiTimings["METADATA_START"] = "emoji-metadata_start";
95
+ UfoEmojiTimings["METADATA_END"] = "emoji-metadata_end";
96
+ UfoEmojiTimings["MEDIA_START"] = "emoji-media_start";
97
+ UfoEmojiTimings["MEDIA_END"] = "emoji-media_end";
98
+ UfoEmojiTimings["ONLOAD_START"] = "emoji-onload_start";
99
+ UfoEmojiTimings["ONLOAD_END"] = "emoji-onload_end";
100
+ })(UfoEmojiTimings || (exports.UfoEmojiTimings = UfoEmojiTimings = {}));
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ufoExperiences = exports.sampledUfoRenderedEmoji = void 0;
6
+ exports.ufoExperiences = exports.sampledUfoRenderedEmoji = exports.sampledUfoEmojiResourceFetched = exports.hasUfoMarked = void 0;
7
7
 
8
8
  var _types = require("../../types");
9
9
 
@@ -31,8 +31,37 @@ var createInlineExperience = function createInlineExperience(componentName) {
31
31
  };
32
32
  };
33
33
 
34
+ var customEmojiTimings = [{
35
+ key: _types.UfoEmojiTimingsKeys.FMP,
36
+ endMark: _types.UfoEmojiTimings.FMP_END
37
+ }, {
38
+ key: _types.UfoEmojiTimingsKeys.METADATA,
39
+ component: 'resourced-emoji',
40
+ startMark: _types.UfoEmojiTimings.METADATA_START,
41
+ endMark: _types.UfoEmojiTimings.METADATA_END
42
+ }, {
43
+ key: _types.UfoEmojiTimingsKeys.MEDIADATA,
44
+ component: 'caching-emoji',
45
+ startMark: _types.UfoEmojiTimings.MEDIA_START,
46
+ endMark: _types.UfoEmojiTimings.MEDIA_END
47
+ }, {
48
+ key: _types.UfoEmojiTimingsKeys.MOUNTED,
49
+ component: 'emoji',
50
+ endMark: _types.UfoEmojiTimings.MOUNTED_END
51
+ }, {
52
+ key: _types.UfoEmojiTimingsKeys.ONLOAD,
53
+ startMark: _types.UfoEmojiTimings.ONLOAD_START,
54
+ endMark: _types.UfoEmojiTimings.ONLOAD_END
55
+ }];
34
56
  var ufoExperiences = {
35
- 'emoji-rendered': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RENDERED, createRenderExperience(_types.UfoComponentName.EMOJI)),
57
+ 'emoji-rendered': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RENDERED, {
58
+ platform: {
59
+ component: _types.UfoComponentName.EMOJI
60
+ },
61
+ type: _ufo.ExperienceTypes.Operation,
62
+ performanceType: _ufo.ExperiencePerformanceTypes.Custom,
63
+ timings: customEmojiTimings
64
+ }),
36
65
  'emoji-resource-fetched': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RESOURCE_FETCHED, createRenderExperience(_types.UfoComponentName.EMOJI_PROVIDER)),
37
66
  'emoji-picker-opened': new _ufo.UFOExperience(_types.UfoExperienceName.EMOJI_PICKER_OPENED, createRenderExperience(_types.UfoComponentName.EMOJI_PICKER)),
38
67
  'emoji-selection-recorded': new _ufo.UFOExperience(_types.UfoExperienceName.EMOJI_SELECTION_RECORDED, createInlineExperience(_types.UfoComponentName.EMOJI_PROVIDER)),
@@ -45,4 +74,18 @@ var sampledUfoRenderedEmoji = function sampledUfoRenderedEmoji(emojiId) {
45
74
  return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
46
75
  };
47
76
 
48
- exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
77
+ exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
78
+
79
+ var hasUfoMarked = function hasUfoMarked(ufoExperience, name) {
80
+ return ufoExperience.metrics.marks.some(function (mask) {
81
+ return mask.name === name;
82
+ });
83
+ };
84
+
85
+ exports.hasUfoMarked = hasUfoMarked;
86
+
87
+ var sampledUfoEmojiResourceFetched = function sampledUfoEmojiResourceFetched(providerType) {
88
+ return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-resource-fetched'].getInstance(providerType));
89
+ };
90
+
91
+ exports.sampledUfoEmojiResourceFetched = sampledUfoEmojiResourceFetched;
@@ -38,8 +38,9 @@ var useSampledUFOComponentExperience = function useSampledUFOComponentExperience
38
38
  (0, _samplingUfo.withSampling)(experience).start({
39
39
  samplingRate: samplingRate
40
40
  });
41
+ var isMetadataEmpty = Object.keys(experience.metadata).length === 0;
41
42
 
42
- if (metadata) {
43
+ if (metadata && isMetadataEmpty) {
43
44
  experience.addMetadata(metadata);
44
45
  }
45
46
  });
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isIntersectionObserverSupported = void 0;
7
+ var isIntersectionObserverSupported = typeof window !== 'undefined' && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype;
8
+ exports.isIntersectionObserverSupported = isIntersectionObserverSupported;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
6
+ exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
7
7
  var customCategory = 'CUSTOM';
8
8
  exports.customCategory = customCategory;
9
9
  var frequentCategory = 'FREQUENT';
@@ -44,9 +44,8 @@ exports.migrationUserId = migrationUserId;
44
44
  var analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker'; // This is the base sampling rate in Emoji
45
45
 
46
46
  exports.analyticsEmojiPrefix = analyticsEmojiPrefix;
47
- var SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in ResourceEmoji which will be used in stead of base sampling rate above
47
+ var SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in fetching emoji resource
48
48
 
49
49
  exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = SAMPLING_RATE_EMOJI_RENDERED_EXP;
50
- var SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = 0.1; // add more sampling rate in parent components like EmojiTypeAheadItem.
51
-
52
- exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI;
50
+ var SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 0.01;
51
+ exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP;
@@ -8,6 +8,10 @@ exports.default = storageAvailable;
8
8
  // Copied from https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#feature-detecting_localstorage
9
9
  // a brief history of local storage - https://gist.github.com/paulirish/5558557
10
10
  function storageAvailable(type) {
11
+ if (typeof window === 'undefined') {
12
+ return false;
13
+ }
14
+
11
15
  var storage;
12
16
 
13
17
  try {
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useInView = void 0;
7
+
8
+ var _reactIntersectionObserver = require("react-intersection-observer");
9
+
10
+ var _browserSupport = require("./browser-support");
11
+
12
+ var useInView = function useInView(options) {
13
+ var hookResult = (0, _reactIntersectionObserver.useInView)(options);
14
+
15
+ if (!_browserSupport.isIntersectionObserverSupported) {
16
+ // Unsupported, return no `ref` and default `inView` true value
17
+ return [undefined, true];
18
+ }
19
+
20
+ return hookResult;
21
+ };
22
+
23
+ exports.useInView = useInView;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.6.0",
3
+ "version": "64.7.1",
4
4
  "sideEffects": false
5
5
  }
@@ -246,6 +246,10 @@ export default class EmojiRepository {
246
246
  // frequent category being shown in the picker).
247
247
 
248
248
  if (this.dynamicCategoryList.indexOf(frequentCategory) === -1) {
249
+ if (typeof window === 'undefined') {
250
+ return;
251
+ }
252
+
249
253
  window.setTimeout(() => {
250
254
  this.dynamicCategoryList.push(frequentCategory);
251
255
  });
@@ -60,7 +60,11 @@ export class EmojiResource extends AbstractResource {
60
60
  this.notifyError(reason);
61
61
  ufoExperiences['emoji-resource-fetched'].getInstance(providerType).failure({
62
62
  metadata: {
63
- reason
63
+ reason,
64
+ source: 'EmojiProvider',
65
+ data: {
66
+ providerUrl: provider.url
67
+ }
64
68
  }
65
69
  });
66
70
  });
@@ -143,6 +147,10 @@ export class EmojiResource extends AbstractResource {
143
147
  }
144
148
 
145
149
  loadStoredTone() {
150
+ if (typeof window === 'undefined') {
151
+ return undefined;
152
+ }
153
+
146
154
  const storedToneString = window.localStorage.getItem(selectedToneStorageKey);
147
155
 
148
156
  if (storedToneString) {
@@ -384,6 +392,10 @@ export class EmojiResource extends AbstractResource {
384
392
  setSelectedTone(tone) {
385
393
  this.selectedTone = tone;
386
394
 
395
+ if (typeof window === 'undefined') {
396
+ return;
397
+ }
398
+
387
399
  if (storageAvailable('localStorage')) {
388
400
  try {
389
401
  window.localStorage.setItem(selectedToneStorageKey, tone ? tone.toString() : '');
@@ -36,6 +36,10 @@ const calculateScale = getRatio => {
36
36
  };
37
37
 
38
38
  export const getPixelRatio = () => {
39
+ if (typeof window === 'undefined') {
40
+ return 0;
41
+ }
42
+
39
43
  return window.devicePixelRatio;
40
44
  };
41
45
  export const getAltRepresentation = reps => {
@@ -111,7 +111,10 @@ export class Gateway {
111
111
  }
112
112
  };
113
113
 
114
- window.setTimeout(wrappedFunc);
114
+ if (typeof window !== 'undefined') {
115
+ window.setTimeout(wrappedFunc);
116
+ }
117
+
115
118
  return true;
116
119
  }
117
120
 
@@ -1,8 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import React from 'react';
3
+ import React, { useEffect } from 'react';
4
4
  import { PureComponent } from 'react';
5
5
  import { isMediaEmoji } from '../../util/type-helpers';
6
+ import { UfoEmojiTimings } from '../../types';
6
7
  import debug from '../../util/logger';
7
8
  import Emoji from './Emoji';
8
9
  import EmojiPlaceholder from './EmojiPlaceholder';
@@ -10,6 +11,7 @@ import { UfoErrorBoundary } from './UfoErrorBoundary';
10
11
  import { sampledUfoRenderedEmoji, ufoExperiences, useSampledUFOComponentExperience } from '../../util/analytics';
11
12
  import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
12
13
  import { EmojiContext } from '../../context/EmojiContext';
14
+ import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
13
15
 
14
16
  /**
15
17
  * Renders an emoji from a cached image, if required.
@@ -23,8 +25,15 @@ export const CachingEmoji = props => {
23
25
  } = props; // start emoji rendered experience, it may have already started earlier in ResourcedEmoji
24
26
 
25
27
  useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emojiProps.emoji.id || emojiProps.emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
26
- source: 'caching-emoji'
28
+ source: 'caching-emoji',
29
+ emoji: emojiProps.emoji.shortName
27
30
  });
31
+ useEffect(() => {
32
+ if (!hasUfoMarked(sampledUfoRenderedEmoji(emojiProps.emoji), 'fmp')) {
33
+ sampledUfoRenderedEmoji(emojiProps.emoji).markFMP();
34
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
35
+
36
+ }, []);
28
37
 
29
38
  const emojiNode = () => {
30
39
  if (isMediaEmoji(props.emoji)) {
@@ -50,7 +59,12 @@ export class CachingMediaEmoji extends PureComponent {
50
59
  _defineProperty(this, "handleLoadError", _emojiId => {
51
60
  sampledUfoRenderedEmoji(_emojiId).failure({
52
61
  metadata: {
53
- reason: 'load error'
62
+ reason: 'load error',
63
+ source: 'CachingMediaEmoji',
64
+ emoji: {
65
+ id: _emojiId.id,
66
+ shortName: _emojiId.shortName
67
+ }
54
68
  }
55
69
  });
56
70
  this.setState({
@@ -64,10 +78,6 @@ export class CachingMediaEmoji extends PureComponent {
64
78
  this.loadEmoji(props.emoji, context);
65
79
  }
66
80
 
67
- componentDidMount() {
68
- sampledUfoRenderedEmoji(this.props.emoji).markFMP();
69
- }
70
-
71
81
  componentDidUpdate() {
72
82
  var _this$state$cachedEmo;
73
83
 
@@ -94,11 +104,13 @@ export class CachingMediaEmoji extends PureComponent {
94
104
  }
95
105
 
96
106
  debug('Loading image via media cache', emoji.shortName);
107
+ sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_START);
97
108
  emojiProvider.getMediaEmojiDescriptionURLWithInlineToken(emoji).then(cachedEmoji => {
98
109
  this.setState({
99
110
  cachedEmoji,
100
111
  invalidImage: false
101
112
  });
113
+ sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_END);
102
114
  }).catch(() => {
103
115
  this.setState({
104
116
  cachedEmoji: undefined,
@@ -106,7 +118,15 @@ export class CachingMediaEmoji extends PureComponent {
106
118
  });
107
119
  sampledUfoRenderedEmoji(emoji).failure({
108
120
  metadata: {
109
- reason: 'failed to load media emoji'
121
+ reason: 'failed to load media emoji',
122
+ source: 'CachingMediaEmoji',
123
+ data: {
124
+ emoji: {
125
+ id: emoji.id,
126
+ shortName: emoji.shortName,
127
+ name: emoji.name
128
+ }
129
+ }
110
130
  }
111
131
  });
112
132
  });
@@ -119,7 +139,6 @@ export class CachingMediaEmoji extends PureComponent {
119
139
  } = this.state;
120
140
  const {
121
141
  children,
122
- placeholderSize,
123
142
  ...otherProps
124
143
  } = this.props;
125
144
  let emojiComponent;
@@ -9,7 +9,8 @@ import { emojiDeleteButton, deleteButton } from './styles';
9
9
 
10
10
  const DeleteButton = props => jsx("span", {
11
11
  css: deleteButton,
12
- className: emojiDeleteButton
12
+ className: emojiDeleteButton,
13
+ "data-testid": "emoji-delete-button"
13
14
  }, jsx(Button, {
14
15
  iconBefore: jsx(CrossCircleIcon, {
15
16
  label: deleteEmojiLabel,