@atlaskit/emoji 66.1.2 → 67.0.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 (137) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/api/EmojiResource.js +207 -116
  3. package/dist/cjs/components/common/CachingEmoji.js +7 -5
  4. package/dist/cjs/components/common/DeleteButton.js +2 -1
  5. package/dist/cjs/components/common/Emoji.js +24 -10
  6. package/dist/cjs/components/common/EmojiActions.js +10 -3
  7. package/dist/cjs/components/common/EmojiDeletePreview.js +6 -2
  8. package/dist/cjs/components/common/EmojiErrorMessage.js +16 -5
  9. package/dist/cjs/components/common/EmojiPlaceholder.js +8 -2
  10. package/dist/cjs/components/common/EmojiUploadPicker.js +5 -2
  11. package/dist/cjs/components/common/EmojiUploadPreview.js +9 -3
  12. package/dist/cjs/components/common/FileChooser.js +10 -3
  13. package/dist/cjs/components/common/ResourcedEmoji.js +35 -106
  14. package/dist/cjs/components/common/ResourcedEmojiComponent.js +159 -87
  15. package/dist/cjs/components/common/RetryableButton.js +10 -3
  16. package/dist/cjs/components/picker/CategorySelector.js +15 -3
  17. package/dist/cjs/components/picker/EmojiPicker.js +4 -4
  18. package/dist/cjs/components/picker/EmojiPickerComponent.js +30 -57
  19. package/dist/cjs/components/picker/EmojiPickerFooter.js +4 -2
  20. package/dist/cjs/components/picker/EmojiPickerList.js +8 -8
  21. package/dist/cjs/components/picker/EmojiPickerListSearch.js +6 -2
  22. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +2 -8
  23. package/dist/cjs/components/picker/VirtualList.js +229 -0
  24. package/dist/cjs/components/picker/styles.js +1 -1
  25. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +3 -8
  26. package/dist/cjs/components/typeahead/EmojiTypeAheadItem.js +7 -4
  27. package/dist/cjs/context/EmojiCommonProvider.js +36 -0
  28. package/dist/cjs/context/EmojiContextProvider.js +15 -3
  29. package/dist/cjs/hooks/useEmoji.js +84 -0
  30. package/dist/cjs/hooks/useEmojiContext.js +3 -0
  31. package/dist/cjs/index.js +14 -6
  32. package/dist/cjs/util/analytics/samplingUfo.js +10 -14
  33. package/dist/cjs/util/constants.js +2 -2
  34. package/dist/cjs/version.json +1 -1
  35. package/dist/es2019/api/EmojiResource.js +66 -40
  36. package/dist/es2019/components/common/CachingEmoji.js +7 -5
  37. package/dist/es2019/components/common/DeleteButton.js +2 -1
  38. package/dist/es2019/components/common/Emoji.js +22 -10
  39. package/dist/es2019/components/common/EmojiActions.js +5 -2
  40. package/dist/es2019/components/common/EmojiDeletePreview.js +3 -1
  41. package/dist/es2019/components/common/EmojiErrorMessage.js +11 -4
  42. package/dist/es2019/components/common/EmojiPlaceholder.js +2 -1
  43. package/dist/es2019/components/common/EmojiUploadPicker.js +3 -1
  44. package/dist/es2019/components/common/EmojiUploadPreview.js +5 -2
  45. package/dist/es2019/components/common/FileChooser.js +6 -2
  46. package/dist/es2019/components/common/ResourcedEmoji.js +38 -71
  47. package/dist/es2019/components/common/ResourcedEmojiComponent.js +90 -54
  48. package/dist/es2019/components/common/RetryableButton.js +6 -2
  49. package/dist/es2019/components/picker/CategorySelector.js +8 -2
  50. package/dist/es2019/components/picker/EmojiPicker.js +3 -3
  51. package/dist/es2019/components/picker/EmojiPickerComponent.js +10 -31
  52. package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -1
  53. package/dist/es2019/components/picker/EmojiPickerList.js +12 -9
  54. package/dist/es2019/components/picker/EmojiPickerListSearch.js +3 -1
  55. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +2 -8
  56. package/dist/es2019/components/picker/VirtualList.js +169 -0
  57. package/dist/es2019/components/picker/styles.js +1 -1
  58. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +3 -8
  59. package/dist/es2019/components/typeahead/EmojiTypeAheadItem.js +6 -3
  60. package/dist/es2019/context/EmojiCommonProvider.js +24 -0
  61. package/dist/es2019/context/EmojiContextProvider.js +6 -1
  62. package/dist/es2019/hooks/useEmoji.js +39 -0
  63. package/dist/es2019/hooks/useEmojiContext.js +4 -0
  64. package/dist/es2019/index.js +4 -3
  65. package/dist/es2019/util/analytics/samplingUfo.js +10 -15
  66. package/dist/es2019/util/constants.js +2 -2
  67. package/dist/es2019/version.json +1 -1
  68. package/dist/esm/api/EmojiResource.js +206 -115
  69. package/dist/esm/components/common/CachingEmoji.js +7 -5
  70. package/dist/esm/components/common/DeleteButton.js +2 -1
  71. package/dist/esm/components/common/Emoji.js +24 -10
  72. package/dist/esm/components/common/EmojiActions.js +5 -2
  73. package/dist/esm/components/common/EmojiDeletePreview.js +3 -1
  74. package/dist/esm/components/common/EmojiErrorMessage.js +11 -4
  75. package/dist/esm/components/common/EmojiPlaceholder.js +4 -1
  76. package/dist/esm/components/common/EmojiUploadPicker.js +3 -1
  77. package/dist/esm/components/common/EmojiUploadPreview.js +5 -2
  78. package/dist/esm/components/common/FileChooser.js +6 -2
  79. package/dist/esm/components/common/ResourcedEmoji.js +34 -102
  80. package/dist/esm/components/common/ResourcedEmojiComponent.js +159 -88
  81. package/dist/esm/components/common/RetryableButton.js +6 -2
  82. package/dist/esm/components/picker/CategorySelector.js +10 -2
  83. package/dist/esm/components/picker/EmojiPicker.js +3 -3
  84. package/dist/esm/components/picker/EmojiPickerComponent.js +29 -56
  85. package/dist/esm/components/picker/EmojiPickerFooter.js +2 -1
  86. package/dist/esm/components/picker/EmojiPickerList.js +8 -8
  87. package/dist/esm/components/picker/EmojiPickerListSearch.js +3 -1
  88. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +2 -8
  89. package/dist/esm/components/picker/VirtualList.js +205 -0
  90. package/dist/esm/components/picker/styles.js +1 -1
  91. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +3 -8
  92. package/dist/esm/components/typeahead/EmojiTypeAheadItem.js +6 -3
  93. package/dist/esm/context/EmojiCommonProvider.js +24 -0
  94. package/dist/esm/context/EmojiContextProvider.js +14 -3
  95. package/dist/esm/hooks/useEmoji.js +69 -0
  96. package/dist/esm/hooks/useEmojiContext.js +4 -0
  97. package/dist/esm/index.js +4 -3
  98. package/dist/esm/util/analytics/samplingUfo.js +10 -15
  99. package/dist/esm/util/constants.js +2 -2
  100. package/dist/esm/version.json +1 -1
  101. package/dist/types/api/EmojiResource.d.ts +15 -1
  102. package/dist/types/api/EmojiUtils.d.ts +2 -2
  103. package/dist/types/components/common/Emoji.d.ts +19 -0
  104. package/dist/types/components/common/EmojiActions.d.ts +2 -0
  105. package/dist/types/components/common/EmojiDeletePreview.d.ts +1 -0
  106. package/dist/types/components/common/EmojiErrorMessage.d.ts +3 -0
  107. package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
  108. package/dist/types/components/common/EmojiUploadPicker.d.ts +1 -0
  109. package/dist/types/components/common/EmojiUploadPreview.d.ts +2 -0
  110. package/dist/types/components/common/FileChooser.d.ts +2 -0
  111. package/dist/types/components/common/ResourcedEmoji.d.ts +5 -17
  112. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +2 -2
  113. package/dist/types/components/common/RetryableButton.d.ts +2 -0
  114. package/dist/types/components/picker/CategorySelector.d.ts +2 -0
  115. package/dist/types/components/picker/CategoryTracker.d.ts +1 -1
  116. package/dist/types/components/picker/EmojiPickerComponent.d.ts +1 -6
  117. package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
  118. package/dist/types/components/picker/EmojiPickerListSearch.d.ts +1 -0
  119. package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +3 -13
  120. package/dist/types/components/picker/VirtualList.d.ts +39 -0
  121. package/dist/types/components/typeahead/EmojiTypeAheadItem.d.ts +2 -1
  122. package/dist/types/context/EmojiCommonProvider.d.ts +17 -0
  123. package/dist/types/hooks/useEmoji.d.ts +5 -0
  124. package/dist/types/hooks/useEmojiContext.d.ts +3 -0
  125. package/dist/types/index.d.ts +3 -2
  126. package/dist/types/util/analytics/samplingUfo.d.ts +7 -0
  127. package/dist/types/util/constants.d.ts +2 -2
  128. package/package.json +7 -6
  129. package/report.api.md +33 -42
  130. package/dist/cjs/components/common/EmojiImage.js +0 -99
  131. package/dist/cjs/context/LegacyEmojiContextProvider.js +0 -76
  132. package/dist/es2019/components/common/EmojiImage.js +0 -74
  133. package/dist/es2019/context/LegacyEmojiContextProvider.js +0 -32
  134. package/dist/esm/components/common/EmojiImage.js +0 -84
  135. package/dist/esm/context/LegacyEmojiContextProvider.js +0 -57
  136. package/dist/types/components/common/EmojiImage.d.ts +0 -14
  137. package/dist/types/context/LegacyEmojiContextProvider.d.ts +0 -22
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [`f25b0c5379b`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f25b0c5379b) - Drop support for legacy React Context, and create new EmojiCommonProvider to provide emoji provider
8
+ - [`62789954243`](https://bitbucket.org/atlassian/atlassian-frontend/commits/62789954243) - react-virutlaized has been replaced with @tanstack/react-virutal in @atlaskit/emoji
9
+
10
+ ### Minor Changes
11
+
12
+ - [`c7649c62641`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c7649c62641) - add getEmojiProvider in EmojiResource to return emoji provider
13
+ - [`1d41bbc2965`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1d41bbc2965) - This changeset introduces non breaking changes to support ssr within the loader emoji component
14
+ - [`b7678f756b3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b7678f756b3) - useEmoji hook introduced to work along side EmojiCommonProvider
15
+
16
+ ### Patch Changes
17
+
18
+ - [`d9b8aef8963`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d9b8aef8963) - Remove resolution of optimistic image url inside resourced emoji
19
+ - [`2d8e77c92f0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2d8e77c92f0) - Remove export from useEmoji hook
20
+ - [`157052c5719`](https://bitbucket.org/atlassian/atlassian-frontend/commits/157052c5719) - improve sampling algorithm in ufo analytics, and add lazyload metadata to emoji rendered ufo analytics
21
+ - [`004378db934`](https://bitbucket.org/atlassian/atlassian-frontend/commits/004378db934) - Fix VirtualList component force rendering while been unmounted and re-mounted in the DOM
22
+ - Updated dependencies
23
+
3
24
  ## 66.1.2
4
25
 
5
26
  ### Patch Changes
@@ -31,14 +31,14 @@ var _utilServiceSupport = require("@atlaskit/util-service-support");
31
31
 
32
32
  var _constants = require("../util/constants");
33
33
 
34
+ var _logger = _interopRequireDefault(require("../util/logger"));
35
+
34
36
  var _typeHelpers = require("../util/type-helpers");
35
37
 
36
38
  var _storageAvailable = _interopRequireDefault(require("../util/storage-available"));
37
39
 
38
40
  var _types = require("../types");
39
41
 
40
- var _logger = _interopRequireDefault(require("../util/logger"));
41
-
42
42
  var _EmojiLoader = _interopRequireDefault(require("./EmojiLoader"));
43
43
 
44
44
  var _EmojiRepository = _interopRequireDefault(require("./EmojiRepository"));
@@ -90,7 +90,7 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
90
90
  return;
91
91
  });
92
92
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isLoaded", function () {
93
- return _this.activeLoaders === 0 && _this.emojiRepository;
93
+ return _this.activeLoaders === 0 && !!_this.emojiRepository;
94
94
  });
