@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
@@ -1,40 +1,67 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React from 'react';
3
- import { Component } from 'react';
1
+ import React, { useEffect, useMemo, useState } from 'react';
4
2
  import { defaultEmojiHeight } from '../../util/constants';
5
3
  import { isPromise } from '../../util/type-helpers';
6
4
  import { UfoEmojiTimings } from '../../types';
7
- import CachingEmoji from './CachingEmoji';
5
+ import Emoji from './Emoji';
8
6
  import EmojiPlaceholder from './EmojiPlaceholder';
9
7
  import { sampledUfoRenderedEmoji } from '../../util/analytics';
10
8
  import LegacyEmojiContextProvider from '../../context/LegacyEmojiContextProvider';
9
+ import { EmojiImage } from './EmojiImage';
11
10
  import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
12
- export default class ResourcedEmojiComponent extends Component {
13
- constructor(props) {
14
- super(props);
15
-
16
- _defineProperty(this, "ready", false);
17
-
18
- this.state = {
19
- emoji: undefined,
20
- loaded: false
21
- };
22
- }
11
+ var ResourcedEmojiComponentRenderStatesEnum;
12
+
13
+ (function (ResourcedEmojiComponentRenderStatesEnum) {
14
+ ResourcedEmojiComponentRenderStatesEnum["INITIAL"] = "INITIAL";
15
+ ResourcedEmojiComponentRenderStatesEnum["OPTIMISTIC"] = "OPTIMISTIC";
16
+ ResourcedEmojiComponentRenderStatesEnum["FALLBACK"] = "FALLBACK";
17
+ ResourcedEmojiComponentRenderStatesEnum["EMOJI"] = "EMOJI";
18
+ })(ResourcedEmojiComponentRenderStatesEnum || (ResourcedEmojiComponentRenderStatesEnum = {}));
19
+
20
+ export const ResourcedEmojiComponent = ({
21
+ emojiProvider,
22
+ emojiId,
23
+ showTooltip,
24
+ customFallback,
25
+ fitToHeight = defaultEmojiHeight,
26
+ optimistic = false,
27
+ optimisticImageURL
28
+ }) => {
29
+ const {
30
+ shortName,
31
+ id,
32
+ fallback
33
+ } = emojiId;
34
+ const emojiContextValue = {
35
+ emoji: {
36
+ emojiProvider
37
+ }
38
+ };
39
+ const [emoji, setEmoji] = useState();
40
+ const [loaded, setLoaded] = useState(false);
23
41
 
24
- refreshEmoji(emojiProvider, emojiId) {
25
- const foundEmoji = emojiProvider.findByEmojiId(emojiId);
42
+ const fetchOrGetEmoji = (emojiProvider, emojiId, optimisticFetch = false) => {
43
+ // TODO: Pass in optimistic into findByEmojiId to allow a single emoji meta fetch
44
+ const foundEmoji = emojiProvider.fetchByEmojiId(emojiId, optimisticFetch);
26
45
  sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_START);
27
46
 
28
47
  if (isPromise(foundEmoji)) {
29
- this.setState({
30
- loaded: false
31
- });
48
+ setLoaded(false);
32
49
  foundEmoji.then(emoji => {
33
- if (this.ready) {
34
- // don't update state if component was unmounted
35
- this.setState({
36
- emoji,
37
- loaded: true
50
+ setEmoji(emoji);
51
+
52
+ if (!emoji) {
53
+ // emoji is undefined
54
+ sampledUfoRenderedEmoji(emojiId).failure({
55
+ metadata: {
56
+ reason: 'failed to find',
57
+ source: 'ResourcedEmojiComponent',
58
+ data: {
59
+ emoji: {
60
+ id: emojiId.id,
61
+ shortName: emojiId.shortName
62
+ }
63
+ }
64
+ }
38
65
  });
39
66
  sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_END);
40
67
 
@@ -55,6 +82,7 @@ export default class ResourcedEmojiComponent extends Component {
55
82
  }
56
83
  }
57
84
  }).catch(() => {
85
+ setEmoji(undefined);
58
86
  sampledUfoRenderedEmoji(emojiId).failure({
59
87
  metadata: {
60
88
  reason: 'failed to load',
@@ -67,94 +95,79 @@ export default class ResourcedEmojiComponent extends Component {
67
95
  }
68
96
  }
69
97
  });
98
+ }).finally(() => {
99
+ setLoaded(true);
100
+ sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_END);
70
101
  });
71
102
  } else {
72
- sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_END); // loaded
73
-
74
- this.setState({
75
- emoji: foundEmoji,
76
- loaded: true
77
- });
103
+ setEmoji(foundEmoji);
104
+ setLoaded(true);
105
+ sampledUfoRenderedEmoji(emojiId).mark(UfoEmojiTimings.METADATA_END);
78
106
  }
79
- }
107
+ };
80
108
 
81
- UNSAFE_componentWillMount() {
82
- this.ready = true;
83
-
84
- if (!this.state.emoji) {
85
- // using UNSAFE_componentWillMount instead of componentDidMount to avoid needless
86
- // rerendering.
87
- this.refreshEmoji(this.props.emojiProvider, this.props.emojiId);
109
+ useEffect(() => {
110
+ if (!emojiId) {
111
+ return;
88
112
  }
89
- }
90
-
91
- componentWillUnmount() {
92
- this.ready = false;
93
- }
94
113
 
95
- componentDidMount() {
96
- if (!hasUfoMarked(sampledUfoRenderedEmoji(this.props.emojiId), UfoEmojiTimings.FMP_END)) {
97
- sampledUfoRenderedEmoji(this.props.emojiId).markFMP();
114
+ if (!hasUfoMarked(sampledUfoRenderedEmoji(emojiId), UfoEmojiTimings.FMP_END)) {
115
+ sampledUfoRenderedEmoji(emojiId).markFMP();
98
116
  }
99
- }
100
-
101
- UNSAFE_componentWillReceiveProps(nextProps) {
102
- if (nextProps.emojiProvider !== this.props.emojiProvider || nextProps.emojiId !== this.props.emojiId) {
103
- this.refreshEmoji(nextProps.emojiProvider, nextProps.emojiId);
117
+ }, [emojiId]);
118
+ useMemo(() => {
119
+ if (!emojiProvider || !emojiId) {
120
+ return;
104
121
  }
105
- }
106
-
107
- render() {
108
- const {
109
- emojiId,
110
- fitToHeight = defaultEmojiHeight,
111
- showTooltip
112
- } = this.props;
113
- const {
114
- emoji,
115
- loaded
116
- } = this.state;
117
- const {
118
- shortName,
119
- fallback
120
- } = emojiId;
121
122
 
122
- if (emoji) {
123
- return this.emojiWrapper( /*#__PURE__*/React.createElement(CachingEmoji, {
124
- emoji: emoji,
125
- showTooltip: showTooltip,
126
- fitToHeight: fitToHeight
127
- }));
128
- } else if (loaded) {
129
- // loaded but not found - render fallback
130
- return this.emojiWrapper( /*#__PURE__*/React.createElement("span", null, fallback || shortName));
123
+ fetchOrGetEmoji(emojiProvider, emojiId, optimistic);
124
+ }, [emojiProvider, emojiId, optimistic]);
125
+ const emojiRenderState = useMemo(() => {
126
+ if (!emoji && !loaded && !optimisticImageURL) {
127
+ return ResourcedEmojiComponentRenderStatesEnum.INITIAL;
128
+ } else if (!emoji && !loaded && optimisticImageURL) {
129
+ return ResourcedEmojiComponentRenderStatesEnum.OPTIMISTIC;
130
+ } else if (!emoji && loaded) {
131
+ return ResourcedEmojiComponentRenderStatesEnum.FALLBACK;
131
132
  }
132
133
 
133
- return this.emojiWrapper( /*#__PURE__*/React.createElement(EmojiPlaceholder, {
134
- shortName: shortName,
135
- showTooltip: showTooltip,
136
- size: fitToHeight || defaultEmojiHeight
137
- }));
138
- }
139
-
140
- emojiWrapper(element) {
141
- const {
142
- shortName,
143
- id,
144
- fallback
145
- } = this.props.emojiId;
146
- const emojiContextValue = {
147
- emoji: {
148
- emojiProvider: this.props.emojiProvider
134
+ return ResourcedEmojiComponentRenderStatesEnum.EMOJI;
135
+ }, [emoji, loaded, optimisticImageURL]);
136
+
137
+ const handleOnLoadError = emojiId => {
138
+ sampledUfoRenderedEmoji(emojiId).failure({
139
+ metadata: {
140
+ reason: 'load error',
141
+ source: 'ResourcedEmojiComponent',
142
+ data: {
143
+ emoji: {
144
+ id: emojiId.id,
145
+ shortName: emojiId.shortName
146
+ }
147
+ }
149
148
  }
150
- };
151
- return /*#__PURE__*/React.createElement(LegacyEmojiContextProvider, {
152
- emojiContextValue: emojiContextValue
153
- }, /*#__PURE__*/React.createElement("span", {
154
- "data-emoji-id": id,
155
- "data-emoji-short-name": shortName,
156
- "data-emoji-text": fallback || shortName
157
- }, element));
158
- }
159
-
160
- }
149
+ });
150
+ };
151
+
152
+ return /*#__PURE__*/React.createElement(LegacyEmojiContextProvider, {
153
+ emojiContextValue: emojiContextValue
154
+ }, /*#__PURE__*/React.createElement("span", {
155
+ "data-emoji-id": id,
156
+ "data-emoji-short-name": shortName,
157
+ "data-emoji-text": fallback || shortName
158
+ }, emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.INITIAL && /*#__PURE__*/React.createElement(EmojiPlaceholder, {
159
+ shortName: shortName,
160
+ showTooltip: showTooltip,
161
+ size: fitToHeight || defaultEmojiHeight,
162
+ loading: true
163
+ }), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.OPTIMISTIC && optimisticImageURL && /*#__PURE__*/React.createElement(EmojiImage, {
164
+ emojiId: emojiId,
165
+ imageUrl: optimisticImageURL,
166
+ maxSize: fitToHeight || defaultEmojiHeight
167
+ }), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.FALLBACK && /*#__PURE__*/React.createElement(React.Fragment, null, customFallback || fallback || shortName), emojiRenderState === ResourcedEmojiComponentRenderStatesEnum.EMOJI && emoji && /*#__PURE__*/React.createElement(Emoji, {
168
+ emoji: emoji,
169
+ onLoadError: handleOnLoadError,
170
+ showTooltip: showTooltip,
171
+ fitToHeight: fitToHeight
172
+ })));
173
+ };
@@ -2,13 +2,13 @@ import { supportsUploadFeature } from '../../api/EmojiResource';
2
2
  import { uploadFailedEvent, uploadSucceededEvent } from '../../util/analytics';
3
3
  import { messages } from '../i18n';
4
4
  import { ufoExperiences } from '../../util/analytics/ufoExperiences';
5
- export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) => {
5
+ export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry) => {
6
6
  const startTime = Date.now();
7
7
  errorSetter(undefined);
8
8
 
9
9
  if (supportsUploadFeature(emojiProvider)) {
10
10
  ufoExperiences['emoji-uploaded'].start();
11
- emojiProvider.uploadCustomEmoji(upload).then(emojiDescription => {
11
+ emojiProvider.uploadCustomEmoji(upload, retry).then(emojiDescription => {
12
12
  fireAnalytics(uploadSucceededEvent({
13
13
  duration: Date.now() - startTime
14
14
  }));
@@ -25,11 +25,7 @@ export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireA
25
25
  ufoExperiences['emoji-uploaded'].failure({
26
26
  metadata: {
27
27
  source: 'UploadEmoji',
28
- error: err,
29
- data: {
30
- upload: { ...upload
31
- }
32
- }
28
+ error: err
33
29
  }
34
30
  });
35
31
  });
@@ -1,9 +1,9 @@
1
- import { css } from '@emotion/core';
1
+ import { css, keyframes } from '@emotion/core';
2
2
  import { borderRadius } from '@atlaskit/theme/constants';
3
3
  import { token } from '@atlaskit/tokens';
4
4
  import { defaultEmojiHeight } from '../../util/constants';
5
5
  import { akEmojiSelectedBackgroundColor } from '../../util/shared-styles';
6
- import { N20, N200, N300, N900, R300, R400 } from '@atlaskit/theme/colors';
6
+ import { N20, N200, N20A, N300, N900, R300, R400 } from '@atlaskit/theme/colors';
7
7
  export const commonSelectedStyles = 'emoji-common-selected';
8
8
  export const selectOnHoverStyles = 'emoji-common-select-on-hover';
9
9
  export const emojiSprite = 'emoji-common-emoji-sprite';
@@ -31,7 +31,7 @@ export const emojiToneSelectorContainer = css({
31
31
  padding: '8px 10px 8px 0'
32
32
  });
33
33
  export const emojiStyles = css({
34
- borderRadius: '5px',
34
+ borderRadius: `${borderRadius()}px`,
35
35
  backgroundColor: 'transparent',
36
36
  display: 'inline-block',
37
37
  verticalAlign: 'middle',
@@ -60,20 +60,41 @@ export const emojiContainer = css({
60
60
  [`.${emojiSprite}`]: {
61
61
  background: 'transparent no-repeat',
62
62
  display: 'inline-block',
63
- verticalAlign: 'middle',
64
63
  minHeight: `${defaultEmojiHeight}px`,
65
- minWidth: `${defaultEmojiHeight}px`
64
+ minWidth: `${defaultEmojiHeight}px`,
65
+ verticalAlign: 'middle'
66
66
  }
67
67
  });
68
68
  export const placeholder = 'emoji-common-placeholder';
69
69
  export const placeholderContainer = css({
70
- // Ensure no vertical reflow
70
+ position: 'relative',
71
71
  margin: '-1px 0',
72
72
  display: 'inline-block',
73
73
  background: token('color.border', '#f7f7f7'),
74
- borderRadius: '20%',
74
+ borderRadius: `${borderRadius()}px`,
75
+ overflow: 'hidden',
75
76
  verticalAlign: 'middle',
76
- whiteSpace: 'nowrap'
77
+ whiteSpace: 'nowrap',
78
+ textAlign: 'center'
79
+ });
80
+ const easeSweep = keyframes`
81
+ from {
82
+ transform: translateX(-100%);
83
+ }
84
+ to {
85
+ transform: translateX(100%);
86
+ }
87
+ `;
88
+ export const placeholderContainerAnimated = css({
89
+ '&::before': {
90
+ content: '""',
91
+ display: 'block',
92
+ position: 'absolute',
93
+ background: token('color.background.neutral', N20A),
94
+ height: '100%',
95
+ width: '100%',
96
+ animation: `${easeSweep} 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite`
97
+ }
77
98
  });
78
99
  export const emojiButton = css({
79
100
  backgroundColor: 'transparent',
@@ -87,7 +108,7 @@ export const emojiButton = css({
87
108
  padding: 0
88
109
  },
89
110
  '&>span': {
90
- borderRadius: '5px',
111
+ borderRadius: `${borderRadius()}px`,
91
112
  padding: '8px',
92
113
  // Scale sprite to fit regardless of default emoji size
93
114
  [`&>.${emojiSprite}`]: {
@@ -247,7 +247,7 @@ export default class EmojiPickerComponent extends PureComponent {
247
247
  this.scrollToEndOfList();
248
248
  };
249
249
 
250
- uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics);
250
+ uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics, retry);
251
251
  });
252
252
 
253
253
  _defineProperty(this, "onTriggerDelete", (_emojiId, emoji) => {
@@ -359,12 +359,12 @@ export default class EmojiPickerComponent extends PureComponent {
359
359
  }
360
360
 
361
361
  UNSAFE_componentWillMount() {
362
+ ufoExperiences['emoji-picker-opened'].success();
362
363
  this.openTime = Date.now();
363
364
  this.fireAnalytics(openedPickerEvent());
364
365
  }
365
366
 
366
367
  componentDidMount() {
367
- ufoExperiences['emoji-picker-opened'].success();
368
368
  const {
369
369
  emojiProvider,
370
370
  hideToneSelector
@@ -32,7 +32,7 @@ export default class EmojiUploadComponent extends PureComponent {
32
32
  });
33
33
  };
34
34
 
35
- uploadEmoji(upload, emojiProvider, errorSetter, this.prepareForUpload, this.fireAnalytics);
35
+ uploadEmoji(upload, emojiProvider, errorSetter, this.prepareForUpload, this.fireAnalytics, retry);
36
36
  });
37
37
 
38
38
  _defineProperty(this, "prepareForUpload", () => {
@@ -1,10 +1,18 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useMemo, useEffect } from 'react';
2
2
  import { EmojiContext } from './EmojiContext';
3
3
  export const EmojiContextProvider = ({
4
4
  children,
5
5
  emojiContextValue
6
6
  }) => {
7
7
  const memoizedEmojiContextValue = useMemo(() => emojiContextValue, [emojiContextValue]);
8
+ useEffect(() => {
9
+ // trigger emoji fetching
10
+ async function fetchEmojiProvider() {
11
+ await (memoizedEmojiContextValue === null || memoizedEmojiContextValue === void 0 ? void 0 : memoizedEmojiContextValue.emoji.emojiProvider.fetchEmojiProvider());
12
+ }
13
+
14
+ fetchEmojiProvider();
15
+ }, [memoizedEmojiContextValue]);
8
16
  return /*#__PURE__*/React.createElement(EmojiContext.Provider, {
9
17
  value: memoizedEmojiContextValue
10
18
  }, children);
@@ -6,19 +6,20 @@ import EmojiPicker from './components/picker/EmojiPicker';
6
6
  import EmojiUploader from './components/uploader/EmojiUploader';
7
7
  import EmojiTypeAhead from './components/typeahead/EmojiTypeAhead';
8
8
  import EmojiTypeAheadItem from './components/typeahead/EmojiTypeAheadItem';
9
+ import { EmojiImage } from './components/common/EmojiImage';
9
10
  export { // renaming exports to prevent breaking changes due to renaming
10
- commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage } from './components/common/styles';
11
+ commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage, placeholder as emojiPlaceholder } from './components/common/styles';
11
12
  import EmojiResource from './api/EmojiResource';
12
13
  import EmojiRepository from './api/EmojiRepository';
13
14
  import EmojiLoader from './api/EmojiLoader';
14
15
  import { denormaliseEmojiServiceResponse } from './api/EmojiUtils';
15
16
  import { toEmojiId, toOptionalEmojiId } from './util/type-helpers';
16
- import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences } from './util/analytics';
17
+ import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling } from './util/analytics';
17
18
  import { customCategory, defaultEmojiHeight, emojiPickerWidth, emojiPickerHeight } from './util/constants';
18
19
  import { UsageFrequencyTracker } from './api/internal/UsageFrequencyTracker';
19
20
  export { // Classes
20
- AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, ResourcedEmoji, // functions
21
- denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, // Constants
21
+ AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, EmojiImage, ResourcedEmoji, // functions
22
+ denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling, // Constants
22
23
  emojiPickerWidth, emojiPickerHeight, defaultEmojiHeight, customCategory, UsageFrequencyTracker, EmojiTypeAheadItem };
23
24
  export { // Enums
24
25
  SearchSort, UfoExperienceName, UfoComponentName } from './types';
@@ -42,6 +42,7 @@ export let ProviderTypes;
42
42
  ProviderTypes["STANDARD"] = "STANDARD";
43
43
  ProviderTypes["ATLASSIAN"] = "ATLASSIAN";
44
44
  ProviderTypes["UNKNOWN"] = "UNKNOWN";
45
+ ProviderTypes["SINGLE"] = "SINGLE";
45
46
  })(ProviderTypes || (ProviderTypes = {}));
46
47
 
47
48
  export let UfoExperienceName;
@@ -42,7 +42,6 @@ const hasSampledFromStart = experience => {
42
42
 
43
43
  return ufoExperiencesSampled[experience.id].sampled;
44
44
  };
45
-
46
45
  /**
47
46
  * This function is a temp solution to reduce the event traffic, as UFO package does not support it.
48
47
  *
@@ -50,6 +49,8 @@ const hasSampledFromStart = experience => {
50
49
  * @param ufoExperience
51
50
  * @returns
52
51
  */
52
+
53
+
53
54
  export const withSampling = ufoExperience => {
54
55
  const init = () => {
55
56
  if (!ufoExperiencesSampled[ufoExperience.id]) {
@@ -110,6 +111,14 @@ export const withSampling = ufoExperience => {
110
111
  return ufoExperience.abort(config);
111
112
  };
112
113
 
114
+ const addMetadata = data => {
115
+ if (!hasSampledFromStart(ufoExperience)) {
116
+ return;
117
+ }
118
+
119
+ return ufoExperience.addMetadata(data);
120
+ };
121
+
113
122
  const mark = (name, timestamp) => {
114
123
  if (!hasSampledFromStart(ufoExperience)) {
115
124
  return;
@@ -137,6 +146,7 @@ export const withSampling = ufoExperience => {
137
146
  init();
138
147
  return { ...ufoExperience,
139
148
  start,
149
+ addMetadata,
140
150
  success,
141
151
  failure,
142
152
  abort,
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.7.1",
3
+ "version": "65.0.0",
4
4
  "sideEffects": false
5
5
  }