@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
@@ -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
  }));
@@ -22,7 +22,12 @@ export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireA
22
22
  duration: Date.now() - startTime,
23
23
  reason: messages.emojiUploadFailed.defaultMessage
24
24
  }));
25
- ufoExperiences['emoji-uploaded'].failure();
25
+ ufoExperiences['emoji-uploaded'].failure({
26
+ metadata: {
27
+ source: 'UploadEmoji',
28
+ error: err
29
+ }
30
+ });
26
31
  });
27
32
  }
28
33
  };
@@ -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}`]: {
@@ -81,6 +81,12 @@ export default class EmojiPickerComponent extends PureComponent {
81
81
  });
82
82
  });
83
83
 
84
+ _defineProperty(this, "onPreviewDisplayed", isDisplayed => {
85
+ this.setState({
86
+ isPreviewDisplayed: isDisplayed
87
+ });
88
+ });
89
+
84
90
  _defineProperty(this, "onFileChooserClicked", () => {
85
91
  this.fireAnalytics(selectedFileEvent());
86
92
  });
@@ -247,7 +253,7 @@ export default class EmojiPickerComponent extends PureComponent {
247
253
  this.scrollToEndOfList();
248
254
  };
249
255
 
250
- uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics);
256
+ uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics, retry);
251
257
  });
252
258
 
253
259
  _defineProperty(this, "onTriggerDelete", (_emojiId, emoji) => {
@@ -353,18 +359,19 @@ export default class EmojiPickerComponent extends PureComponent {
353
359
  selectedTone: !hideToneSelector ? _emojiProvider.getSelectedTone() : undefined,
354
360
  loading: true,
355
361
  uploadSupported: false,
356
- uploading: false
362
+ uploading: false,
363
+ isPreviewDisplayed: false
357
364
  };
358
365
  this.openTime = 0;
359
366
  }
360
367
 
361
368
  UNSAFE_componentWillMount() {
369
+ ufoExperiences['emoji-picker-opened'].success();
362
370
  this.openTime = Date.now();
363
371
  this.fireAnalytics(openedPickerEvent());
364
372
  }
365
373
 
366
374
  componentDidMount() {
367
- ufoExperiences['emoji-picker-opened'].success();
368
375
  const {
369
376
  emojiProvider,
370
377
  hideToneSelector
@@ -399,8 +406,18 @@ export default class EmojiPickerComponent extends PureComponent {
399
406
  this.fireAnalytics(closedPickerEvent({
400
407
  duration: this.calculateElapsedTime()
401
408
  }));
402
- ufoExperiences['emoji-picker-opened'].abort();
403
- ufoExperiences['emoji-searched'].abort();
409
+ ufoExperiences['emoji-picker-opened'].abort({
410
+ metadata: {
411
+ source: 'EmojiPickerComponent',
412
+ reason: 'unmount'
413
+ }
414
+ });
415
+ ufoExperiences['emoji-searched'].abort({
416
+ metadata: {
417
+ source: 'EmojiPickerComponent',
418
+ reason: 'unmount'
419
+ }
420
+ });
404
421
  }
405
422
 
406
423
  UNSAFE_componentWillReceiveProps(nextProps) {
@@ -515,7 +532,8 @@ export default class EmojiPickerComponent extends PureComponent {
515
532
  emojiToDelete,
516
533
  uploading,
517
534
  uploadErrorMessage,
518
- uploadSupported
535
+ uploadSupported,
536
+ isPreviewDisplayed
519
537
  } = this.state;
520
538
  const recordUsageOnSelection = createRecordSelectionDefault(emojiProvider, this.onSelectWrapper, analytic => this.fireAnalytics(analytic('picker')));
521
539
  const formattedErrorMessage = uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null;
@@ -527,7 +545,7 @@ export default class EmojiPickerComponent extends PureComponent {
527
545
  const picker = jsx(LegacyEmojiContextProvider, {
528
546
  emojiContextValue: emojiContextValue
529
547
  }, jsx("div", {
530
- css: emojiPicker,
548
+ css: emojiPicker(isPreviewDisplayed),
531
549
  ref: this.handlePickerRef,
532
550
  "data-emoji-picker-container": true
533
551
  }, jsx(CategorySelector, {
@@ -563,7 +581,8 @@ export default class EmojiPickerComponent extends PureComponent {
563
581
  onOpenUpload: this.onOpenUpload
564
582
  }), jsx(EmojiPickerFooter, {
565
583
  selectedEmoji: selectedEmoji,
566
- isUploading: uploading
584
+ isUploading: uploading,
585
+ onPreviewDisplayed: this.onPreviewDisplayed
567
586
  })));
568
587
  return picker;
569
588
  }
@@ -12,9 +12,11 @@ export default class EmojiPickerFooter extends PureComponent {
12
12
  const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
13
13
 
14
14
  if (!selectedEmoji || isUploading) {
15
+ this.props.onPreviewDisplayed(false);
15
16
  return null;
16
17
  }
17
18
 
19
+ this.props.onPreviewDisplayed(true);
18
20
  return jsx("div", {
19
21
  css: previewFooterClassnames
20
22
  }, selectedEmoji && jsx(EmojiPreviewComponent, {
@@ -3,22 +3,24 @@ import { token } from '@atlaskit/tokens';
3
3
  import { borderRadius } from '@atlaskit/theme/constants';
4
4
  import { emojiPickerBorderColor, emojiPickerBoxShadow } from '../../util/shared-styles';
5
5
  import { emojiSprite, placeholder, emojiNodeStyles } from '../common/styles';
6
- import { emojiPickerHeight, emojiPickerWidth } from '../../util/constants';
6
+ import { emojiPickerHeight, emojiPickerHeightWithPreview, emojiPickerWidth } from '../../util/constants';
7
7
  import { B200, B300, N100A, N200, N30, N30A, N50, N900 } from '@atlaskit/theme/colors'; // Level 1 - picker
8
8
 
9
- export const emojiPicker = css({
10
- display: 'flex',
11
- flexDirection: 'column',
12
- justifyContent: 'space-between',
13
- background: token('elevation.surface.overlay', 'white'),
14
- border: `${emojiPickerBorderColor} 1px solid`,
15
- borderRadius: `${borderRadius()}px`,
16
- boxShadow: emojiPickerBoxShadow,
17
- height: `${emojiPickerHeight}px`,
18
- width: `${emojiPickerWidth}px`,
19
- marginBottom: '8px',
20
- minWidth: `${emojiPickerWidth}px`
21
- }); // Level 2
9
+ export const emojiPicker = hasPreview => {
10
+ return css({
11
+ display: 'flex',
12
+ flexDirection: 'column',
13
+ justifyContent: 'space-between',
14
+ background: token('elevation.surface.overlay', 'white'),
15
+ border: `${emojiPickerBorderColor} 1px solid`,
16
+ borderRadius: `${borderRadius()}px`,
17
+ boxShadow: emojiPickerBoxShadow,
18
+ height: `${hasPreview ? emojiPickerHeightWithPreview : emojiPickerHeight}px`,
19
+ width: `${emojiPickerWidth}px`,
20
+ marginBottom: '8px',
21
+ minWidth: `${emojiPickerWidth}px`
22
+ });
23
+ }; // Level 2
22
24
  /// Category Selector
23
25
 
24
26
  export const addButton = 'emoji-picker-add-button';
@@ -172,8 +172,24 @@ export default class EmojiTypeAheadComponent extends PureComponent {
172
172
  this.fireAnalyticsEvent(typeaheadCancelledEvent(Date.now() - this.openTime, query, emojis));
173
173
  }
174
174
 
175
- ufoExperiences['emoji-searched'].abort();
176
- ufoExperiences['emoji-selection-recorded'].abort();
175
+ ufoExperiences['emoji-searched'].abort({
176
+ metadata: {
177
+ source: 'EmojiTypeAheadComponent',
178
+ reason: 'unmount',
179
+ data: {
180
+ query
181
+ }
182
+ }
183
+ });
184
+ ufoExperiences['emoji-selection-recorded'].abort({
185
+ metadata: {
186
+ source: 'EmojiTypeAheadComponent',
187
+ reason: 'unmount',
188
+ data: {
189
+ query
190
+ }
191
+ }
192
+ });
177
193
  this.sessionId = uuid();
178
194
  this.selected = false;
179
195
  }
@@ -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", () => {
@@ -84,7 +84,12 @@ export default class EmojiUploadComponent extends PureComponent {
84
84
  }
85
85
 
86
86
  componentWillUnmount() {
87
- ufoExperiences['emoji-uploaded'].abort();
87
+ ufoExperiences['emoji-uploaded'].abort({
88
+ metadata: {
89
+ source: 'EmojiUploadComponent',
90
+ reason: 'unmount'
91
+ }
92
+ });
88
93
  }
89
94
 
90
95
  render() {
@@ -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);
@@ -0,0 +1,8 @@
1
+ import { useEffect, useRef } from 'react';
2
+ export function usePrevious(value) {
3
+ const ref = useRef();
4
+ useEffect(() => {
5
+ ref.current = value;
6
+ }, [value]);
7
+ return ref.current;
8
+ }
@@ -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;
@@ -66,6 +67,7 @@ export let UfoComponentName;
66
67
  export let UfoEmojiTimingsKeys;
67
68
 
68
69
  (function (UfoEmojiTimingsKeys) {
70
+ UfoEmojiTimingsKeys["FMP"] = "fmp";
69
71
  UfoEmojiTimingsKeys["MOUNTED"] = "emoji-mount";
70
72
  UfoEmojiTimingsKeys["METADATA"] = "emoji-metadata";
71
73
  UfoEmojiTimingsKeys["MEDIADATA"] = "emoji-media";
@@ -75,6 +77,7 @@ export let UfoEmojiTimingsKeys;
75
77
  export let UfoEmojiTimings;
76
78
 
77
79
  (function (UfoEmojiTimings) {
80
+ UfoEmojiTimings["FMP_END"] = "fmp";
78
81
  UfoEmojiTimings["MOUNTED_END"] = "emoji-mount_end";
79
82
  UfoEmojiTimings["METADATA_START"] = "emoji-metadata_start";
80
83
  UfoEmojiTimings["METADATA_END"] = "emoji-metadata_end";
@@ -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,
@@ -23,8 +23,8 @@ const createInlineExperience = componentName => {
23
23
  };
24
24
 
25
25
  const customEmojiTimings = [{
26
- key: UfoEmojiTimingsKeys.MOUNTED,
27
- endMark: UfoEmojiTimings.MOUNTED_END
26
+ key: UfoEmojiTimingsKeys.FMP,
27
+ endMark: UfoEmojiTimings.FMP_END
28
28
  }, {
29
29
  key: UfoEmojiTimingsKeys.METADATA,
30
30
  component: 'resourced-emoji',
@@ -35,6 +35,10 @@ const customEmojiTimings = [{
35
35
  component: 'caching-emoji',
36
36
  startMark: UfoEmojiTimings.MEDIA_START,
37
37
  endMark: UfoEmojiTimings.MEDIA_END
38
+ }, {
39
+ key: UfoEmojiTimingsKeys.MOUNTED,
40
+ component: 'emoji',
41
+ endMark: UfoEmojiTimings.MOUNTED_END
38
42
  }, {
39
43
  key: UfoEmojiTimingsKeys.ONLOAD,
40
44
  startMark: UfoEmojiTimings.ONLOAD_START,
@@ -57,4 +61,10 @@ export const ufoExperiences = {
57
61
  };
58
62
  export const sampledUfoRenderedEmoji = emojiId => {
59
63
  return withSampling(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
64
+ };
65
+ export const hasUfoMarked = (ufoExperience, name) => {
66
+ return ufoExperience.metrics.marks.some(mask => mask.name === name);
67
+ };
68
+ export const sampledUfoEmojiResourceFetched = providerType => {
69
+ return withSampling(ufoExperiences['emoji-resource-fetched'].getInstance(providerType));
60
70
  };
@@ -30,8 +30,9 @@ export const useSampledUFOComponentExperience = (experience, samplingRate, metad
30
30
  withSampling(experience).start({
31
31
  samplingRate
32
32
  });
33
+ const isMetadataEmpty = Object.keys(experience.metadata).length === 0;
33
34
 
34
- if (metadata) {
35
+ if (metadata && isMetadataEmpty) {
35
36
  experience.addMetadata(metadata);
36
37
  }
37
38
  });
@@ -1 +1 @@
1
- export const isIntersectionObserverSupported = typeof window === 'undefined' ? false : !!window.IntersectionObserver;
1
+ export const isIntersectionObserverSupported = typeof window !== 'undefined' && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype;
@@ -14,6 +14,7 @@ export const MAX_ORDINAL = 100000;
14
14
  export const defaultEmojiHeight = 20;
15
15
  export const emojiPickerWidth = 350;
16
16
  export const emojiPickerHeight = 295;
17
+ export const emojiPickerHeightWithPreview = 348;
17
18
  export const localStoragePrefix = 'fabric.emoji';
18
19
  export const selectedToneStorageKey = `${localStoragePrefix}.selectedTone`;
19
20
  export const defaultCategories = ['PEOPLE', 'NATURE', 'FOODS', 'ACTIVITY', 'PLACES', 'OBJECTS', 'SYMBOLS', 'FLAGS'];
@@ -21,6 +22,6 @@ export const defaultListLimit = 50;
21
22
  export const migrationUserId = 'hipchat_migration_emoticons';
22
23
  export const analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker'; // This is the base sampling rate in Emoji
23
24
 
24
- export const SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in ResourceEmoji which will be used in stead of base sampling rate above
25
+ export const SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in fetching emoji resource
25
26
 
26
- export const SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = 0.1; // add more sampling rate in parent components like EmojiTypeAheadItem.
27
+ export const SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 0.01;
@@ -0,0 +1,12 @@
1
+ import { useInView as useInViewLib } from 'react-intersection-observer';
2
+ import { isIntersectionObserverSupported } from './browser-support';
3
+ export const useInView = options => {
4
+ const hookResult = useInViewLib(options);
5
+
6
+ if (!isIntersectionObserverSupported) {
7
+ // Unsupported, return no `ref` and default `inView` true value
8
+ return [undefined, true];
9
+ }
10
+
11
+ return hookResult;
12
+ };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.7.0",
3
+ "version": "65.1.0",
4
4
  "sideEffects": false
5
5
  }