95
95
  _this.emojiProviderConfig = config;
96
96
  _this.recordConfig = config.recordConfig;
@@ -104,121 +104,212 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
104
104
  throw new Error('No providers specified');
105
105
  }
106
106
 
107
+ _this.activeLoaders = _this.emojiProviderConfig.providers.length;
108
+ _this.emojiResponses = [];
107
109
  return _this;
108
110
  }
111
+ /**
112
+ * Get the emoji provider from Emoji Resource
113
+ * @returns Promise<EmojiProvider>
114
+ */
115
+
109
116
 
110
117
  (0, _createClass2.default)(EmojiResource, [{
118
+ key: "getEmojiProvider",
119
+ value: function () {
120
+ var _getEmojiProvider = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
121
+ var options,
122
+ _args = arguments;
123
+ return _regenerator.default.wrap(function _callee$(_context) {
124
+ while (1) {
125
+ switch (_context.prev = _context.next) {
126
+ case 0:
127
+ options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {
128
+ fetchAtStart: true
129
+ };
130
+
131
+ if (!options.fetchAtStart) {
132
+ _context.next = 11;
133
+ break;
134
+ }
135
+
136
+ _context.prev = 2;
137
+ _context.next = 5;
138
+ return this.fetchEmojiProvider();
139
+
140
+ case 5:
141
+ _context.next = 11;
142
+ break;
143
+
144
+ case 7:
145
+ _context.prev = 7;
146
+ _context.t0 = _context["catch"](2);
147
+ (0, _logger.default)(_context.t0);
148
+ return _context.abrupt("return", Promise.resolve(this));
149
+
150
+ case 11:
151
+ return _context.abrupt("return", Promise.resolve(this));
152
+
153
+ case 12:
154
+ case "end":
155
+ return _context.stop();
156
+ }
157
+ }
158
+ }, _callee, this, [[2, 7]]);
159
+ }));
160
+
161
+ function getEmojiProvider() {
162
+ return _getEmojiProvider.apply(this, arguments);
163
+ }
164
+
165
+ return getEmojiProvider;
166
+ }()
167
+ }, {
168
+ key: "fetchIndividualProvider",
169
+ value: function () {
170
+ var _fetchIndividualProvider = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(provider, index) {
171
+ var providerType, loader, emojiResponse;
172
+ return _regenerator.default.wrap(function _callee2$(_context2) {
173
+ while (1) {
174
+ switch (_context2.prev = _context2.next) {
175
+ case 0:
176
+ providerType = this.getProviderType(provider);
177
+ _context2.prev = 1;
178
+ (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).start({
179
+ samplingRate: _constants.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP
180
+ });
181
+ (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).addMetadata({
182
+ type: providerType
183
+ });
184
+ loader = new _EmojiLoader.default(provider); // fetch emoji from provider url and denormalise
185
+
186
+ _context2.next = 7;
187
+ return loader.loadEmoji();
188
+
189
+ case 7:
190
+ emojiResponse = _context2.sent;
191
+ (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).success(); // setup emoji repository
192
+
193
+ this.emojiResponses[index] = emojiResponse;
194
+ this.initEmojiRepository(this.emojiResponses);
195
+ _context2.next = 13;
196
+ return this.initSiteEmojiResource(emojiResponse, provider);
197
+
198
+ case 13:
199
+ this.activeLoaders--;
200
+ this.performRetries();
201
+ this.refreshLastFilter();
202
+ _context2.next = 25;
203
+ break;
204
+
205
+ case 18:
206
+ _context2.prev = 18;
207
+ _context2.t0 = _context2["catch"](1);
208
+ this.activeLoaders--;
209
+ this.notifyError(_context2.t0);
210
+ (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).failure({
211
+ metadata: {
212
+ reason: _context2.t0,
213
+ source: 'EmojiProvider',
214
+ providerUrl: provider.url
215
+ }
216
+ });
217
+ (0, _logger.default)("failed to fetch emoji provider for ".concat(provider.url), _context2.t0);
218
+ throw new Error("failed to fetch emoji from ".concat(provider.url));
219
+
220
+ case 25:
221
+ case "end":
222
+ return _context2.stop();
223
+ }
224
+ }
225
+ }, _callee2, this, [[1, 18]]);
226
+ }));
227
+
228
+ function fetchIndividualProvider(_x, _x2) {
229
+ return _fetchIndividualProvider.apply(this, arguments);
230
+ }
231
+
232
+ return fetchIndividualProvider;
233
+ }()
234
+ }, {
111
235
  key: "fetchEmojiProvider",
112
- value: function fetchEmojiProvider(force) {
113
- var _this2 = this;
114
-
115
- // unless (re-)fetch is being forced, fetching will only
116
- // happen if no emojiRepository exists
117
- // in case this method is called and emojiRepository has already been populated
118
- // the method will just return the existing emojiRepository
119
- if (force || !this.emojiRepository && !this.isInitialised) {
120
- this.isInitialised = true; // Ensure order is retained by tracking until all done.
121
-
122
- var emojiResponses = [];
123
- this.activeLoaders = this.emojiProviderConfig.providers.length;
124
- this.emojiProviderConfig.providers.forEach( /*#__PURE__*/function () {
125
- var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(provider, index) {
126
- var providerType, loader, emojis;
127
- return _regenerator.default.wrap(function _callee$(_context) {
128
- while (1) {
129
- switch (_context.prev = _context.next) {
130
- case 0:
131
- providerType = _this2.getProviderType(provider);
132
- (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).start({
133
- samplingRate: _constants.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP
134
- });
135
- (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).addMetadata({
136
- type: providerType
137
- });
138
- loader = new _EmojiLoader.default(provider);
139
- emojis = loader.loadEmoji();
140
- _context.next = 7;
141
- return emojis.then(function (emojiResponse) {
142
- emojiResponses[index] = emojiResponse;
143
-
144
- _this2.initEmojiRepository(emojiResponses);
145
-
146
- _this2.initSiteEmojiResource(emojiResponse, provider).then(function () {
147
- _this2.activeLoaders--;
148
-
149
- _this2.performRetries();
150
-
151
- _this2.refreshLastFilter(); // if not site emoji it would still resolve
152
- // TODO: improve the logic in future
153
-
154
-
155
- (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).success();
156
- });
157
- }).catch(function (reason) {
158
- _this2.activeLoaders--;
159
-
160
- _this2.notifyError(reason);
161
-
162
- (0, _ufoExperiences.sampledUfoEmojiResourceFetched)(providerType).failure({
163
- metadata: {
164
- reason: reason,
165
- source: 'EmojiProvider',
166
- providerUrl: provider.url
167
- }
168
- });
169
- });
170
-
171
- case 7:
172
- case "end":
173
- return _context.stop();
236
+ value: function () {
237
+ var _fetchEmojiProvider = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
238
+ var _this2 = this;
239
+
240
+ var force,
241
+ _args3 = arguments;
242
+ return _regenerator.default.wrap(function _callee3$(_context3) {
243
+ while (1) {
244
+ switch (_context3.prev = _context3.next) {
245
+ case 0:
246
+ force = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : false;
247
+
248
+ if (!(force || !this.emojiRepository && !this.isInitialised)) {
249
+ _context3.next = 6;
250
+ break;
174
251
  }
175
- }
176
- }, _callee);
177
- }));
178
252
 
179
- return function (_x, _x2) {
180
- return _ref.apply(this, arguments);
181
- };
182
- }());
253
+ this.isInitialised = true;
254
+ this.emojiResponses = []; // fetch emoji providers
255
+
256
+ _context3.next = 6;
257
+ return Promise.all(this.emojiProviderConfig.providers.map(function (provider, index) {
258
+ return _this2.fetchIndividualProvider(provider, index);
259
+ }));
260
+
261
+ case 6:
262
+ return _context3.abrupt("return", Promise.resolve(this.emojiRepository));
263
+
264
+ case 7:
265
+ case "end":
266
+ return _context3.stop();
267
+ }
268
+ }
269
+ }, _callee3, this);
270
+ }));
271
+
272
+ function fetchEmojiProvider() {
273
+ return _fetchEmojiProvider.apply(this, arguments);
183
274
  }
