@atlaskit/emoji 64.5.2 → 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 (77) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/admin/package.json +1 -0
  3. package/dist/cjs/api/EmojiRepository.js +4 -0
  4. package/dist/cjs/api/EmojiResource.js +62 -0
  5. package/dist/cjs/api/EmojiUtils.js +4 -0
  6. package/dist/cjs/api/internal/UsageFrequencyTracker.js +4 -1
  7. package/dist/cjs/api/media/SiteEmojiResource.js +59 -2
  8. package/dist/cjs/api/media/TokenManager.js +16 -7
  9. package/dist/cjs/components/common/CachingEmoji.js +44 -77
  10. package/dist/cjs/components/common/DeleteButton.js +2 -1
  11. package/dist/cjs/components/common/Emoji.js +76 -20
  12. package/dist/cjs/components/common/EmojiPlaceholder.js +1 -0
  13. package/dist/cjs/components/common/Popup.js +21 -1
  14. package/dist/cjs/components/common/ResourcedEmojiComponent.js +12 -1
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +4 -2
  16. package/dist/cjs/components/picker/EmojiPickerListSearch.js +5 -0
  17. package/dist/cjs/components/picker/styles.js +2 -0
  18. package/dist/cjs/types.js +25 -2
  19. package/dist/cjs/util/analytics/ufoExperiences.js +26 -1
  20. package/dist/cjs/util/browser-support.js +8 -0
  21. package/dist/cjs/util/storage-available.js +4 -0
  22. package/dist/cjs/version.json +1 -1
  23. package/dist/es2019/api/EmojiRepository.js +4 -0
  24. package/dist/es2019/api/EmojiResource.js +26 -1
  25. package/dist/es2019/api/EmojiUtils.js +4 -0
  26. package/dist/es2019/api/internal/UsageFrequencyTracker.js +4 -1
  27. package/dist/es2019/api/media/SiteEmojiResource.js +24 -0
  28. package/dist/es2019/api/media/TokenManager.js +13 -5
  29. package/dist/es2019/components/common/CachingEmoji.js +36 -77
  30. package/dist/es2019/components/common/DeleteButton.js +2 -1
  31. package/dist/es2019/components/common/Emoji.js +54 -21
  32. package/dist/es2019/components/common/EmojiPlaceholder.js +1 -0
  33. package/dist/es2019/components/common/Popup.js +21 -1
  34. package/dist/es2019/components/common/ResourcedEmojiComponent.js +9 -1
  35. package/dist/es2019/components/picker/EmojiPickerComponent.js +4 -1
  36. package/dist/es2019/components/picker/EmojiPickerListSearch.js +5 -0
  37. package/dist/es2019/components/picker/styles.js +3 -0
  38. package/dist/es2019/types.js +22 -1
  39. package/dist/es2019/util/analytics/ufoExperiences.js +27 -2
  40. package/dist/es2019/util/browser-support.js +1 -0
  41. package/dist/es2019/util/storage-available.js +4 -0
  42. package/dist/es2019/version.json +1 -1
  43. package/dist/esm/api/EmojiRepository.js +4 -0
  44. package/dist/esm/api/EmojiResource.js +61 -1
  45. package/dist/esm/api/EmojiUtils.js +4 -0
  46. package/dist/esm/api/internal/UsageFrequencyTracker.js +4 -1
  47. package/dist/esm/api/media/SiteEmojiResource.js +57 -2
  48. package/dist/esm/api/media/TokenManager.js +14 -5
  49. package/dist/esm/components/common/CachingEmoji.js +45 -79
  50. package/dist/esm/components/common/DeleteButton.js +2 -1
  51. package/dist/esm/components/common/Emoji.js +60 -21
  52. package/dist/esm/components/common/EmojiPlaceholder.js +1 -0
  53. package/dist/esm/components/common/Popup.js +21 -1
  54. package/dist/esm/components/common/ResourcedEmojiComponent.js +11 -1
  55. package/dist/esm/components/picker/EmojiPickerComponent.js +4 -1
  56. package/dist/esm/components/picker/EmojiPickerListSearch.js +5 -0
  57. package/dist/esm/components/picker/styles.js +2 -0
  58. package/dist/esm/types.js +22 -1
  59. package/dist/esm/util/analytics/ufoExperiences.js +27 -2
  60. package/dist/esm/util/browser-support.js +1 -0
  61. package/dist/esm/util/storage-available.js +4 -0
  62. package/dist/esm/version.json +1 -1
  63. package/dist/types/api/EmojiResource.d.ts +4 -0
  64. package/dist/types/api/media/SiteEmojiResource.d.ts +4 -0
  65. package/dist/types/api/media/TokenManager.d.ts +2 -1
  66. package/dist/types/components/common/CachingEmoji.d.ts +1 -4
  67. package/dist/types/components/common/Emoji.d.ts +2 -0
  68. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +1 -0
  69. package/dist/types/types.d.ts +21 -0
  70. package/dist/types/util/browser-support.d.ts +1 -0
  71. package/element/package.json +1 -0
  72. package/package.json +7 -6
  73. package/picker/package.json +1 -0
  74. package/resource/package.json +1 -0
  75. package/typeahead/package.json +1 -0
  76. package/types/package.json +1 -0
  77. package/utils/package.json +1 -0
