@atlaskit/emoji 64.2.0 → 64.4.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 (184) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cjs/api/EmojiResource.js +36 -1
  3. package/dist/cjs/api/media/SiteEmojiResource.js +10 -2
  4. package/dist/cjs/components/common/CachingEmoji.js +38 -12
  5. package/dist/cjs/components/common/DeleteButton.js +9 -13
  6. package/dist/cjs/components/common/Emoji.js +25 -36
  7. package/dist/cjs/components/common/EmojiActions.js +26 -31
  8. package/dist/cjs/components/common/EmojiButton.js +7 -7
  9. package/dist/cjs/components/common/EmojiDeletePreview.js +20 -26
  10. package/dist/cjs/components/common/EmojiErrorMessage.js +10 -14
  11. package/dist/cjs/components/common/EmojiPlaceholder.js +5 -12
  12. package/dist/cjs/components/common/EmojiPreview.js +20 -40
  13. package/dist/cjs/components/common/EmojiPreviewComponent.js +34 -0
  14. package/dist/cjs/components/common/EmojiUploadPicker.js +26 -24
  15. package/dist/cjs/components/common/EmojiUploadPreview.js +22 -28
  16. package/dist/cjs/components/common/RecordSelectionDefault.js +8 -2
  17. package/dist/cjs/components/common/ResourcedEmoji.js +25 -9
  18. package/dist/cjs/components/common/ResourcedEmojiComponent.js +33 -11
  19. package/dist/cjs/components/common/RetryableButton.js +12 -18
  20. package/dist/cjs/components/common/Scrollable.js +5 -10
  21. package/dist/cjs/components/common/UfoErrorBoundary.js +52 -0
  22. package/dist/cjs/components/common/UploadEmoji.js +8 -0
  23. package/dist/cjs/components/common/styles.js +210 -266
  24. package/dist/cjs/components/picker/CategorySelector.js +13 -12
  25. package/dist/cjs/components/picker/EmojiPicker.js +17 -6
  26. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +8 -14
  27. package/dist/cjs/components/picker/EmojiPickerComponent.js +51 -30
  28. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +8 -12
  29. package/dist/cjs/components/picker/EmojiPickerFooter.js +8 -14
  30. package/dist/cjs/components/picker/EmojiPickerList.js +28 -9
  31. package/dist/cjs/components/picker/EmojiPickerListSearch.js +10 -8
  32. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +9 -15
  33. package/dist/cjs/components/picker/styles.js +113 -161
  34. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +40 -24
  35. package/dist/cjs/components/typeahead/EmojiTypeAheadItem.js +10 -13
  36. package/dist/cjs/components/typeahead/EmojiTypeAheadList.js +17 -22
  37. package/dist/cjs/components/typeahead/styles.js +17 -19
  38. package/dist/cjs/components/uploader/EmojiUploadComponent.js +22 -15
  39. package/dist/cjs/components/uploader/styles.js +4 -4
  40. package/dist/cjs/index.js +9 -3
  41. package/dist/cjs/types.js +12 -2
  42. package/dist/cjs/util/{analytics.js → analytics/analytics.js} +12 -10
  43. package/dist/cjs/util/analytics/index.js +205 -0
  44. package/dist/cjs/util/analytics/samplingUfo.js +278 -0
  45. package/dist/cjs/util/analytics/ufoExperiences.js +46 -0
  46. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +49 -0
  47. package/dist/cjs/util/constants.js +10 -3
  48. package/dist/cjs/version.json +1 -1
  49. package/dist/es2019/api/EmojiResource.js +28 -1
  50. package/dist/es2019/api/media/SiteEmojiResource.js +10 -2
  51. package/dist/es2019/components/common/CachingEmoji.js +34 -12
  52. package/dist/es2019/components/common/DeleteButton.js +8 -6
  53. package/dist/es2019/components/common/Emoji.js +27 -36
  54. package/dist/es2019/components/common/EmojiActions.js +26 -24
  55. package/dist/es2019/components/common/EmojiButton.js +6 -6
  56. package/dist/es2019/components/common/EmojiDeletePreview.js +20 -20
  57. package/dist/es2019/components/common/EmojiErrorMessage.js +9 -8
  58. package/dist/es2019/components/common/EmojiPlaceholder.js +5 -8
  59. package/dist/es2019/components/common/EmojiPreview.js +19 -35
  60. package/dist/es2019/components/common/EmojiPreviewComponent.js +21 -0
  61. package/dist/es2019/components/common/EmojiUploadPicker.js +25 -22
  62. package/dist/es2019/components/common/EmojiUploadPreview.js +22 -22
  63. package/dist/es2019/components/common/RecordSelectionDefault.js +9 -2
  64. package/dist/es2019/components/common/ResourcedEmoji.js +22 -5
  65. package/dist/es2019/components/common/ResourcedEmojiComponent.js +32 -11
  66. package/dist/es2019/components/common/RetryableButton.js +10 -11
  67. package/dist/es2019/components/common/Scrollable.js +6 -10
  68. package/dist/es2019/components/common/UfoErrorBoundary.js +11 -0
  69. package/dist/es2019/components/common/UploadEmoji.js +4 -0
  70. package/dist/es2019/components/common/styles.js +195 -262
  71. package/dist/es2019/components/picker/CategorySelector.js +15 -12
  72. package/dist/es2019/components/picker/EmojiPicker.js +15 -6
  73. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +8 -8
  74. package/dist/es2019/components/picker/EmojiPickerComponent.js +46 -22
  75. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +8 -7
  76. package/dist/es2019/components/picker/EmojiPickerFooter.js +8 -8
  77. package/dist/es2019/components/picker/EmojiPickerList.js +28 -8
  78. package/dist/es2019/components/picker/EmojiPickerListSearch.js +11 -8
  79. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +10 -8
  80. package/dist/es2019/components/picker/styles.js +112 -160
  81. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +35 -17
  82. package/dist/es2019/components/typeahead/EmojiTypeAheadItem.js +12 -13
  83. package/dist/es2019/components/typeahead/EmojiTypeAheadList.js +18 -19
  84. package/dist/es2019/components/typeahead/styles.js +14 -15
  85. package/dist/es2019/components/uploader/EmojiUploadComponent.js +19 -9
  86. package/dist/es2019/components/uploader/styles.js +4 -4
  87. package/dist/es2019/index.js +4 -3
  88. package/dist/es2019/types.js +10 -1
  89. package/dist/es2019/util/{analytics.js → analytics/analytics.js} +17 -11
  90. package/dist/es2019/util/analytics/index.js +4 -0
  91. package/dist/es2019/util/analytics/samplingUfo.js +147 -0
  92. package/dist/es2019/util/analytics/ufoExperiences.js +34 -0
  93. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +39 -0
  94. package/dist/es2019/util/constants.js +5 -1
  95. package/dist/es2019/version.json +1 -1
  96. package/dist/esm/api/EmojiResource.js +32 -1
  97. package/dist/esm/api/media/SiteEmojiResource.js +10 -2
  98. package/dist/esm/components/common/CachingEmoji.js +36 -12
  99. package/dist/esm/components/common/DeleteButton.js +8 -6
  100. package/dist/esm/components/common/Emoji.js +26 -29
  101. package/dist/esm/components/common/EmojiActions.js +26 -25
  102. package/dist/esm/components/common/EmojiButton.js +6 -6
  103. package/dist/esm/components/common/EmojiDeletePreview.js +19 -20
  104. package/dist/esm/components/common/EmojiErrorMessage.js +9 -8
  105. package/dist/esm/components/common/EmojiPlaceholder.js +5 -8
  106. package/dist/esm/components/common/EmojiPreview.js +19 -33
  107. package/dist/esm/components/common/EmojiPreviewComponent.js +20 -0
  108. package/dist/esm/components/common/EmojiUploadPicker.js +27 -25
  109. package/dist/esm/components/common/EmojiUploadPreview.js +21 -22
  110. package/dist/esm/components/common/RecordSelectionDefault.js +6 -3
  111. package/dist/esm/components/common/ResourcedEmoji.js +22 -9
  112. package/dist/esm/components/common/ResourcedEmojiComponent.js +32 -10
  113. package/dist/esm/components/common/RetryableButton.js +11 -12
  114. package/dist/esm/components/common/Scrollable.js +6 -10
  115. package/dist/esm/components/common/UfoErrorBoundary.js +38 -0
  116. package/dist/esm/components/common/UploadEmoji.js +4 -0
  117. package/dist/esm/components/common/styles.js +192 -242
  118. package/dist/esm/components/picker/CategorySelector.js +14 -12
  119. package/dist/esm/components/picker/EmojiPicker.js +13 -6
  120. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +8 -8
  121. package/dist/esm/components/picker/EmojiPickerComponent.js +47 -22
  122. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +8 -7
  123. package/dist/esm/components/picker/EmojiPickerFooter.js +8 -8
  124. package/dist/esm/components/picker/EmojiPickerList.js +29 -8
  125. package/dist/esm/components/picker/EmojiPickerListSearch.js +10 -8
  126. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +9 -8
  127. package/dist/esm/components/picker/styles.js +108 -149
  128. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +35 -17
  129. package/dist/esm/components/typeahead/EmojiTypeAheadItem.js +11 -13
  130. package/dist/esm/components/typeahead/EmojiTypeAheadList.js +17 -19
  131. package/dist/esm/components/typeahead/styles.js +14 -14
  132. package/dist/esm/components/uploader/EmojiUploadComponent.js +19 -9
  133. package/dist/esm/components/uploader/styles.js +4 -4
  134. package/dist/esm/index.js +4 -3
  135. package/dist/esm/types.js +10 -1
  136. package/dist/esm/util/{analytics.js → analytics/analytics.js} +9 -7
  137. package/dist/esm/util/analytics/index.js +4 -0
  138. package/dist/esm/util/analytics/samplingUfo.js +259 -0
  139. package/dist/esm/util/analytics/ufoExperiences.js +34 -0
  140. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +39 -0
  141. package/dist/esm/util/constants.js +5 -1
  142. package/dist/esm/version.json +1 -1
  143. package/dist/types/api/EmojiResource.d.ts +1 -0
  144. package/dist/types/components/common/CachingEmoji.d.ts +8 -6
  145. package/dist/types/components/common/EmojiActions.d.ts +2 -3
  146. package/dist/types/components/common/EmojiDeletePreview.d.ts +3 -3
  147. package/dist/types/components/common/EmojiErrorMessage.d.ts +2 -1
  148. package/dist/types/components/common/EmojiPreview.d.ts +2 -3
  149. package/dist/types/components/common/EmojiPreviewComponent.d.ts +7 -0
  150. package/dist/types/components/common/EmojiUploadPreview.d.ts +3 -3
  151. package/dist/types/components/common/ResourcedEmoji.d.ts +2 -0
  152. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +6 -0
  153. package/dist/types/components/common/RetryableButton.d.ts +0 -2
  154. package/dist/types/components/common/UfoErrorBoundary.d.ts +8 -0
  155. package/dist/types/components/common/styles.d.ts +44 -44
  156. package/dist/types/components/picker/EmojiPicker.d.ts +2 -3
  157. package/dist/types/components/picker/EmojiPickerComponent.d.ts +6 -0
  158. package/dist/types/components/picker/EmojiPickerList.d.ts +10 -0
  159. package/dist/types/components/picker/styles.d.ts +17 -18
  160. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +6 -0
  161. package/dist/types/components/typeahead/styles.d.ts +8 -7
  162. package/dist/types/components/uploader/EmojiUploadComponent.d.ts +1 -0
  163. package/dist/types/components/uploader/styles.d.ts +2 -2
  164. package/dist/types/index.d.ts +3 -3
  165. package/dist/types/types.d.ts +6 -0
  166. package/dist/types/util/{analytics.d.ts → analytics/analytics.d.ts} +7 -7
  167. package/dist/types/util/analytics/index.d.ts +6 -0
  168. package/dist/types/util/analytics/samplingUfo.d.ts +31 -0
  169. package/dist/types/util/analytics/ufoExperiences.d.ts +12 -0
  170. package/dist/types/util/analytics/useSampledUFOComponentExperience.d.ts +8 -0
  171. package/dist/types/util/constants.d.ts +2 -0
  172. package/package.json +10 -9
  173. package/dist/cjs/components/picker/EmojiPickerPreview.js +0 -87
  174. package/dist/cjs/context/EmojiContext.js +0 -11
  175. package/dist/cjs/context/EmojiContextProvider.js +0 -22
  176. package/dist/es2019/components/picker/EmojiPickerPreview.js +0 -43
  177. package/dist/es2019/context/EmojiContext.js +0 -2
  178. package/dist/es2019/context/EmojiContextProvider.js +0 -10
  179. package/dist/esm/components/picker/EmojiPickerPreview.js +0 -67
  180. package/dist/esm/context/EmojiContext.js +0 -2
  181. package/dist/esm/context/EmojiContextProvider.js +0 -9
  182. package/dist/types/components/picker/EmojiPickerPreview.d.ts +0 -9
  183. package/dist/types/context/EmojiContext.d.ts +0 -4
  184. package/dist/types/context/EmojiContextProvider.d.ts +0 -7
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.withSampling = exports.ufoExperiencesSampled = exports.isExperienceSampled = exports.clearSampled = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ 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; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+
20
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
21
+
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+
24
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
+
26
+ var ufoExperiencesSampled = {};
27
+ exports.ufoExperiencesSampled = ufoExperiencesSampled;
28
+
29
+ var sampleChance = function sampleChance(min, max) {
30
+ // min and max included
31
+ return Math.floor(Math.random() * (max - min + 1) + min);
32
+ };
33
+
34
+ var clearSampled = function clearSampled() {
35
+ var _iterator = _createForOfIteratorHelper(Object.getOwnPropertyNames(ufoExperiencesSampled)),
36
+ _step;
37
+
38
+ try {
39
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
40
+ var prop = _step.value;
41
+ delete ufoExperiencesSampled[prop];
42
+ }
43
+ } catch (err) {
44
+ _iterator.e(err);
45
+ } finally {
46
+ _iterator.f();
47
+ }
48
+ }; // default sampling function to determine which one to be sampled
49
+
50
+
51
+ exports.clearSampled = clearSampled;
52
+
53
+ var isExperienceSampled = function isExperienceSampled(rate) {
54
+ // if invalid sampling rate provided, we sample it
55
+ if (rate > 1 || rate < 0) {
56
+ return true;
57
+ }
58
+
59
+ if (rate === 1) {
60
+ return true;
61
+ }
62
+
63
+ if (rate === 0) {
64
+ return false;
65
+ }
66
+
67
+ var maxCount = Math.ceil(1 / rate);
68
+ var chance = sampleChance(1, maxCount);
69
+ return chance === maxCount;
70
+ };
71
+
72
+ exports.isExperienceSampled = isExperienceSampled;
73
+
74
+ var hasSampledFromStart = function hasSampledFromStart(experience) {
75
+ if (!ufoExperiencesSampled[experience.id]) {
76
+ return false;
77
+ }
78
+
79
+ if (experience.instanceId) {
80
+ // if the instance of concurrent exp has been sampled from start, allow it.
81
+ return ufoExperiencesSampled[experience.id].sampledInstance[experience.instanceId];
82
+ }
83
+
84
+ return ufoExperiencesSampled[experience.id].sampled;
85
+ };
86
+
87
+ /**
88
+ * This function is a temp solution to reduce the event traffic, as UFO package does not support it.
89
+ *
90
+ * e.g. Emoji Picker contains thousands of emojis, which means will trigger a large number of renderred events without sampling
91
+ * @param ufoExperience
92
+ * @returns
93
+ */
94
+ var withSampling = function withSampling(ufoExperience) {
95
+ var init = function init() {
96
+ if (!ufoExperiencesSampled[ufoExperience.id]) {
97
+ ufoExperiencesSampled[ufoExperience.id] = {
98
+ sampled: false,
99
+ sampledInstance: {}
100
+ };
101
+ }
102
+ };
103
+
104
+ var start = /*#__PURE__*/function () {
105
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(options) {
106
+ var isSampled;
107
+ return _regenerator.default.wrap(function _callee$(_context) {
108
+ while (1) {
109
+ switch (_context.prev = _context.next) {
110
+ case 0:
111
+ if (!hasSampledFromStart(ufoExperience)) {
112
+ _context.next = 2;
113
+ break;
114
+ }
115
+
116
+ return _context.abrupt("return");
117
+
118
+ case 2:
119
+ isSampled = options.samplingFunc || isExperienceSampled;
120
+
121
+ if (isSampled(options.samplingRate)) {
122
+ _context.next = 7;
123
+ break;
124
+ }
125
+
126
+ if (ufoExperience.instanceId) {
127
+ ufoExperiencesSampled[ufoExperience.id].sampledInstance[ufoExperience.instanceId] = false;
128
+ }
129
+
130
+ ufoExperiencesSampled[ufoExperience.id].sampled = false;
131
+ return _context.abrupt("return");
132
+
133
+ case 7:
134
+ // update sampled records
135
+ if (ufoExperience.instanceId) {
136
+ ufoExperiencesSampled[ufoExperience.id].sampledInstance[ufoExperience.instanceId] = true;
137
+ ufoExperiencesSampled[ufoExperience.id].sampled = true;
138
+ }
139
+
140
+ return _context.abrupt("return", ufoExperience.start(options.startTime));
141
+
142
+ case 9:
143
+ case "end":
144
+ return _context.stop();
145
+ }
146
+ }
147
+ }, _callee);
148
+ }));
149
+
150
+ return function start(_x) {
151
+ return _ref.apply(this, arguments);
152
+ };
153
+ }();
154
+
155
+ var success = /*#__PURE__*/function () {
156
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(config) {
157
+ return _regenerator.default.wrap(function _callee2$(_context2) {
158
+ while (1) {
159
+ switch (_context2.prev = _context2.next) {
160
+ case 0:
161
+ if (hasSampledFromStart(ufoExperience)) {
162
+ _context2.next = 2;
163
+ break;
164
+ }
165
+
166
+ return _context2.abrupt("return", null);
167
+
168
+ case 2:
169
+ return _context2.abrupt("return", ufoExperience.success(config));
170
+
171
+ case 3:
172
+ case "end":
173
+ return _context2.stop();
174
+ }
175
+ }
176
+ }, _callee2);
177
+ }));
178
+
179
+ return function success(_x2) {
180
+ return _ref2.apply(this, arguments);
181
+ };
182
+ }();
183
+
184
+ var failure = /*#__PURE__*/function () {
185
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(config) {
186
+ return _regenerator.default.wrap(function _callee3$(_context3) {
187
+ while (1) {
188
+ switch (_context3.prev = _context3.next) {
189
+ case 0:
190
+ if (hasSampledFromStart(ufoExperience)) {
191
+ _context3.next = 2;
192
+ break;
193
+ }
194
+
195
+ return _context3.abrupt("return", null);
196
+
197
+ case 2:
198
+ return _context3.abrupt("return", ufoExperience.failure(config));
199
+
200
+ case 3:
201
+ case "end":
202
+ return _context3.stop();
203
+ }
204
+ }
205
+ }, _callee3);
206
+ }));
207
+
208
+ return function failure(_x3) {
209
+ return _ref3.apply(this, arguments);
210
+ };
211
+ }();
212
+
213
+ var abort = /*#__PURE__*/function () {
214
+ var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(config) {
215
+ return _regenerator.default.wrap(function _callee4$(_context4) {
216
+ while (1) {
217
+ switch (_context4.prev = _context4.next) {
218
+ case 0:
219
+ if (hasSampledFromStart(ufoExperience)) {
220
+ _context4.next = 2;
221
+ break;
222
+ }
223
+
224
+ return _context4.abrupt("return", null);
225
+
226
+ case 2:
227
+ return _context4.abrupt("return", ufoExperience.abort(config));
228
+
229
+ case 3:
230
+ case "end":
231
+ return _context4.stop();
232
+ }
233
+ }
234
+ }, _callee4);
235
+ }));
236
+
237
+ return function abort(_x4) {
238
+ return _ref4.apply(this, arguments);
239
+ };
240
+ }();
241
+
242
+ var mark = function mark(name, timestamp) {
243
+ if (!hasSampledFromStart(ufoExperience)) {
244
+ return;
245
+ }
246
+
247
+ return ufoExperience.mark(name, timestamp);
248
+ };
249
+
250
+ var markFMP = function markFMP(timestamp) {
251
+ if (!hasSampledFromStart(ufoExperience)) {
252
+ return;
253
+ }
254
+
255
+ return ufoExperience.markFMP(timestamp);
256
+ };
257
+
258
+ var markInlineResponse = function markInlineResponse(timestamp) {
259
+ if (!hasSampledFromStart(ufoExperience)) {
260
+ return;
261
+ }
262
+
263
+ return ufoExperience.markInlineResponse(timestamp);
264
+ };
265
+
266
+ init();
267
+ return _objectSpread(_objectSpread({}, ufoExperience), {}, {
268
+ start: start,
269
+ success: success,
270
+ failure: failure,
271
+ abort: abort,
272
+ mark: mark,
273
+ markFMP: markFMP,
274
+ markInlineResponse: markInlineResponse
275
+ });
276
+ };
277
+
278
+ exports.withSampling = withSampling;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ufoExperiences = exports.sampledUfoRenderedEmoji = void 0;
7
+
8
+ var _ufo = require("@atlaskit/ufo");
9
+
10
+ var _samplingUfo = require("./samplingUfo");
11
+
12
+ var createRenderExperience = function createRenderExperience(componentName) {
13
+ return {
14
+ platform: {
15
+ component: componentName
16
+ },
17
+ type: _ufo.ExperienceTypes.Load,
18
+ performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
19
+ };
20
+ };
21
+
22
+ var createInlineExperience = function createInlineExperience(componentName) {
23
+ return {
24
+ platform: {
25
+ component: componentName
26
+ },
27
+ type: _ufo.ExperienceTypes.Experience,
28
+ performanceType: _ufo.ExperiencePerformanceTypes.InlineResult
29
+ };
30
+ };
31
+
32
+ var ufoExperiences = {
33
+ 'emoji-rendered': new _ufo.ConcurrentExperience('emoji-rendered', createRenderExperience('emoji')),
34
+ 'emoji-resource-fetched': new _ufo.ConcurrentExperience('emoji-resource-fetched', createRenderExperience('emoji-provider')),
35
+ 'emoji-picker-opened': new _ufo.UFOExperience('emoji-picker-opened', createRenderExperience('emoji-picker')),
36
+ 'emoji-selection-recorded': new _ufo.UFOExperience('emoji-selection-recorded', createInlineExperience('emoji-picker')),
37
+ 'emoji-uploaded': new _ufo.UFOExperience('emoji-uploaded', createInlineExperience('emoji-picker')),
38
+ 'emoji-searched': new _ufo.UFOExperience('emoji-searched', createInlineExperience('emoji-picker'))
39
+ };
40
+ exports.ufoExperiences = ufoExperiences;
41
+
42
+ var sampledUfoRenderedEmoji = function sampledUfoRenderedEmoji(emojiId) {
43
+ return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
44
+ };
45
+
46
+ exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSampledUFOComponentExperience = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _samplingUfo = require("./samplingUfo");
11
+
12
+ var useConstructor = function useConstructor(callback) {
13
+ var hasBeenFired = (0, _react.useRef)(false);
14
+
15
+ if (!hasBeenFired.current) {
16
+ callback();
17
+ hasBeenFired.current = true;
18
+ }
19
+
20
+ return null;
21
+ };
22
+ /**
23
+ * A hook to start an experience and to auto abort the experience when the parent component is unmounted.
24
+ * Use this instead of a direct call to `experience.start`. If you need to restart the experience
25
+ * simply trigger an unmount and remount of the parent component.
26
+ * @param experience the experience to start and abort
27
+ */
28
+
29
+
30
+ var useSampledUFOComponentExperience = function useSampledUFOComponentExperience(experience, samplingRate, metadata) {
31
+ (0, _react.useEffect)(function () {
32
+ return function () {
33
+ (0, _samplingUfo.withSampling)(experience).abort();
34
+ }; // we want this cleanup to only happen on unmount so this is a legit use of empty array
35
+ // eslint-disable-next-line react-hooks/exhaustive-deps
36
+ }, []);
37
+ useConstructor(function () {
38
+ (0, _samplingUfo.withSampling)(experience).start({
39
+ samplingRate: samplingRate
40
+ });
41
+
42
+ if (metadata) {
43
+ experience.addMetadata(metadata);
44
+ }
45
+ });
46
+ return null;
47
+ };
48
+
49
+ exports.useSampledUFOComponentExperience = useSampledUFOComponentExperience;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.MAX_ORDINAL = void 0;
6
+ exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
7
7
  var customCategory = 'CUSTOM';