184
275
 
185
- return Promise.resolve(this.emojiRepository);
186
- }
276
+ return fetchEmojiProvider;
277
+ }()
187
278
  }, {
188
279
  key: "fetchByEmojiId",
189
280
  value: function () {
190
- var _fetchByEmojiId = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(emojiId, optimistic) {
281
+ var _fetchByEmojiId = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(emojiId, optimistic) {
191
282
  var _emoji, provider, loader, loadEmoji, _emoji2, emoji;
192
283
 
193
- return _regenerator.default.wrap(function _callee2$(_context2) {
284
+ return _regenerator.default.wrap(function _callee4$(_context4) {
194
285
  while (1) {
195
- switch (_context2.prev = _context2.next) {
286
+ switch (_context4.prev = _context4.next) {
196
287
  case 0:
197
288
  if (!(this.emojiRepository && this.isLoaded())) {
198
- _context2.next = 8;
289
+ _context4.next = 8;
199
290
  break;
200
291
  }
201
292
 
202
- _context2.next = 3;
293
+ _context4.next = 3;
203
294
  return this.findByEmojiId(emojiId);
204
295
 
205
296
  case 3:
206
- _emoji = _context2.sent;
297
+ _emoji = _context4.sent;
207
298
 
208
299
  if (!_emoji) {
209
- _context2.next = 8;
300
+ _context4.next = 8;
210
301
  break;
211
302
  }
212
303
 
213
- _context2.next = 7;
304
+ _context4.next = 7;
214
305
  return this.getMediaEmojiDescriptionURLWithInlineToken(_emoji);
215
306
 
216
307
  case 7:
217
- return _context2.abrupt("return", _context2.sent);
308
+ return _context4.abrupt("return", _context4.sent);
218
309
 
219
310
  case 8:
220
311
  if (!(this.emojiProviderConfig.singleEmojiApi && optimistic)) {
221
- _context2.next = 31;
312
+ _context4.next = 31;
222
313
  break;
223
314
  }
224
315
 
@@ -228,74 +319,74 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
228
319
  securityProvider: this.emojiProviderConfig.singleEmojiApi.securityProvider
229
320
  };
230
321
  loader = new _EmojiLoader.default(provider);
231
- _context2.prev = 11;
232
- _context2.next = 14;
322
+ _context4.prev = 11;
323
+ _context4.next = 14;
233
324
  return loader.loadEmoji();
234
325
 
235
326
  case 14:
236
- loadEmoji = _context2.sent;
327
+ loadEmoji = _context4.sent;
237
328
 
238
329
  if (loadEmoji.emojis[0]) {
239
- _context2.next = 17;
330
+ _context4.next = 17;
240
331
  break;
241
332
  }
242
333
 
243
- return _context2.abrupt("return");
334
+ return _context4.abrupt("return");
244
335
 
245
336
  case 17:
246
337
  if (this.siteEmojiResource) {
247
- _context2.next = 20;
338
+ _context4.next = 20;
248
339
  break;
249
340
  }
250
341
 
251
- _context2.next = 20;
342
+ _context4.next = 20;
252
343
  return this.initSiteEmojiResource(loadEmoji, provider);
253
344
 
254
345
  case 20:
255
- return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(loadEmoji.emojis[0]));
346
+ return _context4.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(loadEmoji.emojis[0]));
256
347
 
257
348
  case 23:
258
- _context2.prev = 23;
259
- _context2.t0 = _context2["catch"](11);
260
- _context2.next = 27;
349
+ _context4.prev = 23;
350
+ _context4.t0 = _context4["catch"](11);
351
+ _context4.next = 27;
261
352
  return this.findByEmojiId(emojiId);
262
353
 
263
354
  case 27:
264
- _emoji2 = _context2.sent;
355
+ _emoji2 = _context4.sent;
265
356
 
266
357
  if (_emoji2) {
267
- _context2.next = 30;
358
+ _context4.next = 30;
268
359
  break;
269
360
  }
270
361
 
271
- return _context2.abrupt("return");
362
+ return _context4.abrupt("return");
272
363
 
273
364
  case 30:
274
- return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(_emoji2));
365
+ return _context4.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(_emoji2));
275
366
 
276
367
  case 31:
277
- _context2.next = 33;
368
+ _context4.next = 33;
278
369
  return this.findByEmojiId(emojiId);
279
370
 
280
371
  case 33:
281
- emoji = _context2.sent;
372
+ emoji = _context4.sent;
282
373
 
283
374
  if (emoji) {
284
- _context2.next = 36;
375
+ _context4.next = 36;
285
376
  break;
286
377
  }
287
378
 
288
- return _context2.abrupt("return");
379
+ return _context4.abrupt("return");
289
380
 
290
381
  case 36:
291
- return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(emoji));
382
+ return _context4.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(emoji));
292
383
 
293
384
  case 37:
294
385
  case "end":
295
- return _context2.stop();
386
+ return _context4.stop();
296
387
  }
297
388
  }
298
- }, _callee2, this, [[11, 23]]);
389
+ }, _callee4, this, [[11, 23]]);
299
390
  }));