@@ -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.5.2",
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
  });
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { AbstractResource, utils as serviceUtils } from '@atlaskit/util-service-support';
3
3
  import { selectedToneStorageKey } from '../util/constants';
4
- import { isMediaEmoji, isPromise, toEmojiId } from '../util/type-helpers';
4
+ import { isMediaEmoji, isMediaRepresentation, isPromise, toEmojiId } from '../util/type-helpers';
5
5
  import storageAvailable from '../util/storage-available';
6
6
  import { ProviderTypes } from '../types';
7
7
  import debug from '../util/logger';
@@ -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) {
@@ -181,6 +185,23 @@ export class EmojiResource extends AbstractResource {
181
185
  super.notifyResult(result);
182
186
  }
183
187
  }
188
+ /**
189
+ * Returns the EmojiDescription with a valid media path that includes query token and client attributes to access the emoji media inline.
190
+ */
191
+
192
+
193
+ async getMediaEmojiDescriptionURLWithInlineToken(emoji) {
194
+ if (this.siteEmojiResource && isMediaRepresentation(emoji.representation)) {
195
+ const tokenisedMediaPath = await this.siteEmojiResource.generateTokenisedMediaURL(emoji);
196
+ return { ...emoji,
197
+ representation: { ...emoji.representation,
198
+ mediaPath: tokenisedMediaPath
199
+ }
200
+ };
201
+ }
202
+
203
+ return emoji;
204
+ }
184
205
 
185
206
  loadMediaEmoji(emoji, useAlt) {
186
207
  if (!this.siteEmojiResource || !isMediaEmoji(emoji)) {
@@ -367,6 +388,10 @@ export class EmojiResource extends AbstractResource {
367
388
  setSelectedTone(tone) {
368
389
  this.selectedTone = tone;
369
390
 
391
+ if (typeof window === 'undefined') {
392
+ return;
393
+ }
394
+
370
395
  if (storageAvailable('localStorage')) {
371
396
  try {
372
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
 
@@ -63,6 +63,30 @@ export default class SiteEmojiResource {
63
63
  this.tokenManager.addToken('read', mediaApiToken);
64
64
  this.mediaEmojiCache = new MediaEmojiCache(this.tokenManager);
65
65
  }
66
+ /**
67
+ * Will generate an emoji media path that is inclusive of client and token within the query parameter
68
+ */
69
+
70
+
71
+ async generateTokenisedMediaURL(emoji) {
72
+ if (emoji && isMediaRepresentation(emoji.representation)) {
73
+ const currentMediaPathURL = new URL(emoji.representation.mediaPath);
74
+ const currentMediaPathPARAMS = currentMediaPathURL.searchParams;
75
+ const readToken = await this.tokenManager.getToken('read');
76
+
77
+ if (currentMediaPathPARAMS.get('token') !== readToken.jwt) {
78
+ currentMediaPathPARAMS.set('token', readToken.jwt);
79
+ }
80
+
81
+ if (currentMediaPathPARAMS.get('client') !== readToken.clientId) {
82
+ currentMediaPathPARAMS.set('client', readToken.clientId);
83
+ }
84
+
85
+ return currentMediaPathURL.toString();
86
+ }
87
+
88
+ throw Error('Emoji resource is not of type Media Representation');
89
+ }
66
90
  /**
67
91
  * Will load media emoji, returning a new EmojiDescription if, for example,
68
92
  * the URL has changed.
@@ -1,12 +1,23 @@
1
1
  import { utils as serviceUtils } from '@atlaskit/util-service-support'; // expire 30 seconds early to factor in latency, slow services, etc
2
2
 
3
- export const expireAdjustment = 30;
3
+ export const EXPIRES_AT_LATENCY_IN_SECONDS = 30;
4
4
  export default class TokenManager {
5
5
  constructor(siteServiceConfig) {
6
6
  this.siteServiceConfig = siteServiceConfig;
7
7
  this.tokens = new Map();
8
8
  }
9
9
 
10
+ isValidToken(mediaApiToken) {
11
+ const nowInSeconds = Date.now() / 1000;
12
+ const expiresAt = mediaApiToken.expiresAt - EXPIRES_AT_LATENCY_IN_SECONDS;
13
+
14
+ if (nowInSeconds < expiresAt) {
15
+ return true;
16
+ }
17
+
18
+ return false;
19
+ }
20
+
10
21
  addToken(type, mediaApiToken) {
11
22
  this.tokens.set(type, {
12
23
  mediaApiToken
@@ -27,10 +38,7 @@ export default class TokenManager {
27
38
  } = tokenDetail;
28
39
 
29
40
  if (mediaApiToken) {
30
- const nowInSeconds = Date.now() / 1000;
31
- const expiresAt = mediaApiToken.expiresAt - expireAdjustment;
32
-
33
- if (nowInSeconds < expiresAt && !forceRefresh) {
41
+ if (this.isValidToken(mediaApiToken) && !forceRefresh) {
34
42
  // still valid
35
43
  return Promise.resolve(mediaApiToken);
36
44
  }