@atlaskit/emoji 64.7.0 → 65.1.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 (122) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cjs/api/EmojiResource.js +250 -87
  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/CachingEmoji.js +21 -3
  6. package/dist/cjs/components/common/Emoji.js +57 -36
  7. package/dist/cjs/components/common/EmojiImage.js +99 -0
  8. package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
  9. package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
  10. package/dist/cjs/components/common/ResourcedEmoji.js +14 -4
  11. package/dist/cjs/components/common/ResourcedEmojiComponent.js +173 -156
  12. package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
  13. package/dist/cjs/components/common/UploadEmoji.js +8 -3
  14. package/dist/cjs/components/common/styles.js +26 -9
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -9
  16. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
  17. package/dist/cjs/components/picker/styles.js +16 -13
  18. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  19. package/dist/cjs/components/uploader/EmojiUploadComponent.js +7 -2
  20. package/dist/cjs/context/EmojiContextProvider.js +33 -0
  21. package/dist/cjs/hooks/index.js +16 -0
  22. package/dist/cjs/index.js +20 -0
  23. package/dist/cjs/types.js +3 -0
  24. package/dist/cjs/util/analytics/samplingUfo.js +13 -3
  25. package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
  26. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
  27. package/dist/cjs/util/browser-support.js +1 -1
  28. package/dist/cjs/util/constants.js +6 -5
  29. package/dist/cjs/util/useInView.js +23 -0
  30. package/dist/cjs/version.json +1 -1
  31. package/dist/es2019/api/EmojiResource.js +117 -37
  32. package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
  33. package/dist/es2019/api/media/TokenManager.js +12 -12
  34. package/dist/es2019/components/common/CachingEmoji.js +20 -3
  35. package/dist/es2019/components/common/Emoji.js +53 -34
  36. package/dist/es2019/components/common/EmojiImage.js +74 -0
  37. package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
  38. package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
  39. package/dist/es2019/components/common/ResourcedEmoji.js +15 -5
  40. package/dist/es2019/components/common/ResourcedEmojiComponent.js +136 -105
  41. package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
  42. package/dist/es2019/components/common/UploadEmoji.js +8 -3
  43. package/dist/es2019/components/common/styles.js +30 -9
  44. package/dist/es2019/components/picker/EmojiPickerComponent.js +27 -8
  45. package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
  46. package/dist/es2019/components/picker/styles.js +16 -14
  47. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  48. package/dist/es2019/components/uploader/EmojiUploadComponent.js +7 -2
  49. package/dist/es2019/context/EmojiContextProvider.js +9 -1
  50. package/dist/es2019/hooks/index.js +8 -0
  51. package/dist/es2019/index.js +5 -4
  52. package/dist/es2019/types.js +3 -0
  53. package/dist/es2019/util/analytics/samplingUfo.js +11 -1
  54. package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
  55. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
  56. package/dist/es2019/util/browser-support.js +1 -1
  57. package/dist/es2019/util/constants.js +3 -2
  58. package/dist/es2019/util/useInView.js +12 -0
  59. package/dist/es2019/version.json +1 -1
  60. package/dist/esm/api/EmojiResource.js +257 -89
  61. package/dist/esm/api/media/SiteEmojiResource.js +5 -3
  62. package/dist/esm/api/media/TokenManager.js +13 -12
  63. package/dist/esm/components/common/CachingEmoji.js +20 -3
  64. package/dist/esm/components/common/Emoji.js +59 -38
  65. package/dist/esm/components/common/EmojiImage.js +84 -0
  66. package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
  67. package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
  68. package/dist/esm/components/common/ResourcedEmoji.js +15 -5
  69. package/dist/esm/components/common/ResourcedEmojiComponent.js +167 -156
  70. package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
  71. package/dist/esm/components/common/UploadEmoji.js +8 -3
  72. package/dist/esm/components/common/styles.js +25 -10
  73. package/dist/esm/components/picker/EmojiPickerComponent.js +27 -8
  74. package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
  75. package/dist/esm/components/picker/styles.js +16 -14
  76. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  77. package/dist/esm/components/uploader/EmojiUploadComponent.js +7 -2
  78. package/dist/esm/context/EmojiContextProvider.js +30 -1
  79. package/dist/esm/hooks/index.js +8 -0
  80. package/dist/esm/index.js +5 -4
  81. package/dist/esm/types.js +3 -0
  82. package/dist/esm/util/analytics/samplingUfo.js +13 -2
  83. package/dist/esm/util/analytics/ufoExperiences.js +14 -2
  84. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
  85. package/dist/esm/util/browser-support.js +1 -1
  86. package/dist/esm/util/constants.js +3 -2
  87. package/dist/esm/util/useInView.js +12 -0
  88. package/dist/esm/version.json +1 -1
  89. package/dist/types/api/EmojiResource.d.ts +19 -2
  90. package/dist/types/api/EmojiUtils.d.ts +7 -1
  91. package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
  92. package/dist/types/api/media/TokenManager.d.ts +1 -0
  93. package/dist/types/components/common/Emoji.d.ts +0 -1
  94. package/dist/types/components/common/EmojiImage.d.ts +13 -0
  95. package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
  96. package/dist/types/components/common/LoadingEmojiComponent.d.ts +7 -4
  97. package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
  98. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +41 -20
  99. package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
  100. package/dist/types/components/common/UploadEmoji.d.ts +1 -1
  101. package/dist/types/components/common/styles.d.ts +1 -0
  102. package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
  103. package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
  104. package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
  105. package/dist/types/components/picker/styles.d.ts +1 -1
  106. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
  107. package/dist/types/hooks/index.d.ts +1 -0
  108. package/dist/types/index.d.ts +5 -4
  109. package/dist/types/types.d.ts +14 -2
  110. package/dist/types/util/analytics/index.d.ts +1 -1
  111. package/dist/types/util/analytics/samplingUfo.d.ts +6 -6
  112. package/dist/types/util/analytics/ufoExperiences.d.ts +5 -2
  113. package/dist/types/util/constants.d.ts +2 -1
  114. package/dist/types/util/useInView.d.ts +4 -0
  115. package/docs/0-intro.tsx +35 -27
  116. package/docs/1-resourced-emoji.tsx +74 -0
  117. package/docs/2-emoji-picker.tsx +56 -0
  118. package/docs/3-typeahead.tsx +20 -0
  119. package/docs/4-emoji-provider.tsx +98 -0
  120. package/local-config-example.ts +22 -1
  121. package/package.json +4 -4
  122. package/report.api.md +1287 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 65.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`cceb3262363`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cceb3262363) - [ux] Show preview below the scrollable emoji box