300
391
 
301
392
  function fetchByEmojiId(_x3, _x4) {
@@ -429,37 +520,37 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
429
520
  }, {
430
521
  key: "getMediaEmojiDescriptionURLWithInlineToken",
431
522
  value: function () {
432
- var _getMediaEmojiDescriptionURLWithInlineToken = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(emoji) {
523
+ var _getMediaEmojiDescriptionURLWithInlineToken = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(emoji) {
433
524
  var tokenisedMediaPath;
434
- return _regenerator.default.wrap(function _callee3$(_context3) {
525
+ return _regenerator.default.wrap(function _callee5$(_context5) {
435
526
  while (1) {
436
- switch (_context3.prev = _context3.next) {
527
+ switch (_context5.prev = _context5.next) {
437
528
  case 0:
438
529
  if (!(this.siteEmojiResource && (0, _typeHelpers.isMediaRepresentation)(emoji.representation))) {
439
- _context3.next = 5;
530
+ _context5.next = 5;
440
531
  break;
441
532
  }
442
533
 
443
- _context3.next = 3;
534
+ _context5.next = 3;
444
535
  return this.siteEmojiResource.generateTokenisedMediaURL(emoji);
445
536
 
446
537
  case 3:
447
- tokenisedMediaPath = _context3.sent;
448
- return _context3.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
538
+ tokenisedMediaPath = _context5.sent;
539
+ return _context5.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
449
540
  representation: _objectSpread(_objectSpread({}, emoji.representation), {}, {
450
541
  mediaPath: tokenisedMediaPath
451
542
  })
452
543
  }));
453
544
 
454
545
  case 5:
455
- return _context3.abrupt("return", emoji);
546
+ return _context5.abrupt("return", emoji);
456
547
 
457
548
  case 6:
458
549
  case "end":
459
- return _context3.stop();
550
+ return _context5.stop();
460
551
  }
461
552
  }
462
- }, _callee3, this);
553
+ }, _callee5, this);
463
554
  }));
