@atlaskit/emoji 64.7.1 → 65.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 (68) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/api/EmojiResource.js +250 -91
  3. package/dist/cjs/api/media/SiteEmojiResource.js +4 -2
  4. package/dist/cjs/api/media/TokenManager.js +13 -12
  5. package/dist/cjs/components/common/EmojiImage.js +99 -0
  6. package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
  7. package/dist/cjs/components/common/ResourcedEmoji.js +1 -1
  8. package/dist/cjs/components/common/ResourcedEmojiComponent.js +159 -165
  9. package/dist/cjs/components/common/UploadEmoji.js +3 -14
  10. package/dist/cjs/components/common/styles.js +26 -9
  11. package/dist/cjs/components/picker/EmojiPickerComponent.js +3 -3
  12. package/dist/cjs/components/uploader/EmojiUploadComponent.js +1 -1
  13. package/dist/cjs/context/EmojiContextProvider.js +33 -0
  14. package/dist/cjs/index.js +20 -0
  15. package/dist/cjs/types.js +1 -0
  16. package/dist/cjs/util/analytics/samplingUfo.js +13 -3
  17. package/dist/cjs/version.json +1 -1
  18. package/dist/es2019/api/EmojiResource.js +116 -40
  19. package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
  20. package/dist/es2019/api/media/TokenManager.js +12 -12
  21. package/dist/es2019/components/common/EmojiImage.js +74 -0
  22. package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
  23. package/dist/es2019/components/common/ResourcedEmoji.js +1 -1
  24. package/dist/es2019/components/common/ResourcedEmojiComponent.js +117 -104
  25. package/dist/es2019/components/common/UploadEmoji.js +3 -7
  26. package/dist/es2019/components/common/styles.js +30 -9
  27. package/dist/es2019/components/picker/EmojiPickerComponent.js +2 -2
  28. package/dist/es2019/components/uploader/EmojiUploadComponent.js +1 -1
  29. package/dist/es2019/context/EmojiContextProvider.js +9 -1
  30. package/dist/es2019/index.js +5 -4
  31. package/dist/es2019/types.js +1 -0
  32. package/dist/es2019/util/analytics/samplingUfo.js +11 -1
  33. package/dist/es2019/version.json +1 -1
  34. package/dist/esm/api/EmojiResource.js +257 -93
  35. package/dist/esm/api/media/SiteEmojiResource.js +5 -3
  36. package/dist/esm/api/media/TokenManager.js +13 -12
  37. package/dist/esm/components/common/EmojiImage.js +84 -0
  38. package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
  39. package/dist/esm/components/common/ResourcedEmoji.js +1 -1
  40. package/dist/esm/components/common/ResourcedEmojiComponent.js +155 -165
  41. package/dist/esm/components/common/UploadEmoji.js +3 -12
  42. package/dist/esm/components/common/styles.js +25 -10
  43. package/dist/esm/components/picker/EmojiPickerComponent.js +2 -2
  44. package/dist/esm/components/uploader/EmojiUploadComponent.js +1 -1
  45. package/dist/esm/context/EmojiContextProvider.js +30 -1
  46. package/dist/esm/index.js +5 -4
  47. package/dist/esm/types.js +1 -0
  48. package/dist/esm/util/analytics/samplingUfo.js +13 -2
  49. package/dist/esm/version.json +1 -1
  50. package/dist/types/api/EmojiResource.d.ts +20 -2
  51. package/dist/types/api/EmojiUtils.d.ts +7 -1
  52. package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
  53. package/dist/types/api/media/TokenManager.d.ts +1 -0
  54. package/dist/types/components/common/EmojiImage.d.ts +13 -0
  55. package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
  56. package/dist/types/components/common/LoadingEmojiComponent.d.ts +4 -4
  57. package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
  58. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +21 -12
  59. package/dist/types/components/common/UploadEmoji.d.ts +1 -1
  60. package/dist/types/components/common/styles.d.ts +1 -0
  61. package/dist/types/index.d.ts +5 -4
  62. package/dist/types/types.d.ts +12 -2
  63. package/dist/types/util/analytics/index.d.ts +1 -1
  64. package/dist/types/util/analytics/samplingUfo.d.ts +1 -8
  65. package/dist/types/util/analytics/ufoExperiences.d.ts +2 -2
  66. package/local-config-example.ts +22 -1
  67. package/package.json +4 -4
  68. package/report.api.md +1287 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 65.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [`06232e0f8dd`](https://bitbucket.org/atlassian/atlassian-frontend/commits/06232e0f8dd) - [ux] Opt In SSR for Resourced Emoji and Emoji Placeholder with EmojiResource interfaces
8
+
9
+ ### Minor Changes
10
+
11
+ - [`34155ee7563`](https://bitbucket.org/atlassian/atlassian-frontend/commits/34155ee7563) - add sampling for 2 ufo experiences to reduce volume of analytics
12
+ - [`11f56527739`](https://bitbucket.org/atlassian/atlassian-frontend/commits/11f56527739) - Export emoji placeholder class name
13
+
14
+ ### Patch Changes
15
+
16
+ - [`cd92dca3d5c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cd92dca3d5c) - minor improvements on upload emoji and add more tests
17
+ - Updated dependencies
18
+
3
19
  ## 64.7.1
4
20
 
5
21
  ### Patch Changes
@@ -45,7 +45,7 @@ var _EmojiRepository = _interopRequireDefault(require("./EmojiRepository"));
45
45
 
46
46
  var _SiteEmojiResource = _interopRequireDefault(require("./media/SiteEmojiResource"));
47
47
 
48
- var _analytics = require("../util/analytics");
48
+ var _ufoExperiences = require("../util/analytics/ufoExperiences");
49
49
 
50
50
  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; }
51
51
 
@@ -81,70 +81,228 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
81
81
  _this = _super.call(this);
82
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "activeLoaders", 0);
83
83
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "retries", new Map());
84
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isInitialised", false);
85
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getOptimisticImageURL", function (emojiId) {
86
+ if (_this.emojiProviderConfig.optimisticImageApi) {
87
+ return _this.emojiProviderConfig.optimisticImageApi.getUrl(emojiId);
88
+ }
89
+
90
+ return;
91
+ });
84
92
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isLoaded", function () {
85
93
  return _this.activeLoaders === 0 && _this.emojiRepository;
86
94
  });
95
+ _this.emojiProviderConfig = config;
87
96
  _this.recordConfig = config.recordConfig;
88
- _this.currentUser = config.currentUser; // Ensure order is retained by tracking until all done.
97
+ _this.currentUser = config.currentUser;
89
98
 
90
- var emojiResponses = [];
91
- _this.activeLoaders = config.providers.length;
92
- config.providers.forEach(function (provider, index) {
93
- var providerType = _this.getProviderType(provider);
99
+ if ((0, _storageAvailable.default)('localStorage')) {
100
+ _this.selectedTone = _this.loadStoredTone();
101
+ }
94
102
 
95
- _analytics.ufoExperiences['emoji-resource-fetched'].getInstance(providerType).start();
103
+ if (config.providers.length === 0) {
104
+ throw new Error('No providers specified');
105
+ }
96
106
 
97
- _analytics.ufoExperiences['emoji-resource-fetched'].getInstance(providerType).addMetadata({
98
- type: providerType
99
- });
107
+ return _this;
108
+ }
100
109
 
101
- var loader = new _EmojiLoader.default(provider);
102
- var emojis = loader.loadEmoji();
103
- emojis.then(function (emojiResponse) {
104
- emojiResponses[index] = emojiResponse;
110
+ (0, _createClass2.default)(EmojiResource, [{
111
+ key: "fetchEmojiProvider",
112
+ value: function fetchEmojiProvider(force) {
113
+ var _this2 = this;
105
114
 
106
- _this.initEmojiRepository(emojiResponses);
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
+ data: {
167
+ providerUrl: provider.url
168
+ }
169
+ }
170
+ });
171
+ });
172
+
173
+ case 7:
174
+ case "end":
175
+ return _context.stop();
176
+ }
177
+ }
178
+ }, _callee);
179
+ }));
180
+
181
+ return function (_x, _x2) {
182
+ return _ref.apply(this, arguments);
183
+ };
184
+ }());
185
+ }
107
186
 
108
- _this.initSiteEmojiResource(emojiResponse, provider).then(function () {
109
- _this.activeLoaders--;
187
+ return Promise.resolve(this.emojiRepository);
188
+ }
189
+ }, {
190
+ key: "fetchByEmojiId",
191
+ value: function () {
192
+ var _fetchByEmojiId = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(emojiId, optimistic) {
193
+ var _emoji, provider, loader, loadEmoji, _emoji2, emoji;
110
194
 
111
- _this.performRetries();
195
+ return _regenerator.default.wrap(function _callee2$(_context2) {
196
+ while (1) {
197
+ switch (_context2.prev = _context2.next) {
198
+ case 0:
199
+ if (!(this.emojiRepository && this.isLoaded())) {
200
+ _context2.next = 6;
201
+ break;
202
+ }
112
203
 
113
- _this.refreshLastFilter(); // if not site emoji it would still resolve
114
- // TODO: improve the logic in future
204
+ _context2.next = 3;
205
+ return this.findByEmojiId(emojiId);
115
206
 
207
+ case 3:
208
+ _emoji = _context2.sent;
116
209
 
117
- _analytics.ufoExperiences['emoji-resource-fetched'].getInstance(providerType).success();
118
- });
119
- }).catch(function (reason) {
120
- _this.activeLoaders--;
210
+ if (!_emoji) {
211
+ _context2.next = 6;
212
+ break;
213
+ }
121
214
 
122
- _this.notifyError(reason);
215
+ return _context2.abrupt("return", Promise.resolve(this.getMediaEmojiDescriptionURLWithInlineToken(_emoji)));
123
216
 
124
- _analytics.ufoExperiences['emoji-resource-fetched'].getInstance(providerType).failure({
125
- metadata: {
126
- reason: reason,
127
- source: 'EmojiProvider',
128
- data: {
129
- providerUrl: provider.url
130
- }
131
- }
132
- });
133
- });
134
- });
217
+ case 6:
218
+ if (!(this.emojiProviderConfig.singleEmojiApi && optimistic)) {
219
+ _context2.next = 29;
220
+ break;
221
+ }
135
222
 
136
- if ((0, _storageAvailable.default)('localStorage')) {
137
- _this.selectedTone = _this.loadStoredTone();
138
- }
223
+ // if config has singleEmojiApi then fetch single emoji
224
+ provider = {
225
+ url: this.emojiProviderConfig.singleEmojiApi.getUrl(emojiId),
226
+ securityProvider: this.emojiProviderConfig.singleEmojiApi.securityProvider
227
+ };
228
+ loader = new _EmojiLoader.default(provider);
229
+ _context2.prev = 9;
230
+ _context2.next = 12;
231
+ return loader.loadEmoji();
232
+
233
+ case 12:
234
+ loadEmoji = _context2.sent;
235
+
236
+ if (loadEmoji.emojis[0]) {
237
+ _context2.next = 15;
238
+ break;
239
+ }
139
240
 
140
- if (config.providers.length === 0) {
141
- throw new Error('No providers specified');
142
- }
241
+ return _context2.abrupt("return");
143
242
 
144
- return _this;
145
- }
243
+ case 15:
244
+ if (this.siteEmojiResource) {
245
+ _context2.next = 18;
246
+ break;
247
+ }
146
248
 
147
- (0, _createClass2.default)(EmojiResource, [{
249
+ _context2.next = 18;
250
+ return this.initSiteEmojiResource(loadEmoji, provider);
251
+
252
+ case 18:
253
+ return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(loadEmoji.emojis[0]));
254
+
255
+ case 21:
256
+ _context2.prev = 21;
257
+ _context2.t0 = _context2["catch"](9);
258
+ _context2.next = 25;
259
+ return this.findByEmojiId(emojiId);
260
+
261
+ case 25:
262
+ _emoji2 = _context2.sent;
263
+
264
+ if (_emoji2) {
265
+ _context2.next = 28;
266
+ break;
267
+ }
268
+
269
+ return _context2.abrupt("return");
270
+
271
+ case 28:
272
+ return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(_emoji2));
273
+
274
+ case 29:
275
+ _context2.next = 31;
276
+ return this.findByEmojiId(emojiId);
277
+
278
+ case 31:
279
+ emoji = _context2.sent;
280
+
281
+ if (emoji) {
282
+ _context2.next = 34;
283
+ break;
284
+ }
285
+
286
+ return _context2.abrupt("return");
287
+
288
+ case 34:
289
+ return _context2.abrupt("return", this.getMediaEmojiDescriptionURLWithInlineToken(emoji));
290
+
291
+ case 35:
292
+ case "end":
293
+ return _context2.stop();
294
+ }
295
+ }
296
+ }, _callee2, this, [[9, 21]]);
297
+ }));
298
+
299
+ function fetchByEmojiId(_x3, _x4) {
300
+ return _fetchByEmojiId.apply(this, arguments);
301
+ }
302
+
303
+ return fetchByEmojiId;
304
+ }()
305
+ }, {
148
306
  key: "getProviderType",
149
307
  value: function getProviderType(provider) {
150
308
  if (provider.url.includes('/site')) {
@@ -242,11 +400,11 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
242
400
  }, {
243
401
  key: "retryIfLoading",
244
402
  value: function retryIfLoading(retry, defaultResponse) {
245
- var _this2 = this;
403
+ var _this3 = this;
246
404
 
247
405
  if (!this.isLoaded()) {
248
406
  return new Promise(function (resolve, reject) {
249
- _this2.retries.set(retry, {
407
+ _this3.retries.set(retry, {
250
408
  resolve: resolve,
251
409
  reject: reject
252
410
  });
@@ -269,40 +427,40 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
269
427
  }, {
270
428
  key: "getMediaEmojiDescriptionURLWithInlineToken",
271
429
  value: function () {
272
- var _getMediaEmojiDescriptionURLWithInlineToken = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(emoji) {
430
+ var _getMediaEmojiDescriptionURLWithInlineToken = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(emoji) {
273
431
  var tokenisedMediaPath;
274
- return _regenerator.default.wrap(function _callee$(_context) {
432
+ return _regenerator.default.wrap(function _callee3$(_context3) {
275
433
  while (1) {
276
- switch (_context.prev = _context.next) {
434
+ switch (_context3.prev = _context3.next) {
277
435
  case 0:
278
436
  if (!(this.siteEmojiResource && (0, _typeHelpers.isMediaRepresentation)(emoji.representation))) {
279
- _context.next = 5;
437
+ _context3.next = 5;
280
438
  break;
281
439
  }
282
440
 
283
- _context.next = 3;
441
+ _context3.next = 3;
284
442
  return this.siteEmojiResource.generateTokenisedMediaURL(emoji);
285
443
 
286
444
  case 3:
287
- tokenisedMediaPath = _context.sent;
288
- return _context.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
445
+ tokenisedMediaPath = _context3.sent;
446
+ return _context3.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
289
447
  representation: _objectSpread(_objectSpread({}, emoji.representation), {}, {
290
448
  mediaPath: tokenisedMediaPath
291
449
  })
292
450
  }));
293
451
 
294
452
  case 5:
295
- return _context.abrupt("return", emoji);
453
+ return _context3.abrupt("return", emoji);
296
454
 
297
455
  case 6:
298
456
  case "end":
299
- return _context.stop();
457
+ return _context3.stop();
300
458
  }
301
459
  }
302
- }, _callee, this);
460
+ }, _callee3, this);
303
461
  }));
304
462
 
305
- function getMediaEmojiDescriptionURLWithInlineToken(_x) {
463
+ function getMediaEmojiDescriptionURLWithInlineToken(_x5) {
306
464
  return _getMediaEmojiDescriptionURLWithInlineToken.apply(this, arguments);
307
465
  }
308
466
 
@@ -356,7 +514,7 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
356
514
  }, {
357
515
  key: "findByShortName",
358
516
  value: function findByShortName(shortName) {
359
- var _this3 = this;
517
+ var _this4 = this;
360
518
 
361
519
  if (this.isLoaded()) {
362
520
  // Wait for all emoji to load before looking by shortName (to ensure correct priority)
@@ -364,13 +522,13 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
364
522
  }
365
523
 
366
524
  return this.retryIfLoading(function () {
367
- return _this3.findByShortName(shortName);
525
+ return _this4.findByShortName(shortName);
368
526
  }, undefined);
369
527
  }
370
528
  }, {
371
529
  key: "findByEmojiId",
372
530
  value: function findByEmojiId(emojiId) {
373
- var _this4 = this;
531
+ var _this5 = this;
374
532
 
375
533
  var id = emojiId.id,
376
534
  shortName = emojiId.shortName;
@@ -391,10 +549,10 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
391
549
  if (!emoji) {
392
550
  // if not, fallback to searching by shortName to
393
551
  // at least render an alternative
394
- return _this4.findByShortName(shortName);
552
+ return _this5.findByShortName(shortName);
395
553
  }
396
554
 
397
- _this4.addUnknownEmoji(emoji);
555
+ _this5.addUnknownEmoji(emoji);
398
556
 
399
557
  return emoji;
400
558
  });
@@ -411,59 +569,59 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
411
569
  }
412
570
 
413
571
  return this.retryIfLoading(function () {
414
- return _this4.findByEmojiId(emojiId);
572
+ return _this5.findByEmojiId(emojiId);
415
573
  }, undefined);
416
574
  }
417
575
  }, {
418
576
  key: "findById",
419
577
  value: function findById(id) {
420
- var _this5 = this;
578
+ var _this6 = this;
421
579
 
422
580
  if (this.isLoaded()) {
423
581
  return this.emojiRepository.findById(id);
424
582
  }
425
583
 
426
584
  return this.retryIfLoading(function () {
427
- return _this5.findById(id);
585
+ return _this6.findById(id);
428
586
  }, undefined);
429
587
  }
430
588
  }, {
431
589
  key: "findInCategory",
432
590
  value: function findInCategory(categoryId) {
433
- var _this6 = this;
591
+ var _this7 = this;
434
592
 
435
593
  if (this.isLoaded()) {
436
594
  return Promise.resolve(this.emojiRepository.findInCategory(categoryId));
437
595
  }
438
596
 
439
597
  return this.retryIfLoading(function () {
440
- return _this6.findInCategory(categoryId);
598
+ return _this7.findInCategory(categoryId);
441
599
  }, []);
442
600
  }
443
601
  }, {
444
602
  key: "getAsciiMap",
445
603
  value: function getAsciiMap() {
446
- var _this7 = this;
604
+ var _this8 = this;
447
605
 
448
606
  if (this.isLoaded()) {
449
607
  return Promise.resolve(this.emojiRepository.getAsciiMap());
450
608
  }
451
609
 
452
610
  return this.retryIfLoading(function () {
453
- return _this7.getAsciiMap();
611
+ return _this8.getAsciiMap();
454
612
  }, new Map());
455
613
  }
456
614
  }, {
457
615
  key: "getFrequentlyUsed",
458
616
  value: function getFrequentlyUsed(options) {
459
- var _this8 = this;
617
+ var _this9 = this;
460
618
 
461
619
  if (this.isLoaded()) {
462
620
  return Promise.resolve(this.emojiRepository.getFrequentlyUsed(options));
463
621
  }
464
622
 
465
623
  return this.retryIfLoading(function () {
466
- return _this8.getFrequentlyUsed(options);
624
+ return _this9.getFrequentlyUsed(options);
467
625
  }, []);
468
626
  }
469
627
  /**
@@ -501,12 +659,12 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
501
659
  }, {
502
660
  key: "deleteSiteEmoji",
503
661
  value: function deleteSiteEmoji(emoji) {
504
- var _this9 = this;
662
+ var _this10 = this;
505
663
 
506
664
  if (this.siteEmojiResource && emoji.id) {
507
665
  return this.siteEmojiResource.deleteEmoji(emoji).then(function (success) {
508
- if (success && _this9.emojiRepository) {
509
- _this9.emojiRepository.delete(emoji);
666
+ if (success && _this10.emojiRepository) {
667
+ _this10.emojiRepository.delete(emoji);
510
668
 
511
669
  return true;
512
670
  }
@@ -520,7 +678,7 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
520
678
  }
521
679
 
522
680
  return this.retryIfLoading(function () {
523
- return _this9.deleteSiteEmoji(emoji);
681
+ return _this10.deleteSiteEmoji(emoji);
524
682
  }, false);
525
683
  }
526
684
  }, {
@@ -549,14 +707,14 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
549
707
  }, {
550
708
  key: "calculateDynamicCategories",
551
709
  value: function calculateDynamicCategories() {
552
- var _this10 = this;
710
+ var _this11 = this;
553
711
 
554
712
  if (this.isLoaded()) {
555
713
  return Promise.resolve(this.emojiRepository.getDynamicCategoryList());
556
714
  }
557
715
 
558
716
  return this.retryIfLoading(function () {
559
- return _this10.calculateDynamicCategories();
717
+ return _this11.calculateDynamicCategories();
560
718
  }, []);
561
719
  }
562
720
  }, {
@@ -583,18 +741,18 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
583
741
  var _super2 = _createSuper(UploadingEmojiResource);
584
742
 
585
743
  function UploadingEmojiResource(config) {
586
- var _this11;
744
+ var _this12;
587
745
 
588
746
  (0, _classCallCheck2.default)(this, UploadingEmojiResource);
589
- _this11 = _super2.call(this, config);
590
- _this11.allowUpload = !!config.allowUpload;
591
- return _this11;
747
+ _this12 = _super2.call(this, config);
748
+ _this12.allowUpload = !!config.allowUpload;
749
+ return _this12;
592
750
  }
593
751
 
594
752
  (0, _createClass2.default)(UploadingEmojiResource, [{
595
753
  key: "isUploadSupported",
596
754
  value: function isUploadSupported() {
597
- var _this12 = this;
755
+ var _this13 = this;
598
756
 
599
757
  if (!this.allowUpload) {
600
758
  return Promise.resolve(false);
@@ -605,23 +763,24 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
605
763
  }
606
764
 
607
765
  return this.retryIfLoading(function () {
608
- return _this12.isUploadSupported();
766
+ return _this13.isUploadSupported();
609
767
  }, false);
610
768
  }
611
769
  }, {
612
770
  key: "uploadCustomEmoji",
613
771
  value: function uploadCustomEmoji(upload) {
614
- var _this13 = this;
772
+ var _this14 = this;
615
773
 
774
+ var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
616
775
  return this.isUploadSupported().then(function (supported) {
617
- if (!supported || !_this13.siteEmojiResource) {
776
+ if (!supported || !_this14.siteEmojiResource) {
618
777
  return Promise.reject('No media api support is configured');
619
778
  }
620
779
 
621
- return _this13.siteEmojiResource.uploadEmoji(upload).then(function (emoji) {
622
- _this13.addUnknownEmoji(emoji);
780
+ return _this14.siteEmojiResource.uploadEmoji(upload, retry).then(function (emoji) {
781
+ _this14.addUnknownEmoji(emoji);
623
782
 
624
- _this13.refreshLastFilter();
783
+ _this14.refreshLastFilter();
625
784
 
626
785
  return emoji;
627
786
  });
@@ -630,14 +789,14 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
630
789
  }, {
631
790
  key: "prepareForUpload",
632
791
  value: function prepareForUpload() {
633
- var _this14 = this;
792
+ var _this15 = this;
634
793
 
635
794
  if (this.siteEmojiResource) {
636
795
  this.siteEmojiResource.prepareForUpload();
637
796
  }
638
797
 
639
798
  return this.retryIfLoading(function () {
640
- return _this14.prepareForUpload();
799
+ return _this15.prepareForUpload();
641
800
  }, undefined);
642
801
  }
643
802
  }]);
@@ -177,11 +177,13 @@ var SiteEmojiResource = /*#__PURE__*/function () {
177
177
  }
178
178
  }, {
179
179
  key: "uploadEmoji",
180
- value: function uploadEmoji(upload, progressCallback) {
180
+ value: function uploadEmoji(upload) {
181
181
  var _this2 = this;
182
182
 
183
+ var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
184
+ var progressCallback = arguments.length > 2 ? arguments[2] : undefined;
183
185
  var startTime = Date.now();
184
- return this.tokenManager.getToken('upload').then(function (uploadToken) {
186
+ return this.tokenManager.getToken('upload', retry).then(function (uploadToken) {
185
187
  var tokenLoadTime = Date.now() - startTime;
186
188
  (0, _logger.default)('upload token load time', tokenLoadTime);
187
189
  return new Promise(function (resolve, reject) {
@@ -36,6 +36,13 @@ var TokenManager = /*#__PURE__*/function () {
36
36
 
37
37
  return false;
38
38
  }
39
+ }, {
40
+ key: "fetchNewToken",
41
+ value: function fetchNewToken(type) {
42
+ return _utilServiceSupport.utils.requestService(this.siteServiceConfig, {
43
+ path: "token/".concat(type)
44
+ });
45
+ }
39
46
  }, {
40
47
  key: "addToken",
41
48
  value: function addToken(type, mediaApiToken) {
@@ -64,22 +71,16 @@ var TokenManager = /*#__PURE__*/function () {
64
71
  }
65
72
 
66
73
  if (activeTokenRefresh) {
67
- // refresh already active, return that
74
+ // refresh token promise already active, return that
68
75
  return activeTokenRefresh;
69
- } // clear expired token
70
-
71
-
72
- tokenDetail.mediaApiToken = undefined;
73
- }
76
+ }
77
+ } // request a new token and track the promise for future requests until completed
74
78
 
75
- var path = "token/".concat(type); // request a new token and track the promise for future requests until completed
76
79
 
77
- tokenDetail.activeTokenRefresh = _utilServiceSupport.utils.requestService(this.siteServiceConfig, {
78
- path: path
79
- }).then(function (mediaApiToken) {
80
+ tokenDetail.activeTokenRefresh = this.fetchNewToken(type).then(function (token) {
81
+ tokenDetail.mediaApiToken = token;
80
82
  tokenDetail.activeTokenRefresh = undefined;
81
- tokenDetail.mediaApiToken = mediaApiToken;
82
- return mediaApiToken;
83
+ return token;
83
84
  });
84
85
  return tokenDetail.activeTokenRefresh;
85
86
  }