8
8
  exports.customCategory = customCategory;
9
9
  var frequentCategory = 'FREQUENT';
@@ -41,5 +41,12 @@ var defaultListLimit = 50;
41
41
  exports.defaultListLimit = defaultListLimit;
42
42
  var migrationUserId = 'hipchat_migration_emoticons';
43
43
  exports.migrationUserId = migrationUserId;
44
- var analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker';
45
- exports.analyticsEmojiPrefix = analyticsEmojiPrefix;
44
+ var analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker'; // This is the base sampling rate in Emoji
45
+
46
+ exports.analyticsEmojiPrefix = analyticsEmojiPrefix;
47
+ var SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in ResourceEmoji which will be used in stead of base sampling rate above
48
+
49
+ exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = SAMPLING_RATE_EMOJI_RENDERED_EXP;
50
+ var SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = 0.1; // add more sampling rate in parent components like EmojiTypeAheadItem.
51
+
52
+ exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.2.0",
3
+ "version": "64.4.0",
4
4
  "sideEffects": false
5
5
  }
@@ -3,10 +3,12 @@ import { AbstractResource, utils as serviceUtils } from '@atlaskit/util-service-
3
3
  import { selectedToneStorageKey } from '../util/constants';
4
4
  import { isMediaEmoji, isPromise, toEmojiId } from '../util/type-helpers';