464
555
 
465
556
  function getMediaEmojiDescriptionURLWithInlineToken(_x5) {
@@ -35,7 +35,7 @@ var _constants = require("../../util/constants");
35
35
 
36
36
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
37
37
 
38
- var _useEmojiContext = require("../../hooks/useEmojiContext");
38
+ var _useEmoji2 = require("../../hooks/useEmoji");
39
39
 
40
40
  var _analytics2 = require("../../util/analytics/analytics");
41
41
 
@@ -104,7 +104,9 @@ var CachingMediaEmoji = function CachingMediaEmoji(props) {
104
104
  inValidImage = _useState4[0],
105
105
  setInvalidImage = _useState4[1];
106
106
 
107
- var context = (0, _useEmojiContext.useEmojiContext)();
107
+ var _useEmoji = (0, _useEmoji2.useEmoji)(),
108
+ emojiProvider = _useEmoji.emojiProvider;
109
+
108
110
  var loadEmoji = (0, _react.useCallback)(function (emojiProvider) {
109
111
  (0, _logger.default)('Loading image via media cache', emoji.shortName);
110
112
  (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.MEDIA_START);
@@ -126,10 +128,10 @@ var CachingMediaEmoji = function CachingMediaEmoji(props) {
126
128
  });
127
129
  }, [emoji]);
128
130
  (0, _react.useEffect)(function () {
129
- if (context && context.emoji.emojiProvider) {
130
- loadEmoji(context.emoji.emojiProvider);
131
+ if (emojiProvider) {
132
+ loadEmoji(emojiProvider);
131
133
  }
132
- }, [context, loadEmoji]);
134
+ }, [emojiProvider, loadEmoji]);
133
135
 