8
+
9
+ ### Patch Changes
10
+
11
+ - [`641bf010d2a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/641bf010d2a) - Added JSDoc comments for exposing props
12
+ - [`c47218c565a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c47218c565a) - Convert the demo resource control to functional componment
13
+
14
+ ## 65.0.0
15
+
16
+ ### Major Changes
17
+
18
+ - [`06232e0f8dd`](https://bitbucket.org/atlassian/atlassian-frontend/commits/06232e0f8dd) - [ux] Opt In SSR for Resourced Emoji and Emoji Placeholder with EmojiResource interfaces
19
+
20
+ ### Minor Changes
21
+
22
+ - [`34155ee7563`](https://bitbucket.org/atlassian/atlassian-frontend/commits/34155ee7563) - add sampling for 2 ufo experiences to reduce volume of analytics
23
+ - [`11f56527739`](https://bitbucket.org/atlassian/atlassian-frontend/commits/11f56527739) - Export emoji placeholder class name
24
+
25
+ ### Patch Changes
26
+
27
+ - [`cd92dca3d5c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cd92dca3d5c) - minor improvements on upload emoji and add more tests
28
+ - Updated dependencies
29
+
30
+ ## 64.7.1
31
+
32
+ ### Patch Changes
33
+
34
+ - [`6e01776f0b7`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6e01776f0b7) - remove placeholder when lazy load emoji
35
+ - [`6e01776f0b7`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6e01776f0b7) - fix placeholder issue in lazy loaded emoji by removing it and re-write the anlytics tracking around it
36
+ - [`c3f9e9bce1c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c3f9e9bce1c) - Add custom information to failure and abort events for UFO experiences
37
+ - Updated dependencies
38
+
3
39
  ## 64.7.0
4
40
 
5
41
  ### Minor 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,66 +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
- }
128
- });
129
- });
130
- });
217
+ case 6:
218
+ if (!(this.emojiProviderConfig.singleEmojiApi && optimistic)) {
219
+ _context2.next = 29;
220
+ break;
221
+ }
131
222
 