5
5
  import storageAvailable from '../util/storage-available';
6
+ import { ProviderTypes } from '../types';
6
7
  import debug from '../util/logger';
7
8
  import EmojiLoader from './EmojiLoader';
8
9
  import EmojiRepository from './EmojiRepository';
9
10
  import SiteEmojiResource from './media/SiteEmojiResource';
11
+ import { ufoExperiences } from '../util/analytics';
10
12
 
11
13
  /**
12
14
  * Checks if the emojiProvider can support uploading at a feature level.
@@ -38,6 +40,11 @@ export class EmojiResource extends AbstractResource {
38
40
  const emojiResponses = [];
39
41
  this.activeLoaders = config.providers.length;
40
42
  config.providers.forEach((provider, index) => {
43
+ const providerType = this.getProviderType(provider);
44
+ ufoExperiences['emoji-resource-fetched'].getInstance(providerType).start();
45
+ ufoExperiences['emoji-resource-fetched'].getInstance(providerType).addMetadata({
46
+ type: providerType
47
+ });
41
48
  const loader = new EmojiLoader(provider);
42
49
  const emojis = loader.loadEmoji();
43
50
  emojis.then(emojiResponse => {
@@ -46,11 +53,19 @@ export class EmojiResource extends AbstractResource {
46
53
  this.initSiteEmojiResource(emojiResponse, provider).then(() => {
47
54
  this.activeLoaders--;
48
55
  this.performRetries();
49
- this.refreshLastFilter();
56
+ this.refreshLastFilter(); // if not site emoji it would still resolve
57
+ // TODO: improve the logic in future
58
+
59
+ ufoExperiences['emoji-resource-fetched'].getInstance(providerType).success();
50
60
  });
51
61
  }).catch(reason => {
52
62
  this.activeLoaders--;
53
63
  this.notifyError(reason);
64
+ ufoExperiences['emoji-resource-fetched'].getInstance(providerType).failure({
65
+ metadata: {
66
+ reason
67
+ }
68
+ });
54
69
  });
55
70
  });
56
71
 
@@ -63,6 +78,18 @@ export class EmojiResource extends AbstractResource {
63
78
  }
64
79
  }
65
80
 
81
+ getProviderType(provider) {
82
+ if (provider.url.includes('/site')) {
83
+ return ProviderTypes.SITE;
84
+ } else if (provider.url.includes('/standard')) {
85
+ return ProviderTypes.STANDARD;
86
+ } else if (provider.url.includes('/atlassian')) {
87
+ return ProviderTypes.ATLASSIAN;
88
+ }
89
+
90
+ return ProviderTypes.UNKNOWN;
91
+ }
92
+
66
93
  initEmojiRepository(emojiResponses) {
67
94
  let emojis = [];
68
95
  emojiResponses.forEach(emojiResponse => {
@@ -163,7 +163,11 @@ export default class SiteEmojiResource {
163
163
  }
164
164
 
165
165
  findEmoji(emojiId) {
166
- const path = `../${emojiId.id}`;
166
+ if (!emojiId.id) {
167
+ return Promise.reject(false);
168
+ }
169
+
170
+ const path = `../${encodeURIComponent(emojiId.id)}`;
167
171
  return emojiRequest(this.siteServiceConfig, {
168
172
  path
169
173
  }).then(serviceResponse => {
@@ -186,7 +190,11 @@ export default class SiteEmojiResource {
186
190
  return Promise.reject(false);
187
191
  }
188
192
 
189
- const path = `${emoji.id}`;
193
+ if (!emoji.id) {
194
+ return Promise.reject(false);
195
+ }
196
+
197
+ const path = `${encodeURIComponent(emoji.id)}`;
190
198
  const requestInit = {
191
199
  method: 'DELETE'
192
200
  };
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import PropTypes from 'prop-types';
3
4
  import React from 'react';
4
5
  import { PureComponent } from 'react';
5
6
  import { shouldUseAltRepresentation } from '../../api/EmojiUtils';
@@ -7,7 +8,9 @@ import { isEmojiDescription, isMediaEmoji, isPromise } from '../../util/type-hel
7
8
  import debug from '../../util/logger';
8
9
  import Emoji from './Emoji';
9
10
  import EmojiPlaceholder from './EmojiPlaceholder';
10
- import { EmojiContext } from '../../context/EmojiContext';
11
+ import { UfoErrorBoundary } from './UfoErrorBoundary';
12
+ import { sampledUfoRenderedEmoji, ufoExperiences, useSampledUFOComponentExperience } from '../../util/analytics';
13
+ import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
11
14
 
12
15
  /**
13
16
  * Renders an emoji from a cached image, if required.
@@ -18,13 +21,23 @@ export const CachingEmoji = props => {
18
21
  const {
19
22
  placeholderSize,
20
23
  ...emojiProps
21
- } = props;
24
+ } = props; // start emoji rendered experience, it may have already started earlier in ResourcedEmoji
22
25
 
23
- if (isMediaEmoji(props.emoji)) {
24
- return /*#__PURE__*/React.createElement(CachingMediaEmoji, props);
25
- }
26
+ useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emojiProps.emoji.id || emojiProps.emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
27
+ source: 'caching-emoji'
28
+ });
29
+
30
+ const emojiNode = () => {
31
+ if (isMediaEmoji(props.emoji)) {
32
+ return /*#__PURE__*/React.createElement(CachingMediaEmoji, props);
33
+ }
26
34
 
27
- return /*#__PURE__*/React.createElement(Emoji, emojiProps);
35
+ return /*#__PURE__*/React.createElement(Emoji, emojiProps);
36
+ };
37
+
38
+ return /*#__PURE__*/React.createElement(UfoErrorBoundary, {
39
+ experiences: [ufoExperiences['emoji-rendered'].getInstance(props.emoji.id || props.emoji.shortName)]
40
+ }, emojiNode());
28
41
  };