134
136
  var handleLoadError = function handleLoadError(_emojiId) {
135
137
  (0, _analytics.sampledUfoRenderedEmoji)(_emojiId).failure({
@@ -42,7 +42,8 @@ var DeleteButton = function DeleteButton(props) {
42
42
  }),
43
43
  onClick: props.onClick,
44
44
  appearance: "subtle-link",
45
- spacing: "none"
45
+ spacing: "none",
46
+ testId: "emoji-delete-button"
46
47
  }));
47
48
  };
48
49
 
@@ -180,7 +180,10 @@ var ImageEmoji = function ImageEmoji(props) {
180
180
  className = props.className,
181
181
  showTooltip = props.showTooltip,
182
182
  showDelete = props.showDelete,
183
- shouldBeInteractive = props.shouldBeInteractive;
183
+ shouldBeInteractive = props.shouldBeInteractive,
184
+ onLoadSuccess = props.onLoadSuccess,
185
+ disableLazyLoad = props.disableLazyLoad,
186
+ autoWidth = props.autoWidth;
184
187
 
185
188
  var _useInView = (0, _useInView3.useInView)({
186
189
  triggerOnce: true
@@ -221,7 +224,7 @@ var ImageEmoji = function ImageEmoji(props) {
221
224
  if (fitToHeight && width && height) {
222
225
  // Presize image, to prevent reflow due to size changes after loading
223
226
  sizing = {
224
- width: fitToHeight / height * width,
227
+ width: autoWidth ? 'auto' : fitToHeight / height * width,
225
228
  height: fitToHeight
226
229
  };
227
230
  }
@@ -230,19 +233,26 @@ var ImageEmoji = function ImageEmoji(props) {
230
233
  handleImageError(props, event);
231
234
  };
232
235
 
233
- var markStartLoadFromMountedTime = (0, _react.useCallback)(function () {
236
+ var onLoad = function onLoad() {
234
237
  var mountedMark = ufoExp.metrics.marks.find(function (mark) {
235
238
  return mark.name === _types.UfoEmojiTimings.MOUNTED_END;
236
- });
237
- ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_START, mountedMark === null || mountedMark === void 0 ? void 0 : mountedMark.time);
238
- }, [ufoExp]);
239
+ }); // onload could trigger before onBeforeLoad when emojis in viewport at start, so we need to mark onload start manually.
239
240
 
240
- var onLoad = function onLoad() {
241
- // onload could trigger before onBeforeLoad when emojis in viewport at start, so we need to mark onload start manually.
242
241
  if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.ONLOAD_START)) {
243
- markStartLoadFromMountedTime();
242
+ ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_START, mountedMark === null || mountedMark === void 0 ? void 0 : mountedMark.time);
244
243
  }
