@atlaskit/emoji 64.6.1 → 64.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/api/EmojiRepository.js +4 -0
  3. package/dist/cjs/api/EmojiResource.js +8 -0
  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 +13 -10
  7. package/dist/cjs/components/common/DeleteButton.js +2 -1
  8. package/dist/cjs/components/common/Emoji.js +76 -20
  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/ResourcedEmojiComponent.js +12 -1
  12. package/dist/cjs/components/picker/EmojiPickerComponent.js +4 -2
  13. package/dist/cjs/components/picker/EmojiPickerListSearch.js +5 -0
  14. package/dist/cjs/components/picker/styles.js +2 -0
  15. package/dist/cjs/types.js +25 -2
  16. package/dist/cjs/util/analytics/ufoExperiences.js +26 -1
  17. package/dist/cjs/util/browser-support.js +8 -0
  18. package/dist/cjs/util/storage-available.js +4 -0
  19. package/dist/cjs/version.json +1 -1
  20. package/dist/es2019/api/EmojiRepository.js +4 -0
  21. package/dist/es2019/api/EmojiResource.js +8 -0
  22. package/dist/es2019/api/EmojiUtils.js +4 -0
  23. package/dist/es2019/api/internal/UsageFrequencyTracker.js +4 -1
  24. package/dist/es2019/components/common/CachingEmoji.js +9 -7
  25. package/dist/es2019/components/common/DeleteButton.js +2 -1
  26. package/dist/es2019/components/common/Emoji.js +54 -21
  27. package/dist/es2019/components/common/EmojiPlaceholder.js +1 -0
  28. package/dist/es2019/components/common/Popup.js +21 -1
  29. package/dist/es2019/components/common/ResourcedEmojiComponent.js +9 -1
  30. package/dist/es2019/components/picker/EmojiPickerComponent.js +4 -1
  31. package/dist/es2019/components/picker/EmojiPickerListSearch.js +5 -0
  32. package/dist/es2019/components/picker/styles.js +3 -0
  33. package/dist/es2019/types.js +22 -1
  34. package/dist/es2019/util/analytics/ufoExperiences.js +27 -2
  35. package/dist/es2019/util/browser-support.js +1 -0
  36. package/dist/es2019/util/storage-available.js +4 -0
  37. package/dist/es2019/version.json +1 -1
  38. package/dist/esm/api/EmojiRepository.js +4 -0
  39. package/dist/esm/api/EmojiResource.js +8 -0
  40. package/dist/esm/api/EmojiUtils.js +4 -0
  41. package/dist/esm/api/internal/UsageFrequencyTracker.js +4 -1
  42. package/dist/esm/components/common/CachingEmoji.js +13 -11
  43. package/dist/esm/components/common/DeleteButton.js +2 -1
  44. package/dist/esm/components/common/Emoji.js +60 -21
  45. package/dist/esm/components/common/EmojiPlaceholder.js +1 -0
  46. package/dist/esm/components/common/Popup.js +21 -1
  47. package/dist/esm/components/common/ResourcedEmojiComponent.js +11 -1
  48. package/dist/esm/components/picker/EmojiPickerComponent.js +4 -1
  49. package/dist/esm/components/picker/EmojiPickerListSearch.js +5 -0
  50. package/dist/esm/components/picker/styles.js +2 -0
  51. package/dist/esm/types.js +22 -1
  52. package/dist/esm/util/analytics/ufoExperiences.js +27 -2
  53. package/dist/esm/util/browser-support.js +1 -0
  54. package/dist/esm/util/storage-available.js +4 -0
  55. package/dist/esm/version.json +1 -1
  56. package/dist/types/components/common/CachingEmoji.d.ts +0 -1
  57. package/dist/types/components/common/Emoji.d.ts +2 -0
  58. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +1 -0
  59. package/dist/types/types.d.ts +15 -0
  60. package/dist/types/util/browser-support.d.ts +1 -0
  61. package/package.json +4 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 64.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`2b241314079`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2b241314079) - improve lazy load emoji with placeholder and improved analtyics tracking