132
- if ((0, _storageAvailable.default)('localStorage')) {
133
- _this.selectedTone = _this.loadStoredTone();
134
- }
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
+ }
135
240
 
136
- if (config.providers.length === 0) {
137
- throw new Error('No providers specified');
138
- }
241
+ return _context2.abrupt("return");
139
242
 
140
- return _this;
141
- }
243
+ case 15:
244
+ if (this.siteEmojiResource) {
245
+ _context2.next = 18;
246
+ break;
247
+ }
142
248
 
143
- (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
+ }, {
144
306
  key: "getProviderType",
145
307
  value: function getProviderType(provider) {
146
308
  if (provider.url.includes('/site')) {
@@ -238,11 +400,11 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
238
400
  }, {
239
401
  key: "retryIfLoading",
240
402
  value: function retryIfLoading(retry, defaultResponse) {
241
- var _this2 = this;
403
+ var _this3 = this;
242
404
 
243
405
  if (!this.isLoaded()) {
244
406
  return new Promise(function (resolve, reject) {
245
- _this2.retries.set(retry, {
407
+ _this3.retries.set(retry, {
246
408
  resolve: resolve,
247
409
  reject: reject
248
410
  });
@@ -265,40 +427,40 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
265
427
  }, {
266
428
  key: "getMediaEmojiDescriptionURLWithInlineToken",
267
429
  value: function () {
268
- 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) {
269
431
  var tokenisedMediaPath;
270
- return _regenerator.default.wrap(function _callee$(_context) {
432
+ return _regenerator.default.wrap(function _callee3$(_context3) {
271
433
  while (1) {
272
- switch (_context.prev = _context.next) {
434
+ switch (_context3.prev = _context3.next) {
273
435
  case 0:
274
436
  if (!(this.siteEmojiResource && (0, _typeHelpers.isMediaRepresentation)(emoji.representation))) {
275
- _context.next = 5;
437
+ _context3.next = 5;
276
438
  break;
277
439
  }
278
440
 
279
- _context.next = 3;
441
+ _context3.next = 3;
280
442
  return this.siteEmojiResource.generateTokenisedMediaURL(emoji);
281
443
 
282
444
  case 3:
283
- tokenisedMediaPath = _context.sent;
284
- return _context.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
445
+ tokenisedMediaPath = _context3.sent;
446
+ return _context3.abrupt("return", _objectSpread(_objectSpread({}, emoji), {}, {
285
447
  representation: _objectSpread(_objectSpread({}, emoji.representation), {}, {
286
448
  mediaPath: tokenisedMediaPath
287
449
  })
288
450
  }));
289
451
 
290
452
  case 5:
291
- return _context.abrupt("return", emoji);
453
+ return _context3.abrupt("return", emoji);
292
454
 
293
455
  case 6:
294
456
  case "end":
295
- return _context.stop();
457
+ return _context3.stop();
296
458
  }
297
459
  }
298
- }, _callee, this);
460
+ }, _callee3, this);
299
461
  }));
300
462
 
301
- function getMediaEmojiDescriptionURLWithInlineToken(_x) {
463
+ function getMediaEmojiDescriptionURLWithInlineToken(_x5) {
302
464
  return _getMediaEmojiDescriptionURLWithInlineToken.apply(this, arguments);
303
465
  }
304
466
 
@@ -352,7 +514,7 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
352
514
  }, {
353
515
  key: "findByShortName",
354
516
  value: function findByShortName(shortName) {
355
- var _this3 = this;
517
+ var _this4 = this;
356
518
 
357
519
  if (this.isLoaded()) {
358
520
  // Wait for all emoji to load before looking by shortName (to ensure correct priority)
@@ -360,13 +522,13 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
360
522
  }
361
523
 
362
524
  return this.retryIfLoading(function () {
363
- return _this3.findByShortName(shortName);
525
+ return _this4.findByShortName(shortName);
364
526
  }, undefined);
365
527
  }
366
528
  }, {
367
529
  key: "findByEmojiId",
368
530
  value: function findByEmojiId(emojiId) {
369
- var _this4 = this;
531
+ var _this5 = this;
370
532
 
371
533
  var id = emojiId.id,
372
534
  shortName = emojiId.shortName;
@@ -387,10 +549,10 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
387
549
  if (!emoji) {
388
550
  // if not, fallback to searching by shortName to
389
551
  // at least render an alternative
390
- return _this4.findByShortName(shortName);
552
+ return _this5.findByShortName(shortName);
391
553
  }
392
554
 
393
- _this4.addUnknownEmoji(emoji);
555
+ _this5.addUnknownEmoji(emoji);
394
556
 
395
557
  return emoji;
396
558
  });
@@ -407,59 +569,59 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
407
569
  }
408
570
 
409
571
  return this.retryIfLoading(function () {
410
- return _this4.findByEmojiId(emojiId);
572
+ return _this5.findByEmojiId(emojiId);
411
573
  }, undefined);
412
574
  }
413
575
  }, {
414
576
  key: "findById",
415
577
  value: function findById(id) {
416
- var _this5 = this;
578
+ var _this6 = this;
417
579
 
418
580
  if (this.isLoaded()) {
419
581
  return this.emojiRepository.findById(id);
420
582
  }
421
583
 
422
584
  return this.retryIfLoading(function () {
423
- return _this5.findById(id);
585
+ return _this6.findById(id);
424
586
  }, undefined);
425
587
  }
426
588
  }, {
427
589
  key: "findInCategory",
428
590
  value: function findInCategory(categoryId) {
429
- var _this6 = this;
591
+ var _this7 = this;
430
592
 
431
593
  if (this.isLoaded()) {
432
594
  return Promise.resolve(this.emojiRepository.findInCategory(categoryId));
433
595
  }
434
596
 
435
597
  return this.retryIfLoading(function () {
436
- return _this6.findInCategory(categoryId);
598
+ return _this7.findInCategory(categoryId);
437
599
  }, []);
438
600
  }
439
601
  }, {
440
602
  key: "getAsciiMap",
441
603
  value: function getAsciiMap() {
442
- var _this7 = this;
604
+ var _this8 = this;
443
605
 
444
606
  if (this.isLoaded()) {
445
607
  return Promise.resolve(this.emojiRepository.getAsciiMap());
446
608
  }
447
609
 
448
610
  return this.retryIfLoading(function () {
449
- return _this7.getAsciiMap();
611
+ return _this8.getAsciiMap();
450
612
  }, new Map());
451
613
  }
452
614
  }, {
453
615
  key: "getFrequentlyUsed",
454
616
  value: function getFrequentlyUsed(options) {
455
- var _this8 = this;
617
+ var _this9 = this;
456
618
 
457
619
  if (this.isLoaded()) {
458
620
  return Promise.resolve(this.emojiRepository.getFrequentlyUsed(options));
459
621
  }
460
622
 
461
623
  return this.retryIfLoading(function () {
462
- return _this8.getFrequentlyUsed(options);
624
+ return _this9.getFrequentlyUsed(options);
463
625
  }, []);
464
626
  }
465
627
  /**
@@ -497,12 +659,12 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
497
659
  }, {
498
660
  key: "deleteSiteEmoji",
499
661
  value: function deleteSiteEmoji(emoji) {
500
- var _this9 = this;
662
+ var _this10 = this;
501
663
 
502
664
  if (this.siteEmojiResource && emoji.id) {
503
665
  return this.siteEmojiResource.deleteEmoji(emoji).then(function (success) {
504
- if (success && _this9.emojiRepository) {
505
- _this9.emojiRepository.delete(emoji);
666
+ if (success && _this10.emojiRepository) {
667
+ _this10.emojiRepository.delete(emoji);
506
668
 
507
669
  return true;
508
670
  }
@@ -516,7 +678,7 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
516
678
  }
517
679
 
518
680
  return this.retryIfLoading(function () {
519
- return _this9.deleteSiteEmoji(emoji);
681
+ return _this10.deleteSiteEmoji(emoji);
520
682
  }, false);
521
683
  }
522
684
  }, {
@@ -545,14 +707,14 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
545
707
  }, {
546
708
  key: "calculateDynamicCategories",
547
709
  value: function calculateDynamicCategories() {
548
- var _this10 = this;
710
+ var _this11 = this;
549
711
 
550
712
  if (this.isLoaded()) {
551
713
  return Promise.resolve(this.emojiRepository.getDynamicCategoryList());
552
714
  }
553
715
 
554
716
  return this.retryIfLoading(function () {
555
- return _this10.calculateDynamicCategories();
717
+ return _this11.calculateDynamicCategories();
556
718
  }, []);
557
719
  }
558
720
  }, {
@@ -579,18 +741,18 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
579
741
  var _super2 = _createSuper(UploadingEmojiResource);
580
742
 
581
743
  function UploadingEmojiResource(config) {
582
- var _this11;
744
+ var _this12;
583
745
 
584
746
  (0, _classCallCheck2.default)(this, UploadingEmojiResource);
585
- _this11 = _super2.call(this, config);
586
- _this11.allowUpload = !!config.allowUpload;
587
- return _this11;
747
+ _this12 = _super2.call(this, config);
748
+ _this12.allowUpload = !!config.allowUpload;
749
+ return _this12;
588
750
  }
589
751
 
590
752
  (0, _createClass2.default)(UploadingEmojiResource, [{
591
753
  key: "isUploadSupported",
592
754
  value: function isUploadSupported() {
593
- var _this12 = this;
755
+ var _this13 = this;
594
756
 
595
757
  if (!this.allowUpload) {
596
758
  return Promise.resolve(false);
@@ -601,23 +763,24 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
601
763
  }
602
764
 
603
765
  return this.retryIfLoading(function () {
604
- return _this12.isUploadSupported();
766
+ return _this13.isUploadSupported();
605
767
  }, false);
606
768
  }
607
769
  }, {
608
770
  key: "uploadCustomEmoji",
609
771
  value: function uploadCustomEmoji(upload) {
610
- var _this13 = this;
772
+ var _this14 = this;
611
773
 
774
+ var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
612
775
  return this.isUploadSupported().then(function (supported) {
613
- if (!supported || !_this13.siteEmojiResource) {
776
+ if (!supported || !_this14.siteEmojiResource) {
614
777
  return Promise.reject('No media api support is configured');
615
778
  }
616
779
 
617
- return _this13.siteEmojiResource.uploadEmoji(upload).then(function (emoji) {
618
- _this13.addUnknownEmoji(emoji);
780
+ return _this14.siteEmojiResource.uploadEmoji(upload, retry).then(function (emoji) {
781
+ _this14.addUnknownEmoji(emoji);
619
782
 
620
- _this13.refreshLastFilter();
783
+ _this14.refreshLastFilter();
621
784
 
622
785
  return emoji;
623
786
  });
@@ -626,14 +789,14 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
626
789
  }, {
627
790
  key: "prepareForUpload",
628
791
  value: function prepareForUpload() {
629
- var _this14 = this;
792
+ var _this15 = this;
630
793
 
631
794
  if (this.siteEmojiResource) {
632
795
  this.siteEmojiResource.prepareForUpload();
633
796
  }
634
797
 
635
798
  return this.retryIfLoading(function () {
636
- return _this14.prepareForUpload();
799
+ return _this15.prepareForUpload();
637
800
  }, undefined);
638
801
  }
639
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
  }