245
244
 
245
+ var loadedStartMark = ufoExp.metrics.marks.find(function (mark) {
246
+ return mark.name === _types.UfoEmojiTimings.ONLOAD_START;
247
+ });
248
+
249
+ if (mountedMark && loadedStartMark) {
250
+ ufoExp.addMetadata({
251
+ lazyLoad: loadedStartMark.time > mountedMark.time
252
+ });
253
+ } // onload_start
254
+
255
+
246
256
  if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.ONLOAD_END)) {
247
257
  ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_END);
248
258
  }
@@ -252,6 +262,10 @@ var ImageEmoji = function ImageEmoji(props) {
252
262
  IBSupported: _browserSupport.isIntersectionObserverSupported
253
263
  }
254
264
  });
265
+
266
+ if (onLoadSuccess) {
267
+ onLoadSuccess(emoji);
268
+ }
255
269
  };
256
270
 
257
271
  var onBeforeLoad = (0, _react.useCallback)(function () {
@@ -267,7 +281,7 @@ var ImageEmoji = function ImageEmoji(props) {
267
281
  }, [inView, onBeforeLoad]);
268
282
  var emojiNode = (0, _react2.jsx)("img", (0, _extends2.default)({
269
283
  //@ts-ignore
270
- loading: "lazy",
284
+ loading: disableLazyLoad ? 'eager' : 'lazy',
271
285
  src: src,
272
286
  key: src,
273
287
  alt: emoji.shortName,
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.EmojiActions = void 0;
8
+ exports.uploadEmojiTestId = exports.emojiActionsTestId = exports.default = exports.EmojiActions = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
@@ -40,12 +40,19 @@ var _styles = require("./styles");
40
40
  var _styles2 = require("../picker/styles");
41
41
 
42
42
  /** @jsx jsx */
43
+ var emojiActionsTestId = 'emoji-actions';
44
+ exports.emojiActionsTestId = emojiActionsTestId;
45
+ var uploadEmojiTestId = 'upload-emoji'; // Generic Type for the wrapped functional component
46
+
47
+ exports.uploadEmojiTestId = uploadEmojiTestId;
48
+
43
49
  var AddOwnEmoji = function AddOwnEmoji(props) {
44
50
  var onOpenUpload = props.onOpenUpload,
45
51
  uploadEnabled = props.uploadEnabled,
46
52
  formatMessage = props.intl.formatMessage;
47
53
  return (0, _react2.jsx)(_react.Fragment, null, uploadEnabled && (0, _react2.jsx)("div", {
48
- css: _styles.addCustomEmoji
54
+ css: _styles.addCustomEmoji,
55
+ "data-testid": uploadEmojiTestId
49
56
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.addCustomEmojiLabel, function (label) {
50
57
  return (0, _react2.jsx)(_standardButton.default, {
51
58
  onClick: onOpenUpload,
@@ -161,7 +168,7 @@ var EmojiActions = function EmojiActions(props) {
161
168
  }
162
169
 
163
170
  return (0, _react2.jsx)("div", {
164
- "data-testid": "emoji-actions",
171
+ "data-testid": emojiActionsTestId,
165
172
  css: previewFooterClassnames,
166
173
  onMouseLeave: onMouseLeaveHandler
167
174
  }, (0, _react2.jsx)("div", {