8
+
3
9
  ## 64.6.1
4
10
 
5
11
  ### Patch Changes
@@ -307,6 +307,10 @@ var EmojiRepository = /*#__PURE__*/function () {
307
307
  // frequent category being shown in the picker).
308
308
 
309
309
  if (this.dynamicCategoryList.indexOf(_constants.frequentCategory) === -1) {
310
+ if (typeof window === 'undefined') {
311
+ return;
312
+ }
313
+
310
314
  window.setTimeout(function () {
311
315
  _this2.dynamicCategoryList.push(_constants.frequentCategory);
312
316
  });
@@ -212,6 +212,10 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
212
212
  }, {
213
213
  key: "loadStoredTone",
214
214
  value: function loadStoredTone() {
215
+ if (typeof window === 'undefined') {
216
+ return undefined;
217
+ }
218
+
215
219
  var storedToneString = window.localStorage.getItem(_constants.selectedToneStorageKey);
216
220
 
217
221
  if (storedToneString) {
@@ -525,6 +529,10 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
525
529
  value: function setSelectedTone(tone) {
526
530
  this.selectedTone = tone;
527
531
 
532
+ if (typeof window === 'undefined') {
533
+ return;
534
+ }
535
+
528
536
  if ((0, _storageAvailable.default)('localStorage')) {
529
537
  try {
530
538
  window.localStorage.setItem(_constants.selectedToneStorageKey, tone ? tone.toString() : '');
@@ -64,6 +64,10 @@ var calculateScale = function calculateScale(getRatio) {
64
64
  };
65
65
 
66
66
  var getPixelRatio = function getPixelRatio() {
67
+ if (typeof window === 'undefined') {
68
+ return 0;
69
+ }
70
+
67
71
  return window.devicePixelRatio;
68
72
  };
69
73
 
@@ -150,7 +150,10 @@ var Gateway = /*#__PURE__*/function () {
150
150
  }
151
151
  };
152
152
 
153
- window.setTimeout(wrappedFunc);
153
+ if (typeof window !== 'undefined') {
154
+ window.setTimeout(wrappedFunc);
155
+ }
156
+
154
157
  return true;
155
158
  }
156
159
  }, {
@@ -31,6 +31,8 @@ var _react = _interopRequireWildcard(require("react"));
31
31
 
32
32
  var _typeHelpers = require("../../util/type-helpers");
33
33
 
34
+ var _types = require("../../types");
35
+
34
36
  var _logger = _interopRequireDefault(require("../../util/logger"));
35
37
 
36
38
  var _Emoji = _interopRequireDefault(require("./Emoji"));
@@ -46,7 +48,7 @@ var _constants = require("../../util/constants");
46
48
  var _EmojiContext = require("../../context/EmojiContext");
47
49
 
48
50
  var _excluded = ["placeholderSize"],
49
- _excluded2 = ["children", "placeholderSize"];
51
+ _excluded2 = ["children"];
50
52
 
51
53
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
52
54
 
@@ -66,8 +68,12 @@ var CachingEmoji = function CachingEmoji(props) {
66
68
  emojiProps = (0, _objectWithoutProperties2.default)(props, _excluded); // start emoji rendered experience, it may have already started earlier in ResourcedEmoji
67
69
 
68
70
  (0, _analytics.useSampledUFOComponentExperience)(_analytics.ufoExperiences['emoji-rendered'].getInstance(emojiProps.emoji.id || emojiProps.emoji.shortName), _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP, {
69
- source: 'caching-emoji'
71
+ source: 'caching-emoji',
72
+ emoji: emojiProps.emoji.shortName
70
73
  });
74
+ (0, _react.useEffect)(function () {
75
+ (0, _analytics.sampledUfoRenderedEmoji)(emojiProps.emoji).mark(_types.UfoEmojiTimings.MOUNTED_END); // eslint-disable-next-line react-hooks/exhaustive-deps
76
+ }, []);
71
77
 
72
78
  var emojiNode = function emojiNode() {
73
79
  if ((0, _typeHelpers.isMediaEmoji)(props.emoji)) {
@@ -120,11 +126,6 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
120
126
  }
121
127
 
122
128
  (0, _createClass2.default)(CachingMediaEmoji, [{
123
- key: "componentDidMount",
124
- value: function componentDidMount() {
125
- (0, _analytics.sampledUfoRenderedEmoji)(this.props.emoji).markFMP();
126
- }
127
- }, {
128
129
  key: "componentDidUpdate",
129
130
  value: function componentDidUpdate() {
130
131
  var _this$state$cachedEmo;
@@ -153,11 +154,14 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
153
154
  }
154
155
 
155
156
  (0, _logger.default)('Loading image via media cache', emoji.shortName);
157
+ (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.MEDIA_START);
156
158
  emojiProvider.getMediaEmojiDescriptionURLWithInlineToken(emoji).then(function (cachedEmoji) {
157
159
  _this2.setState({
158
160
  cachedEmoji: cachedEmoji,
159
161
  invalidImage: false
160
162
  });
163
+
164
+ (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.MEDIA_END);
161
165
  }).catch(function () {
162
166
  _this2.setState({
163
167
  cachedEmoji: undefined,
@@ -179,7 +183,6 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
179
183
  invalidImage = _this$state.invalidImage;
180
184
  var _this$props = this.props,
181
185
  children = _this$props.children,
182
- placeholderSize = _this$props.placeholderSize,
183
186
  otherProps = (0, _objectWithoutProperties2.default)(_this$props, _excluded2);
184
187
  var emojiComponent;
185
188
 
@@ -191,13 +194,13 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
191
194
  } else {
192
195
  var _this$props2 = this.props,
193
196
  emoji = _this$props2.emoji,
194
- _placeholderSize = _this$props2.placeholderSize,
197
+ placeholderSize = _this$props2.placeholderSize,
195
198
  showTooltip = _this$props2.showTooltip,
196
199
  fitToHeight = _this$props2.fitToHeight;
197
200
  var shortName = emoji.shortName,
198
201
  representation = emoji.representation;
199
202
  emojiComponent = /*#__PURE__*/_react.default.createElement(_EmojiPlaceholder.default, {
200
- size: fitToHeight || _placeholderSize,
203
+ size: fitToHeight || placeholderSize,
201
204
  shortName: shortName,
202
205
  showTooltip: showTooltip,
203
206
  representation: representation
@@ -25,7 +25,8 @@ var _styles = require("./styles");
25
25
  var DeleteButton = function DeleteButton(props) {
26
26
  return (0, _core.jsx)("span", {
27
27
  css: _styles.deleteButton,
28
- className: _styles.emojiDeleteButton
28
+ className: _styles.emojiDeleteButton,
29
+ "data-testid": "emoji-delete-button"
29
30
  }, (0, _core.jsx)(_customThemeButton.default, {
30
31
  iconBefore: (0, _core.jsx)(_crossCircle.default, {
31
32
  label: _constants.deleteEmojiLabel,
@@ -2,18 +2,22 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
- exports.default = exports.Emoji = void 0;
10
+ exports.default = exports.SpriteEmoji = exports.ImageEmoji = exports.Emoji = void 0;
9
11
 
10
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
12
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
17
 
14
18
  var _core = require("@emotion/core");
15
19
 
16
- var _react = _interopRequireDefault(require("react"));
20
+ var _react = _interopRequireWildcard(require("react"));
17
21
 
18
22
  var _EmojiUtils = require("../../api/EmojiUtils");
19
23
 
@@ -21,6 +25,8 @@ var _constants = require("../../util/constants");
21
25
 
22
26
  var _typeHelpers = require("../../util/type-helpers");
23
27
 
28
+ var _types = require("../../types");
29
+
24
30
  var _mouse = require("../../util/mouse");
25
31
 
26
32
  var _DeleteButton = _interopRequireDefault(require("./DeleteButton"));
@@ -29,6 +35,16 @@ var _styles = require("./styles");
29
35
 
30
36
  var _analytics = require("../../util/analytics");
31
37
 
38
+ var _ = require("../..");
39
+
40
+ var _reactIntersectionObserver = require("react-intersection-observer");
41
+
42
+ var _browserSupport = require("../../util/browser-support");
43
+
44
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
+
46
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
47
+
32
48
  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; }
33
49
 
34
50
  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; }
@@ -97,7 +113,7 @@ var handleImageError = function handleImageError(props, event) {
97
113
  // When rendering 1500+ emoji using class based components had a significant impact.
98
114
 
99
115
 
100
- var renderAsSprite = function renderAsSprite(props) {
116
+ var SpriteEmoji = function SpriteEmoji(props) {
101
117
  var emoji = props.emoji,
102
118
  fitToHeight = props.fitToHeight,
103
119
  selected = props.selected,
@@ -128,11 +144,9 @@ var renderAsSprite = function renderAsSprite(props) {
128
144
  backgroundSize: "".concat(sprite.column * 100, "% ").concat(sprite.row * 100, "%")
129
145
  }, sizing);
130
146
 
131
- var emojiNode = (0, _core.jsx)("span", {
132
- className: _styles.emojiSprite,
133
- style: style
134
- }, "\xA0");
135
147
  return (0, _core.jsx)("span", {
148
+ "data-testid": "sprite-emoji-".concat(emoji.shortName),
149
+ "data-emoji-type": "sprite",
136
150
  tabIndex: shouldBeInteractive ? 0 : undefined,
137
151
  role: shouldBeInteractive ? 'button' : undefined,
138
152
  css: _styles.emojiContainer,
@@ -148,11 +162,16 @@ var renderAsSprite = function renderAsSprite(props) {
148
162
  },
149
163
  "aria-label": emoji.shortName,
150
164
  title: showTooltip ? emoji.shortName : ''
151
- }, emojiNode);
165
+ }, (0, _core.jsx)("span", {
166
+ className: _styles.emojiSprite,
167
+ style: style
168
+ }, "\xA0"));
152
169
  }; // Keep as pure functional component, see renderAsSprite.
153
170
 
154
171
 
155
- var renderAsImage = function renderAsImage(props) {
172
+ exports.SpriteEmoji = SpriteEmoji;
173
+
174
+ var ImageEmoji = function ImageEmoji(props) {
156
175
  var emoji = props.emoji,
157
176
  fitToHeight = props.fitToHeight,
158
177
  selected = props.selected,
@@ -202,16 +221,28 @@ var renderAsImage = function renderAsImage(props) {
202
221
  };
203
222
 
204
223
  var onLoad = function onLoad() {
224
+ (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.ONLOAD_END);
205
225
  (0, _analytics.sampledUfoRenderedEmoji)(emoji).success();
206
- }; // Pass src attribute as key to force React to rerender img node since browser does not
207
- // change preview image until loaded
208
- // We currently have the following error: property 'loading' does not exist on type 'DetailedHTMLProps<ImgHTMLAttributes, HTMLImageElement>'
209
- // The fix for this was added as a part of @types/react@16.9.20 - https://github.com/facebook/react/issues/16942
210
- // TODO: remove @ts-ignore for the <img> below when the @types/react will be bumped from v16.8.0 to v16.9.20 or higher.
211
-
226
+ };
212
227
 
228
+ var onBeforeLoad = (0, _react.useCallback)(function () {
229
+ (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.ONLOAD_START);
230
+ }, [emoji]);
231
+
232
+ var _useInView = (0, _reactIntersectionObserver.useInView)({
233
+ triggerOnce: true
234
+ }),
235
+ _useInView2 = (0, _slicedToArray2.default)(_useInView, 2),
236
+ ref = _useInView2[0],
237
+ inView = _useInView2[1];
238
+
239
+ (0, _react.useEffect)(function () {
240
+ if (inView) {
241
+ onBeforeLoad();
242
+ }
243
+ }, [inView, onBeforeLoad]);
213
244
  var emojiNode = (0, _core.jsx)("img", (0, _extends2.default)({
214
- // @ts-ignore
245
+ //@ts-ignore
215
246
  loading: "lazy",
216
247
  src: src,
217
248
  key: src,
@@ -226,7 +257,29 @@ var renderAsImage = function renderAsImage(props) {
226
257
  onError: onError,
227
258
  onLoad: onLoad
228
259
  }, sizing));
260
+ var placeholder = (0, _core.jsx)(_.EmojiPlaceholder, {
261
+ shortName: emoji.shortName,
262
+ size: fitToHeight,
263
+ showTooltip: showTooltip,
264
+ representation: emoji.representation
265
+ });
266
+
267
+ var renderLazyLoadedEmoji = function renderLazyLoadedEmoji() {
268
+ // if browser not supported, render emoji node directly
269
+ if (!_browserSupport.isIntersectionObserverSupported) {
270
+ return emojiNode;
271
+ }
272
+
273
+ if (inView) {
274
+ return emojiNode;
275
+ }
276
+
277
+ return placeholder;
278
+ };
279
+
229
280
  return (0, _core.jsx)("span", {
281
+ "data-testid": "image-emoji-".concat(emoji.shortName),
282
+ "data-emoji-type": "image",
230
283
  css: _styles.emojiStyles,
231
284
  tabIndex: shouldBeInteractive ? 0 : undefined,
232
285
  role: shouldBeInteractive ? 'button' : undefined,
@@ -241,18 +294,21 @@ var renderAsImage = function renderAsImage(props) {
241
294
  handleMouseMove(props, event);
242
295
  },
243
296
  "aria-label": emoji.shortName,
244
- title: showTooltip ? emoji.shortName : ''
245
- }, deleteButton, emojiNode);
297
+ title: showTooltip ? emoji.shortName : '',
298
+ ref: ref
299
+ }, deleteButton, renderLazyLoadedEmoji());
246
300
  };
247
301
 
302
+ exports.ImageEmoji = ImageEmoji;
303
+
248
304
  var Emoji = function Emoji(props) {
249
305
  var emoji = props.emoji; // TODO: We always prefer render as image as having accessibility issues with sprite representation
250
306
 
251
307
  if ((0, _typeHelpers.isSpriteRepresentation)(emoji.representation)) {
252
- return renderAsSprite(props);
308
+ return (0, _core.jsx)(SpriteEmoji, props);
253
309
  }
254
310
 
255
- return renderAsImage(props);
311
+ return (0, _core.jsx)(ImageEmoji, props);
256
312
  };
257
313
 
258
314
  exports.Emoji = Emoji;
@@ -41,6 +41,7 @@ var EmojiPlaceholder = function EmojiPlaceholder(props) {
41
41
  height: "".concat(height, "px")
42
42
  };
43
43
  return (0, _core.jsx)("span", {
44
+ "data-testid": "emoji-placeholder-".concat(shortName),
44
45
  "aria-label": shortName,
45
46
  className: _styles.placeholder,
46
47
  css: _styles.placeholderContainer,
@@ -67,6 +67,10 @@ var Popup = /*#__PURE__*/function (_PureComponent) {
67
67
  if (_this.debounced) {
68
68
  clearTimeout(_this.debounced);
69
69
  _this.debounced = null;
70
+ }
71
+
72
+ if (typeof window === 'undefined') {
73
+ return;
70
74
  } // Timeout set to 30ms as to not throttle IE11
71
75
 
72
76
 
@@ -85,7 +89,11 @@ var Popup = /*#__PURE__*/function (_PureComponent) {
85
89
  this.popup = document.createElement('div');
86
90
  document.body.appendChild(this.popup);
87
91
  this.popup.style.position = 'absolute';
88
- window.addEventListener('resize', this.handleResize);
92
+
93
+ if (typeof window !== 'undefined') {
94
+ window.addEventListener('resize', this.handleResize);
95
+ }
96
+
89
97
  this.applyAbsolutePosition();
90
98
  this.renderContent();
91
99
  }
@@ -98,6 +106,10 @@ var Popup = /*#__PURE__*/function (_PureComponent) {
98
106
  }, {
99
107
  key: "componentWillUnmount",
100
108
  value: function componentWillUnmount() {
109
+ if (typeof window === 'undefined') {
110
+ return;
111
+ }
112
+
101
113
  window.removeEventListener('resize', this.handleResize);
102
114
 
103
115
  if (this.popup) {
@@ -124,6 +136,10 @@ var Popup = /*#__PURE__*/function (_PureComponent) {
124
136
  }, {
125
137
  key: "applyAbovePosition",
126
138
  value: function applyAbovePosition() {
139
+ if (typeof window === 'undefined') {
140
+ return;
141
+ }
142
+
127
143
  var targetNode = getTargetNode(this.props.target);
128
144
 
129
145
  if (targetNode && this.popup) {
@@ -138,6 +154,10 @@ var Popup = /*#__PURE__*/function (_PureComponent) {
138
154
  }, {
139
155
  key: "applyAbsolutePosition",
140
156
  value: function applyAbsolutePosition() {
157
+ if (typeof window === 'undefined') {
158
+ return;
159
+ }
160
+
141
161
  if (this.props.relativePosition === 'above') {
142
162
  this.applyAbovePosition();
143
163
  } else if (this.props.relativePosition === 'below') {
@@ -29,6 +29,8 @@ var _constants = require("../../util/constants");
29
29
 
30
30
  var _typeHelpers = require("../../util/type-helpers");
31
31
 
32
+ var _types = require("../../types");
33
+
32
34
  var _CachingEmoji = _interopRequireDefault(require("./CachingEmoji"));
33
35
 
34
36
  var _EmojiPlaceholder = _interopRequireDefault(require("./EmojiPlaceholder"));
@@ -69,6 +71,7 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
69
71
  var _this2 = this;
70
72
 
71
73
  var foundEmoji = emojiProvider.findByEmojiId(emojiId);
74
+ (0, _analytics.sampledUfoRenderedEmoji)(emojiId).mark(_types.UfoEmojiTimings.METADATA_START);
72
75
 
73
76
  if ((0, _typeHelpers.isPromise)(foundEmoji)) {
74
77
  this.setState({
@@ -82,6 +85,8 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
82
85
  loaded: true
83
86
  });
84
87
 
88
+ (0, _analytics.sampledUfoRenderedEmoji)(emojiId).mark(_types.UfoEmojiTimings.METADATA_END);
89
+
85
90
  if (!emoji) {
86
91
  // emoji is undefined
87
92
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
@@ -99,7 +104,8 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
99
104
  });
100
105
  });
101
106
  } else {
102
- // loaded
107
+ (0, _analytics.sampledUfoRenderedEmoji)(emojiId).mark(_types.UfoEmojiTimings.METADATA_END); // loaded
108
+
103
109
  this.setState({
104
110
  emoji: foundEmoji,
105
111
  loaded: true
@@ -122,6 +128,11 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
122
128
  value: function componentWillUnmount() {
123
129
  this.ready = false;
124
130
  }
131
+ }, {
132
+ key: "componentDidMount",
133
+ value: function componentDidMount() {
134
+ (0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId).mark(_types.UfoEmojiTimings.MOUNTED_END);
135
+ }
125
136
  }, {
126
137
  key: "UNSAFE_componentWillReceiveProps",
127
138
  value: function UNSAFE_componentWillReceiveProps(nextProps) {
@@ -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 () {
@@ -433,8 +437,6 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
433
437
  _analytics.ufoExperiences['emoji-picker-opened'].abort();
434
438
 
435
439
  _analytics.ufoExperiences['emoji-searched'].abort();
436
-
437
- _analytics.ufoExperiences['emoji-selection-recorded'].abort();
438
440
  }
439
441
  }, {
440
442
  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%',
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,27 @@ 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["MOUNTED"] = "emoji-mount";
82
+ UfoEmojiTimingsKeys["METADATA"] = "emoji-metadata";
83
+ UfoEmojiTimingsKeys["MEDIADATA"] = "emoji-media";
84
+ UfoEmojiTimingsKeys["ONLOAD"] = "emoji-onload";
85
+ })(UfoEmojiTimingsKeys || (exports.UfoEmojiTimingsKeys = UfoEmojiTimingsKeys = {}));
86
+
87
+ var UfoEmojiTimings;
88
+ exports.UfoEmojiTimings = UfoEmojiTimings;
89
+
90
+ (function (UfoEmojiTimings) {
91
+ UfoEmojiTimings["MOUNTED_END"] = "emoji-mount_end";
92
+ UfoEmojiTimings["METADATA_START"] = "emoji-metadata_start";
93
+ UfoEmojiTimings["METADATA_END"] = "emoji-metadata_end";
94
+ UfoEmojiTimings["MEDIA_START"] = "emoji-media_start";
95
+ UfoEmojiTimings["MEDIA_END"] = "emoji-media_end";
96
+ UfoEmojiTimings["ONLOAD_START"] = "emoji-onload_start";
97
+ UfoEmojiTimings["ONLOAD_END"] = "emoji-onload_end";
98
+ })(UfoEmojiTimings || (exports.UfoEmojiTimings = UfoEmojiTimings = {}));
@@ -31,8 +31,33 @@ var createInlineExperience = function createInlineExperience(componentName) {
31
31
  };
32
32
  };
33
33
 
34
+ var customEmojiTimings = [{
35
+ key: _types.UfoEmojiTimingsKeys.MOUNTED,
36
+ endMark: _types.UfoEmojiTimings.MOUNTED_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.ONLOAD,
49
+ startMark: _types.UfoEmojiTimings.ONLOAD_START,
50
+ endMark: _types.UfoEmojiTimings.ONLOAD_END
51
+ }];
34
52
  var ufoExperiences = {
35
- 'emoji-rendered': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RENDERED, createRenderExperience(_types.UfoComponentName.EMOJI)),
53
+ 'emoji-rendered': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RENDERED, {
54
+ platform: {
55
+ component: _types.UfoComponentName.EMOJI
56
+ },
57
+ type: _ufo.ExperienceTypes.Operation,
58
+ performanceType: _ufo.ExperiencePerformanceTypes.Custom,
59
+ timings: customEmojiTimings
60
+ }),
36
61
  'emoji-resource-fetched': new _ufo.ConcurrentExperience(_types.UfoExperienceName.EMOJI_RESOURCE_FETCHED, createRenderExperience(_types.UfoComponentName.EMOJI_PROVIDER)),
37
62
  'emoji-picker-opened': new _ufo.UFOExperience(_types.UfoExperienceName.EMOJI_PICKER_OPENED, createRenderExperience(_types.UfoComponentName.EMOJI_PICKER)),
38
63
  'emoji-selection-recorded': new _ufo.UFOExperience(_types.UfoExperienceName.EMOJI_SELECTION_RECORDED, createInlineExperience(_types.UfoComponentName.EMOJI_PROVIDER)),
@@ -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' ? false : !!window.IntersectionObserver;
8
+ exports.isIntersectionObserverSupported = isIntersectionObserverSupported;
@@ -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 {
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.6.1",
3
+ "version": "64.7.0",
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
  });
@@ -143,6 +143,10 @@ export class EmojiResource extends AbstractResource {
143
143
  }
144
144
 
145
145
  loadStoredTone() {
146
+ if (typeof window === 'undefined') {
147
+ return undefined;
148
+ }
149
+
146
150
  const storedToneString = window.localStorage.getItem(selectedToneStorageKey);
147
151
 
148
152
  if (storedToneString) {
@@ -384,6 +388,10 @@ export class EmojiResource extends AbstractResource {
384
388
  setSelectedTone(tone) {
385
389
  this.selectedTone = tone;
386
390
 
391
+ if (typeof window === 'undefined') {
392
+ return;
393
+ }
394
+
387
395
  if (storageAvailable('localStorage')) {
388
396
  try {
389
397
  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