29
42
  /**
30
43
  * Rendering a media emoji image from a cache for media emoji, with different
@@ -33,7 +46,7 @@ export const CachingEmoji = props => {
33
46
 
34
47
  export class CachingMediaEmoji extends PureComponent {
35
48
  constructor(props, context) {
36
- super(props);
49
+ super(props, context);
37
50
 
38
51
  _defineProperty(this, "mounted", false);
39
52
 
@@ -41,6 +54,11 @@ export class CachingMediaEmoji extends PureComponent {
41
54
  const {
42
55
  invalidImage
43
56
  } = this.state;
57
+ sampledUfoRenderedEmoji(_emojiId).failure({
58
+ metadata: {
59
+ reason: 'load error'
60
+ }
61
+ });
44
62
 
45
63
  if (invalidImage || !emoji) {
46
64
  // do nothing, bad image
@@ -59,6 +77,7 @@ export class CachingMediaEmoji extends PureComponent {
59
77
 
60
78
  componentDidMount() {
61
79
  this.mounted = true;
80
+ sampledUfoRenderedEmoji(this.props.emoji).markFMP();
62
81
  }
63
82
 
64
83
  componentWillUnmount() {
@@ -76,10 +95,6 @@ export class CachingMediaEmoji extends PureComponent {
76
95
  }
77
96
 
78
97
  loadEmoji(emoji, context, forceLoad) {
79
- if (!context) {
80
- return;
81
- }
82
-
83
98
  if (!context.emoji) {
84
99
  return undefined;
85
100
  }
@@ -120,6 +135,11 @@ export class CachingMediaEmoji extends PureComponent {
120
135
  cachedEmoji: undefined,
121
136
  invalidImage: true
122
137
  });
138
+ sampledUfoRenderedEmoji(emoji).failure({
139
+ metadata: {
140
+ reason: 'failed to load media emoji'
141
+ }
142
+ });
123
143
  }
124
144
  });
125
145
  return undefined;
@@ -172,6 +192,8 @@ export class CachingMediaEmoji extends PureComponent {
172
192
 
173
193
  }
174
194
 
175
- _defineProperty(CachingMediaEmoji, "contextType", EmojiContext);
195
+ _defineProperty(CachingMediaEmoji, "contextTypes", {
196
+ emoji: PropTypes.object
197
+ });
176
198
 
177
199
  export default CachingEmoji;
@@ -1,15 +1,17 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/core';
1
3
  import Button from '@atlaskit/button/custom-theme-button';
2
4
  import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
3
- import React from 'react';
4
5
  import { token } from '@atlaskit/tokens';
5
6
  import { N500 } from '@atlaskit/theme/colors';
6
7
  import { deleteEmojiLabel } from '../../util/constants';
7
- import * as styles from './styles';
8
+ import { emojiDeleteButton, deleteButton } from './styles';
8
9
 
9
- const DeleteButton = props => /*#__PURE__*/React.createElement("span", {
10
- className: styles.deleteButton
11
- }, /*#__PURE__*/React.createElement(Button, {
12
- iconBefore: /*#__PURE__*/React.createElement(CrossCircleIcon, {
10
+ const DeleteButton = props => jsx("span", {
11
+ css: deleteButton,
12
+ className: emojiDeleteButton
13
+ }, jsx(Button, {
14
+ iconBefore: jsx(CrossCircleIcon, {
13
15
  label: deleteEmojiLabel,
14
16
  primaryColor: token('color.text.subtle', N500),
15
17
  size: "small"