@atlaskit/emoji 65.0.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 (39) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/components/common/ResourcedEmojiComponent.js +10 -5
  3. package/dist/cjs/components/picker/EmojiPickerComponent.js +12 -4
  4. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
  5. package/dist/cjs/components/picker/styles.js +16 -13
  6. package/dist/cjs/hooks/index.js +16 -0
  7. package/dist/cjs/util/constants.js +3 -1
  8. package/dist/cjs/version.json +1 -1
  9. package/dist/es2019/components/common/ResourcedEmojiComponent.js +5 -4
  10. package/dist/es2019/components/picker/EmojiPickerComponent.js +13 -4
  11. package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
  12. package/dist/es2019/components/picker/styles.js +16 -14
  13. package/dist/es2019/hooks/index.js +8 -0
  14. package/dist/es2019/util/constants.js +1 -0
  15. package/dist/es2019/version.json +1 -1
  16. package/dist/esm/components/common/ResourcedEmojiComponent.js +8 -4
  17. package/dist/esm/components/picker/EmojiPickerComponent.js +13 -4
  18. package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
  19. package/dist/esm/components/picker/styles.js +16 -14
  20. package/dist/esm/hooks/index.js +8 -0
  21. package/dist/esm/util/constants.js +1 -0
  22. package/dist/esm/version.json +1 -1
  23. package/dist/types/api/EmojiResource.d.ts +2 -3
  24. package/dist/types/components/common/Emoji.d.ts +0 -1
  25. package/dist/types/components/common/LoadingEmojiComponent.d.ts +3 -0
  26. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +23 -11
  27. package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
  28. package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
  29. package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
  30. package/dist/types/components/picker/styles.d.ts +1 -1
  31. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
  32. package/dist/types/hooks/index.d.ts +1 -0
  33. package/dist/types/util/constants.d.ts +1 -0
  34. package/docs/0-intro.tsx +35 -27
  35. package/docs/1-resourced-emoji.tsx +74 -0
  36. package/docs/2-emoji-picker.tsx +56 -0
  37. package/docs/3-typeahead.tsx +20 -0
  38. package/docs/4-emoji-provider.tsx +98 -0
  39. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
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
+
3
14
  ## 65.0.0
4
15
 
5
16
  ### Major Changes
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.ResourcedEmojiComponent = void 0;
10
+ exports.default = exports.ResourcedEmojiComponent = void 0;
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
@@ -47,13 +47,16 @@ var ResourcedEmojiComponentRenderStatesEnum;
47
47
  var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
48
48
  var emojiProvider = _ref.emojiProvider,
49
49
  emojiId = _ref.emojiId,
50
- showTooltip = _ref.showTooltip,
51
- customFallback = _ref.customFallback,
50
+ _ref$showTooltip = _ref.showTooltip,
51
+ showTooltip = _ref$showTooltip === void 0 ? false : _ref$showTooltip,
52
+ _ref$customFallback = _ref.customFallback,
53
+ customFallback = _ref$customFallback === void 0 ? undefined : _ref$customFallback,
52
54
  _ref$fitToHeight = _ref.fitToHeight,
53
55
  fitToHeight = _ref$fitToHeight === void 0 ? _constants.defaultEmojiHeight : _ref$fitToHeight,
54
56
  _ref$optimistic = _ref.optimistic,
55
57
  optimistic = _ref$optimistic === void 0 ? false : _ref$optimistic,
56
- optimisticImageURL = _ref.optimisticImageURL;
58
+ _ref$optimisticImageU = _ref.optimisticImageURL,
59
+ optimisticImageURL = _ref$optimisticImageU === void 0 ? undefined : _ref$optimisticImageU;
57
60
  var shortName = emojiId.shortName,
58
61
  id = emojiId.id,
59
62
  fallback = emojiId.fallback;
@@ -207,4 +210,6 @@ var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
207
210
  })));
208
211
  };
209
212
 
210
- exports.ResourcedEmojiComponent = ResourcedEmojiComponent;
213
+ exports.ResourcedEmojiComponent = ResourcedEmojiComponent;
214
+ var _default = ResourcedEmojiComponent;
215
+ exports.default = _default;
@@ -127,6 +127,11 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
127
127
  }
128
128
  });
129
129
  });
130
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onPreviewDisplayed", function (isDisplayed) {
131
+ _this.setState({
132
+ isPreviewDisplayed: isDisplayed
133
+ });
134
+ });
130
135
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onFileChooserClicked", function () {
131
136
  _this.fireAnalytics((0, _analytics.selectedFileEvent)());
132
137
  });
@@ -380,7 +385,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
380
385
  selectedTone: !hideToneSelector ? _emojiProvider.getSelectedTone() : undefined,
381
386
  loading: true,
382
387
  uploadSupported: false,
383
- uploading: false
388
+ uploading: false,
389
+ isPreviewDisplayed: false
384
390
  };
385
391
  _this.openTime = 0;
386
392
  return _this;
@@ -568,7 +574,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
568
574
  emojiToDelete = _this$state3.emojiToDelete,
569
575
  uploading = _this$state3.uploading,
570
576
  uploadErrorMessage = _this$state3.uploadErrorMessage,
571
- uploadSupported = _this$state3.uploadSupported;
577
+ uploadSupported = _this$state3.uploadSupported,
578
+ isPreviewDisplayed = _this$state3.isPreviewDisplayed;
572
579
  var recordUsageOnSelection = (0, _RecordSelectionDefault.createRecordSelectionDefault)(emojiProvider, this.onSelectWrapper, function (analytic) {
573
580
  return _this4.fireAnalytics(analytic('picker'));
574
581
  });
@@ -581,7 +588,7 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
581
588
  var picker = (0, _core.jsx)(_LegacyEmojiContextProvider.default, {
582
589
  emojiContextValue: emojiContextValue
583
590
  }, (0, _core.jsx)("div", {
584
- css: _styles.emojiPicker,
591
+ css: (0, _styles.emojiPicker)(isPreviewDisplayed),
585
592
  ref: this.handlePickerRef,
586
593
  "data-emoji-picker-container": true
587
594
  }, (0, _core.jsx)(_CategorySelector.default, {
@@ -617,7 +624,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
617
624
  onOpenUpload: this.onOpenUpload
618
625
  }), (0, _core.jsx)(_EmojiPickerFooter.default, {
619
626
  selectedEmoji: selectedEmoji,
620
- isUploading: uploading
627
+ isUploading: uploading,
628
+ onPreviewDisplayed: this.onPreviewDisplayed
621
629
  })));
622
630
  return picker;
623
631
  }
@@ -48,9 +48,11 @@ var EmojiPickerFooter = /*#__PURE__*/function (_PureComponent) {
48
48
  var previewFooterClassnames = [_styles.emojiPickerFooter, _styles.emojiPickerFooterWithTopShadow];
49
49
 
50
50
  if (!selectedEmoji || isUploading) {
51
+ this.props.onPreviewDisplayed(false);
51
52
  return null;
52
53
  }
53
54
 
55
+ this.props.onPreviewDisplayed(true);
54
56
  return (0, _core.jsx)("div", {
55
57
  css: previewFooterClassnames
56
58
  }, selectedEmoji && (0, _core.jsx)(_EmojiPreviewComponent.EmojiPreviewComponent, {
@@ -26,21 +26,24 @@ var _colors = require("@atlaskit/theme/colors");
26
26
  var _css4, _css5, _css6;
27
27
 
28
28
  // Level 1 - picker
29
- var emojiPicker = (0, _core.css)({
30
- display: 'flex',
31
- flexDirection: 'column',
32
- justifyContent: 'space-between',
33
- background: (0, _tokens.token)('elevation.surface.overlay', 'white'),
34
- border: "".concat(_sharedStyles.emojiPickerBorderColor, " 1px solid"),
35
- borderRadius: "".concat((0, _constants.borderRadius)(), "px"),
36
- boxShadow: _sharedStyles.emojiPickerBoxShadow,
37
- height: "".concat(_constants2.emojiPickerHeight, "px"),
38
- width: "".concat(_constants2.emojiPickerWidth, "px"),
39
- marginBottom: '8px',
40
- minWidth: "".concat(_constants2.emojiPickerWidth, "px")
41
- }); // Level 2
29
+ var emojiPicker = function emojiPicker(hasPreview) {
30
+ return (0, _core.css)({
31
+ display: 'flex',
32
+ flexDirection: 'column',
33
+ justifyContent: 'space-between',
34
+ background: (0, _tokens.token)('elevation.surface.overlay', 'white'),
35
+ border: "".concat(_sharedStyles.emojiPickerBorderColor, " 1px solid"),
36
+ borderRadius: "".concat((0, _constants.borderRadius)(), "px"),
37
+ boxShadow: _sharedStyles.emojiPickerBoxShadow,
38
+ height: "".concat(hasPreview ? _constants2.emojiPickerHeightWithPreview : _constants2.emojiPickerHeight, "px"),
39
+ width: "".concat(_constants2.emojiPickerWidth, "px"),
40
+ marginBottom: '8px',
41
+ minWidth: "".concat(_constants2.emojiPickerWidth, "px")
42
+ });
43
+ }; // Level 2
42
44
  /// Category Selector
43
45
 
46
+
44
47
  exports.emojiPicker = emojiPicker;
45
48
  var addButton = 'emoji-picker-add-button';
46
49
  exports.addButton = addButton;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.usePrevious = usePrevious;
7
+
8
+ var _react = require("react");
9
+
10
+ function usePrevious(value) {
11
+ var ref = (0, _react.useRef)();
12
+ (0, _react.useEffect)(function () {
13
+ ref.current = value;
14
+ }, [value]);
15
+ return ref.current;
16
+ }
@@ -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.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
6
+ exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeightWithPreview = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 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';
@@ -31,6 +31,8 @@ var emojiPickerWidth = 350;
31
31
  exports.emojiPickerWidth = emojiPickerWidth;
32
32
  var emojiPickerHeight = 295;
33
33
  exports.emojiPickerHeight = emojiPickerHeight;
34
+ var emojiPickerHeightWithPreview = 348;
35
+ exports.emojiPickerHeightWithPreview = emojiPickerHeightWithPreview;
34
36
  var localStoragePrefix = 'fabric.emoji';
35
37
  exports.localStoragePrefix = localStoragePrefix;
36
38
  var selectedToneStorageKey = "".concat(localStoragePrefix, ".selectedTone");
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "65.0.0",
3
+ "version": "65.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -20,11 +20,11 @@ var ResourcedEmojiComponentRenderStatesEnum;
20
20
  export const ResourcedEmojiComponent = ({
21
21
  emojiProvider,
22
22
  emojiId,
23
- showTooltip,
24
- customFallback,
23
+ showTooltip = false,
24
+ customFallback = undefined,
25
25
  fitToHeight = defaultEmojiHeight,
26
26
  optimistic = false,
27
- optimisticImageURL
27
+ optimisticImageURL = undefined
28
28
  }) => {
29
29
  const {
30
30
  shortName,
@@ -170,4 +170,5 @@ export const ResourcedEmojiComponent = ({
170
170
  showTooltip: showTooltip,
171
171
  fitToHeight: fitToHeight
172
172
  })));
173
- };
173
+ };
174
+ export default ResourcedEmojiComponent;
@@ -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
  });
@@ -353,7 +359,8 @@ 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
  }
@@ -525,7 +532,8 @@ export default class EmojiPickerComponent extends PureComponent {
525
532
  emojiToDelete,
526
533
  uploading,
527
534
  uploadErrorMessage,
528
- uploadSupported
535
+ uploadSupported,
536
+ isPreviewDisplayed
529
537
  } = this.state;
530
538
  const recordUsageOnSelection = createRecordSelectionDefault(emojiProvider, this.onSelectWrapper, analytic => this.fireAnalytics(analytic('picker')));
531
539
  const formattedErrorMessage = uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null;
@@ -537,7 +545,7 @@ export default class EmojiPickerComponent extends PureComponent {
537
545
  const picker = jsx(LegacyEmojiContextProvider, {
538
546
  emojiContextValue: emojiContextValue
539
547
  }, jsx("div", {
540
- css: emojiPicker,
548
+ css: emojiPicker(isPreviewDisplayed),
541
549
  ref: this.handlePickerRef,
542
550
  "data-emoji-picker-container": true
543
551
  }, jsx(CategorySelector, {
@@ -573,7 +581,8 @@ export default class EmojiPickerComponent extends PureComponent {
573
581
  onOpenUpload: this.onOpenUpload
574
582
  }), jsx(EmojiPickerFooter, {
575
583
  selectedEmoji: selectedEmoji,
576
- isUploading: uploading
584
+ isUploading: uploading,
585
+ onPreviewDisplayed: this.onPreviewDisplayed
577
586
  })));
578
587
  return picker;
579
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';
@@ -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
+ }
@@ -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'];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "65.0.0",
3
+ "version": "65.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -21,13 +21,16 @@ var ResourcedEmojiComponentRenderStatesEnum;
21
21
  export var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
22
22
  var emojiProvider = _ref.emojiProvider,
23
23
  emojiId = _ref.emojiId,
24
- showTooltip = _ref.showTooltip,
25
- customFallback = _ref.customFallback,
24
+ _ref$showTooltip = _ref.showTooltip,
25
+ showTooltip = _ref$showTooltip === void 0 ? false : _ref$showTooltip,
26
+ _ref$customFallback = _ref.customFallback,
27
+ customFallback = _ref$customFallback === void 0 ? undefined : _ref$customFallback,
26
28
  _ref$fitToHeight = _ref.fitToHeight,
27
29
  fitToHeight = _ref$fitToHeight === void 0 ? defaultEmojiHeight : _ref$fitToHeight,
28
30
  _ref$optimistic = _ref.optimistic,
29
31
  optimistic = _ref$optimistic === void 0 ? false : _ref$optimistic,
30
- optimisticImageURL = _ref.optimisticImageURL;
32
+ _ref$optimisticImageU = _ref.optimisticImageURL,
33
+ optimisticImageURL = _ref$optimisticImageU === void 0 ? undefined : _ref$optimisticImageU;
31
34
  var shortName = emojiId.shortName,
32
35
  id = emojiId.id,
33
36
  fallback = emojiId.fallback;
@@ -179,4 +182,5 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
179
182
  showTooltip: showTooltip,
180
183
  fitToHeight: fitToHeight
181
184
  })));
182
- };
185
+ };
186
+ export default ResourcedEmojiComponent;
@@ -102,6 +102,12 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
102
102
  });
103
103
  });
104
104
 
105
+ _defineProperty(_assertThisInitialized(_this), "onPreviewDisplayed", function (isDisplayed) {
106
+ _this.setState({
107
+ isPreviewDisplayed: isDisplayed
108
+ });
109
+ });
110
+
105
111
  _defineProperty(_assertThisInitialized(_this), "onFileChooserClicked", function () {
106
112
  _this.fireAnalytics(selectedFileEvent());
107
113
  });
@@ -375,7 +381,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
375
381
  selectedTone: !hideToneSelector ? _emojiProvider.getSelectedTone() : undefined,
376
382
  loading: true,
377
383
  uploadSupported: false,
378
- uploading: false
384
+ uploading: false,
385
+ isPreviewDisplayed: false
379
386
  };
380
387
  _this.openTime = 0;
381
388
  return _this;
@@ -560,7 +567,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
560
567
  emojiToDelete = _this$state3.emojiToDelete,
561
568
  uploading = _this$state3.uploading,
562
569
  uploadErrorMessage = _this$state3.uploadErrorMessage,
563
- uploadSupported = _this$state3.uploadSupported;
570
+ uploadSupported = _this$state3.uploadSupported,
571
+ isPreviewDisplayed = _this$state3.isPreviewDisplayed;
564
572
  var recordUsageOnSelection = createRecordSelectionDefault(emojiProvider, this.onSelectWrapper, function (analytic) {
565
573
  return _this4.fireAnalytics(analytic('picker'));
566
574
  });
@@ -573,7 +581,7 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
573
581
  var picker = jsx(LegacyEmojiContextProvider, {
574
582
  emojiContextValue: emojiContextValue
575
583
  }, jsx("div", {
576
- css: emojiPicker,
584
+ css: emojiPicker(isPreviewDisplayed),
577
585
  ref: this.handlePickerRef,
578
586
  "data-emoji-picker-container": true
579
587
  }, jsx(CategorySelector, {
@@ -609,7 +617,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
609
617
  onOpenUpload: this.onOpenUpload
610
618
  }), jsx(EmojiPickerFooter, {
611
619
  selectedEmoji: selectedEmoji,
612
- isUploading: uploading
620
+ isUploading: uploading,
621
+ onPreviewDisplayed: this.onPreviewDisplayed
613
622
  })));
614
623
  return picker;
615
624
  }
@@ -34,9 +34,11 @@ var EmojiPickerFooter = /*#__PURE__*/function (_PureComponent) {
34
34
  var previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
35
35
 
36
36
  if (!selectedEmoji || isUploading) {
37
+ this.props.onPreviewDisplayed(false);
37
38
  return null;
38
39
  }
39
40
 
41
+ this.props.onPreviewDisplayed(true);
40
42
  return jsx("div", {
41
43
  css: previewFooterClassnames
42
44
  }, selectedEmoji && jsx(EmojiPreviewComponent, {
@@ -7,22 +7,24 @@ import { token } from '@atlaskit/tokens';
7
7
  import { borderRadius } from '@atlaskit/theme/constants';
8
8
  import { emojiPickerBorderColor, emojiPickerBoxShadow } from '../../util/shared-styles';
9
9
  import { emojiSprite, placeholder, emojiNodeStyles } from '../common/styles';
10
- import { emojiPickerHeight, emojiPickerWidth } from '../../util/constants';
10
+ import { emojiPickerHeight, emojiPickerHeightWithPreview, emojiPickerWidth } from '../../util/constants';
11
11
  import { B200, B300, N100A, N200, N30, N30A, N50, N900 } from '@atlaskit/theme/colors'; // Level 1 - picker
12
12
 
13
- export var emojiPicker = css({
14
- display: 'flex',
15
- flexDirection: 'column',
16
- justifyContent: 'space-between',
17
- background: token('elevation.surface.overlay', 'white'),
18
- border: "".concat(emojiPickerBorderColor, " 1px solid"),
19
- borderRadius: "".concat(borderRadius(), "px"),
20
- boxShadow: emojiPickerBoxShadow,
21
- height: "".concat(emojiPickerHeight, "px"),
22
- width: "".concat(emojiPickerWidth, "px"),
23
- marginBottom: '8px',
24
- minWidth: "".concat(emojiPickerWidth, "px")
25
- }); // Level 2
13
+ export var emojiPicker = function emojiPicker(hasPreview) {
14
+ return css({
15
+ display: 'flex',
16
+ flexDirection: 'column',
17
+ justifyContent: 'space-between',
18
+ background: token('elevation.surface.overlay', 'white'),
19
+ border: "".concat(emojiPickerBorderColor, " 1px solid"),
20
+ borderRadius: "".concat(borderRadius(), "px"),
21
+ boxShadow: emojiPickerBoxShadow,
22
+ height: "".concat(hasPreview ? emojiPickerHeightWithPreview : emojiPickerHeight, "px"),
23
+ width: "".concat(emojiPickerWidth, "px"),
24
+ marginBottom: '8px',
25
+ minWidth: "".concat(emojiPickerWidth, "px")
26
+ });
27
+ }; // Level 2
26
28
  /// Category Selector
27
29
 
28
30
  export var addButton = 'emoji-picker-add-button';
@@ -0,0 +1,8 @@
1
+ import { useEffect, useRef } from 'react';
2
+ export function usePrevious(value) {
3
+ var ref = useRef();
4
+ useEffect(function () {
5
+ ref.current = value;
6
+ }, [value]);
7
+ return ref.current;
8
+ }
@@ -14,6 +14,7 @@ export var MAX_ORDINAL = 100000;
14
14
  export var defaultEmojiHeight = 20;
15
15
  export var emojiPickerWidth = 350;
16
16
  export var emojiPickerHeight = 295;
17
+ export var emojiPickerHeightWithPreview = 348;
17
18
  export var localStoragePrefix = 'fabric.emoji';
18
19
  export var selectedToneStorageKey = "".concat(localStoragePrefix, ".selectedTone");
19
20
  export var defaultCategories = ['PEOPLE', 'NATURE', 'FOODS', 'ACTIVITY', 'PLACES', 'OBJECTS', 'SYMBOLS', 'FLAGS'];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "65.0.0",
3
+ "version": "65.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -36,9 +36,8 @@ export interface EmojiResourceConfig {
36
36
  */
37
37
  singleEmojiApi?: SingleEmojiApiLoaderConfig;
38
38
  /**
39
- * Used for fetching emoji asset and render this asset before provider has been
40
- * downloaded to reduce the time the user is presented with a placeholder
41
- * while downloading the emoji meta data
39
+ * Renders an image while the provider is being downloaded to reduce the time
40
+ * the user is being presented with a placeholder
42
41
  */
43
42
  optimisticImageApi?: OptimisticImageApiLoaderConfig;
44
43
  }
@@ -11,7 +11,6 @@ export interface Props {
11
11
  selected?: boolean;
12
12
  /**
13
13
  * Automatically show the emoji as selected based on mouse hover.
14
- *
15
14
  * CSS, fast, does not require a re-render, but selected state not
16
15
  * externally controlled via props.
17
16
  */
@@ -1,6 +1,9 @@
1
1
  import { Component, ComponentType } from 'react';
2
2
  import { EmojiProvider } from '../../api/EmojiResource';
3
3
  export interface Props {
4
+ /**
5
+ * Emoji Resource instance
6
+ */
4
7
  emojiProvider: Promise<EmojiProvider>;
5
8
  }
6
9
  export interface State {
@@ -1,36 +1,48 @@
1
1
  import { FC } from 'react';
2
- import EmojiProvider from '../../api/EmojiResource';
3
- import { EmojiId, OptionalEmojiDescription } from '../../types';
4
- import { State as LoadingState } from './LoadingEmojiComponent';
2
+ import { EmojiResource } from '../../api/EmojiResource';
3
+ import { EmojiId } from '../../types';
5
4
  export interface BaseResourcedEmojiProps {
5
+ /**
6
+ * Emoji to display
7
+ */
6
8
  emojiId: EmojiId;
9
+ /**
10
+ * Allows to show the tooltip.
11
+ * Defaults to `false`.
12
+ */
7
13
  showTooltip?: boolean;
14
+ /**
15
+ * Scales the emoji proportionally to provided hight.
16
+ * Defaults to `undefined`.
17
+ */
8
18
  fitToHeight?: number;
9
19
  /**
10
20
  * Optimistic will call the fetch interface first and not wait for the entire emoji collection
11
21
  * to be available before rendering. This is useful for views or pages that show a select set of
12
22
  * emojis.
23
+ * Defaults to `false`.
13
24
  */
14
25
  optimistic?: boolean;
15
26
  /**
16
27
  * Custom Fallback allows a custom element or string to be rendered if an emoji fails to be fetched or found.
17
28
  * By default it takes the fallback or shortName inside emojiId, but if this prop is set it override the internal
18
29
  * fallbacks
19
- *
20
- * customFallback<Element | string> else emojiId.fallback else emojiId.shortName
30
+ * customFallback<Element | string> else emojiId.fallback else emojiId.shortName.
31
+ * Defaults to `undefined`.
21
32
  */
22
33
  customFallback?: JSX.Element | string;
23
34
  /**
24
35
  * Will attempt to render a highly condensed version of the emoji with an image url before showing the meta version.
25
- * All it required to work is an emojiId, imageUrl and some sizing (with good defaults)
36
+ * All that is required for optimistic images to render is an emojiId, imageUrl and sizing props.
37
+ * Defaults to `undefined`.
26
38
  */
27
39
  optimisticImageURL?: string;
28
40
  }
29
41
  export interface Props extends BaseResourcedEmojiProps {
30
- emojiProvider: EmojiProvider;
31
- }
32
- export interface State extends LoadingState {
33
- emoji: OptionalEmojiDescription;
34
- loaded: boolean;
42
+ /**
43
+ * EmojiResource instance that handles fetching of emoji data.
44
+ */
45
+ emojiProvider: EmojiResource;
35
46
  }
36
47
  export declare const ResourcedEmojiComponent: FC<Props>;
48
+ export default ResourcedEmojiComponent;
@@ -5,8 +5,17 @@ import { OnEmojiEvent } from '../../types';
5
5
  import LoadingEmojiComponent, { Props as LoadingProps, State as LoadingState } from '../common/LoadingEmojiComponent';
6
6
  import { PickerRefHandler, Props as ComponentProps } from './EmojiPickerComponent';
7
7
  export interface Props extends LoadingProps {
8
+ /**
9
+ * Callback to be executed on emoji selection.
10
+ */
8
11
  onSelection?: OnEmojiEvent;
12
+ /**
13
+ * Callback to handle picker reference.
14
+ */
9
15
  onPickerRef?: PickerRefHandler;
16
+ /**
17
+ * Flag to disable tone selector.
18
+ */
10
19
  hideToneSelector?: boolean;
11
20
  }
12
21
  export declare class EmojiPickerInternal extends LoadingEmojiComponent<Props & WithAnalyticsEventsProps, LoadingState> {
@@ -8,9 +8,21 @@ export interface PickerRefHandler {
8
8
  (ref: any): any;
9
9
  }
10
10
  export interface Props {
11
+ /**
12
+ * EmojiResource instance that handles emoji meta data.
13
+ */
11
14
  emojiProvider: EmojiProvider;
15
+ /**
16
+ * Callback to be executed when user selects an emoji.
17
+ */
12
18
  onSelection?: OnEmojiEvent;
19
+ /**
20
+ * Callback performed when picker reference is being set.
21
+ */
13
22
  onPickerRef?: PickerRefHandler;
23
+ /**
24
+ * Flag to disable tone selector.
25
+ */
14
26
  hideToneSelector?: boolean;
15
27
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
16
28
  }
@@ -30,6 +42,7 @@ export interface State {
30
42
  uploading: boolean;
31
43
  emojiToDelete?: EmojiDescription;
32
44
  loading: boolean;
45
+ isPreviewDisplayed?: boolean;
33
46
  }
34
47
  export default class EmojiPickerComponent extends PureComponent<Props, State> {
35
48
  static defaultProps: {
@@ -45,6 +58,7 @@ export default class EmojiPickerComponent extends PureComponent<Props, State> {
45
58
  onEmojiActive: (_emojiId: EmojiId, emoji?: EmojiDescription | undefined) => void;
46
59
  onCategoryActivated: (category: CategoryId | null) => void;
47
60
  onCategorySelected: (categoryId: CategoryId | null) => void;
61
+ onPreviewDisplayed: (isDisplayed: boolean) => void;
48
62
  onFileChooserClicked: () => void;
49
63
  private fireAnalytics;
50
64
  private calculateElapsedTime;
@@ -3,6 +3,7 @@ import { EmojiDescription } from '../../types';
3
3
  export interface Props {
4
4
  selectedEmoji?: EmojiDescription;
5
5
  isUploading: boolean;
6
+ onPreviewDisplayed: (isDisplayed: boolean) => void;
6
7
  }
7
8
  export default class EmojiPickerFooter extends PureComponent<Props, {}> {
8
9
  render(): JSX.Element | null;
@@ -1,4 +1,4 @@
1
- export declare const emojiPicker: import("@emotion/utils").SerializedStyles;
1
+ export declare const emojiPicker: (hasPreview?: boolean | undefined) => import("@emotion/utils").SerializedStyles;
2
2
  export declare const addButton = "emoji-picker-add-button";
3
3
  export declare const categorySelector: import("@emotion/utils").SerializedStyles;
4
4
  export declare const active: import("@emotion/utils").SerializedStyles;
@@ -6,14 +6,32 @@ export interface OnLifecycle {
6
6
  (): void;
7
7
  }
8
8
  export interface EmojiTypeAheadBaseProps {
9
+ /**
10
+ * Callback to be executed when user selects an emoji.
11
+ */
9
12
  onSelection?: OnEmojiEvent;
13
+ /**
14
+ * Search query.
15
+ */
10
16
  query?: string;
17
+ /**
18
+ * Number of results to be displayed in the search results list
19
+ */
11
20
  listLimit?: number;
21
+ /**
22
+ * Callback to be executed when typeahead component is being shown
23
+ */
12
24
  onOpen?: OnLifecycle;
25
+ /**
26
+ * Callback to be executed when typeahead component disappears
27
+ */
13
28
  onClose?: OnLifecycle;
14
29
  createAnalyticsEvent?: CreateUIAnalyticsEvent;
15
30
  }
16
31
  export interface Props extends EmojiTypeAheadBaseProps {
32
+ /**
33
+ * EmojiResource instance that handles fetching of emoji data.
34
+ */
17
35
  emojiProvider: EmojiProvider;
18
36
  }
19
37
  export interface State {
@@ -0,0 +1 @@
1
+ export declare function usePrevious<T>(value: T | null | undefined): T | null | undefined;
@@ -14,6 +14,7 @@ export declare const MAX_ORDINAL = 100000;
14
14
  export declare const defaultEmojiHeight = 20;
15
15
  export declare const emojiPickerWidth = 350;
16
16
  export declare const emojiPickerHeight = 295;
17
+ export declare const emojiPickerHeightWithPreview = 348;
17
18
  export declare const localStoragePrefix = "fabric.emoji";
18
19
  export declare const selectedToneStorageKey: string;
19
20
  export declare const defaultCategories: CategoryId[];
package/docs/0-intro.tsx CHANGED
@@ -1,11 +1,16 @@
1
1
  import React from 'react';
2
- import { md, Example, code, AtlassianInternalWarning } from '@atlaskit/docs';
3
- import SectionMessage, {
4
- SectionMessageAction,
5
- } from '@atlaskit/section-message';
2
+ import {
3
+ md,
4
+ Example,
5
+ code,
6
+ AtlassianInternalWarning,
7
+ Props,
8
+ } from '@atlaskit/docs';
9
+ import SectionMessage from '@atlaskit/section-message';
6
10
  import SimpleEmojiExample from '../examples/00-simple-emoji';
7
11
 
8
12
  const SimpleEmojiSource = require('!!raw-loader!../examples/00-simple-emoji');
13
+ const EmojiProps = require('!!extract-react-types-loader!../src/components/common/Emoji');
9
14
 
10
15
  export default md`
11
16
  ${(<AtlassianInternalWarning />)}
@@ -20,9 +25,9 @@ export default md`
20
25
 
21
26
  ${code`
22
27
  import EmojiPicker from '@atlaskit/emoji/picker';
23
- import { EmojiResource } from '@atlaskit/emoji/resource';
28
+ import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
24
29
 
25
- const emojiProvider = new EmojiResource({
30
+ const config: EmojiResourceConfig = {
26
31
  providers: [
27
32
  {
28
33
  url: 'https://emoji-example/emoji/standard',
@@ -36,7 +41,9 @@ export default md`
36
41
  }),
37
42
  },
38
43
  ],
39
- });
44
+ }
45
+
46
+ const emojiProvider = new EmojiResource(config);
40
47
 
41
48
  ReactDOM.render(
42
49
  <EmojiPicker
@@ -46,7 +53,25 @@ export default md`
46
53
  }}
47
54
  />,
48
55
  container,
49
- );`}
56
+ );
57
+ `}
58
+
59
+
60
+
61
+ ${(
62
+ <>
63
+ <br />
64
+ <SectionMessage
65
+ appearance="warning"
66
+ title="Emoji provider is required to be configured in order to use components from this package."
67
+ >
68
+ <p>
69
+ Please refer to `Emoji picker` section for more information on how to
70
+ configure emoji provider.
71
+ </p>
72
+ </SectionMessage>
73
+ </>
74
+ )}
50
75
 
51
76
  ### Other emoji components import examples
52
77
 
@@ -75,27 +100,10 @@ export default md`
75
100
  <Example
76
101
  packageName="@atlaskit/emoji"
77
102
  Component={SimpleEmojiExample}
78
- title="Emoji"
103
+ title=" Simple Emoji"
79
104
  source={SimpleEmojiSource}
80
105
  />
81
106
  )}
82
107
 
83
- ${(
84
- <SectionMessage
85
- appearance="warning"
86
- title="Props can not be displayed for the time being."
87
- actions={[
88
- {
89
- key: '1',
90
- href:
91
- 'https://bitbucket.org/atlassian/atlaskit-mk-2/src/master/packages/elements/emoji/src/components/common/Emoji.tsx',
92
- text: 'Emoji Props',
93
- },
94
- ].map(({ text, ...restAction }) => (
95
- <SectionMessageAction {...restAction}>{text}</SectionMessageAction>
96
- ))}
97
- >
98
- <p>You can still find props in the source code.</p>
99
- </SectionMessage>
100
- )}
108
+ ${(<Props props={EmojiProps} />)}
101
109
  `;
@@ -0,0 +1,74 @@
1
+ import React from 'react';
2
+ import { md, Example, code, Props } from '@atlaskit/docs';
3
+ import ResourcedEmojiExample from '../examples/23-optimistic-emoji';
4
+
5
+ const ResourcedEmojiSource = require('!!raw-loader!../examples/23-optimistic-emoji');
6
+ const ResourcedEmojiProps = require('!!extract-react-types-loader!../src/components/common/ResourcedEmojiComponent');
7
+
8
+ export default md`
9
+ ## Usage
10
+
11
+ Import the component in your React app as follows:
12
+
13
+ ${code`
14
+ import { ResourcedEmoji } from '@atlaskit/emoji';
15
+ import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
16
+
17
+ const config: EmojiResourceConfig = {
18
+ singleEmojiApi: {
19
+ getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId',
20
+ securityProvider: () => ({
21
+ headers: {
22
+ 'User-Context': '{{token}}',
23
+ Authorization: 'Bearer {{token}}',
24
+ },
25
+ })
26
+ },
27
+ optimisticImageApi: {
28
+ getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId/path',
29
+ securityProvider: () => ({
30
+ headers: {
31
+ 'User-Context': '{{token}}',
32
+ Authorization: 'Bearer {{token}}',
33
+ },
34
+ })
35
+ },
36
+ providers: [
37
+ {
38
+ url: 'https://emoji-example/emoji/standard',
39
+ },
40
+ {
41
+ url: 'https://emoji-example/emoji/site-id/site',
42
+ securityProvider: () => ({
43
+ headers: {
44
+ Authorization: 'Bearer {{token}}',
45
+ },
46
+ }),
47
+ },
48
+ ],
49
+ }
50
+
51
+ const emojiProvider = new EmojiResource(config);
52
+ const emojiId = { shortName: ':grimacing:', id: '1f603' };
53
+
54
+ ReactDOM.render(
55
+ <ResourcedEmoji
56
+ emojiId={emojiId}
57
+ emojiProvider={emojiProvider}
58
+ optimistic
59
+ optimisticImageURL={emojiProvider.getOptimisticImageURL(emojiId)}
60
+ />,
61
+ container,
62
+ );`}
63
+
64
+ ${(
65
+ <Example
66
+ packageName="@atlaskit/emoji"
67
+ Component={ResourcedEmojiExample}
68
+ title="Resourced Emoji"
69
+ source={ResourcedEmojiSource}
70
+ />
71
+ )}
72
+
73
+ ${(<Props props={ResourcedEmojiProps} />)}
74
+ `;
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { md, Example, code, Props } from '@atlaskit/docs';
3
+ import EmojiPickerExample from '../examples/05-standard-emoji-picker-with-upload';
4
+
5
+ const EmojiPickerSource = require('!!raw-loader!../examples/05-standard-emoji-picker-with-upload');
6
+ const EmojiPickerProps = require('!!extract-react-types-loader!../src/components/picker/EmojiPickerComponent');
7
+
8
+ export default md`
9
+ ## Usage
10
+
11
+ Import the component in your React app as follows:
12
+
13
+ ${code`
14
+ import EmojiPicker from '@atlaskit/emoji/picker';
15
+ import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
16
+
17
+ const config: EmojiResourceConfig = {
18
+ providers: [
19
+ {
20
+ url: 'https://emoji-example/emoji/standard',
21
+ },
22
+ {
23
+ url: 'https://emoji-example/emoji/site-id/site',
24
+ securityProvider: () => ({
25
+ headers: {
26
+ Authorization: 'Bearer token',
27
+ },
28
+ }),
29
+ },
30
+ ],
31
+ }
32
+
33
+ const emojiProvider = new EmojiResource(config);
34
+
35
+ ReactDOM.render(
36
+ <EmojiPicker
37
+ emojiProvider={emojiProvider}
38
+ onSelection={emoji => {
39
+ /* do something */
40
+ }}
41
+ />,
42
+ container,
43
+ );
44
+ `}
45
+
46
+ ${(
47
+ <Example
48
+ packageName="@atlaskit/emoji"
49
+ Component={EmojiPickerExample}
50
+ title="Emoji Picker"
51
+ source={EmojiPickerSource}
52
+ />
53
+ )}
54
+
55
+ ${(<Props props={EmojiPickerProps} />)}
56
+ `;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { md, Example, Props } from '@atlaskit/docs';
3
+ import TypeAheadiExample from '../examples/03-standard-emoji-typeahead';
4
+
5
+ const TypeAheadSource = require('!!raw-loader!../examples/03-standard-emoji-typeahead');
6
+ const TypeAheadProps = require('!!extract-react-types-loader!../src/components/typeahead/EmojiTypeAheadComponent');
7
+
8
+ export default md`
9
+
10
+ ${(
11
+ <Example
12
+ packageName="@atlaskit/emoji"
13
+ Component={TypeAheadiExample}
14
+ title="Typeahead"
15
+ source={TypeAheadSource}
16
+ />
17
+ )}
18
+
19
+ ${(<Props props={TypeAheadProps} />)}
20
+ `;
@@ -0,0 +1,98 @@
1
+ import React from 'react';
2
+ import { md, code } from '@atlaskit/docs';
3
+ import SectionMessage from '@atlaskit/section-message';
4
+
5
+ export default md`
6
+ Emoji provider mainly controls what type of emojis you want to support, how to resolve emojis, and how to upload custom emojis if enabled.
7
+
8
+ This is a basic example of emoji provider, supporting standard, atlassian, and site emojis:
9
+
10
+ ${code`
11
+ const emojiProvider = new EmojiResource({
12
+ providers: [
13
+ {
14
+ url: '/gateway/emoji/standard',
15
+ },
16
+ {
17
+ url: '/gateway/emoji/atlassian',
18
+ },
19
+ {
20
+ url: '/gateway/emoji/{cloudId}/site',
21
+ securityProvider: () => ({ headers: { Authorization: 'Bearer token' }}), // not needed if session token cookie is available.
22
+ },
23
+ ],
24
+ allowUpload: true,
25
+ currentUser: { id: { uid } }
26
+ });`}
27
+
28
+ ${(
29
+ <>
30
+ <br />
31
+ <SectionMessage
32
+ appearance="warning"
33
+ title="There should be only one instance of EmojiResource in your application"
34
+ >
35
+ <p>Make sure EmojiResource is initialised only once.</p>
36
+ </SectionMessage>
37
+ </>
38
+ )}
39
+
40
+ The emoji provider plays a vital role to glue with our backend emoji service. Emoji metadata is fetched based on the url defined in providers array.
41
+ After a successful fetch the emoji resource holds emoji data for rendering emoji in picker, single emoji or the typeahead component.
42
+ Uploading and rendering site specific emojis is only available for Atlassian services.
43
+
44
+ Initialising EmojiResource doesn't fetch emoji data on initialization. If EmojiResource is being passed into ResourcedEmoji, EmojiPicker or Typeahead no further action is required.
45
+ Emoji meta data will be fetched on first component render. If EmojiResource is being used outside of the context of the above components, fetching meta data requires to be triggered manually.
46
+
47
+ ${code`
48
+ const emojiProvider = new EmojiResource(emojiConfig);
49
+ emojiProvider.fetchEmojiProvider();
50
+ `}
51
+
52
+ ### Configuration options
53
+
54
+ ${code`
55
+ interface EmojiResourceConfig {
56
+ /**
57
+ * The service configuration for remotely recording emoji selections.
58
+ * A post will be performed to this URL with the EmojiId as the body.
59
+ */
60
+ recordConfig?: ServiceConfig;
61
+
62
+ /**
63
+ * This defines the different providers. Later providers will override earlier
64
+ * providers when performing shortName based look up.
65
+ */
66
+ providers: ServiceConfig[];
67
+
68
+ /**
69
+ * Must be set to true to enable upload support in the emoji components.
70
+ *
71
+ * Can be used for the restriction of the upload UI based on permissions, or feature flags.
72
+ *
73
+ * Note this also requires that other conditions are met (for example, one of the providers
74
+ * must support upload for the UploadingEmojiResource implementation of UploadingEmojiProvider).
75
+ */
76
+ allowUpload?: boolean;
77
+
78
+ /**
79
+ * Logged user in the Product.
80
+ */
81
+ currentUser?: User;
82
+
83
+ /**
84
+ * This is specifically used for fetching a meta information of a single emoji.
85
+ * Useful for when rendering a single or a subset of emojis on a page that does not require the
86
+ * whole provider list to be downloaded.
87
+ */
88
+ singleEmojiApi?: SingleEmojiApiLoaderConfig;
89
+
90
+ /**
91
+ * Renders an image while the provider is being downloaded to reduce the time
92
+ * the user is being presented with a placeholder
93
+ */
94
+ optimisticImageApi?: OptimisticImageApiLoaderConfig;
95
+ }
96
+ `}
97
+
98
+ `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "65.0.0",
3
+ "version": "65.1.0",
4
4
  "description": "Fabric emoji React components",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -58,7 +58,7 @@
58
58
  "@atlaskit/media-core": "^33.0.0",
59
59
  "@atlaskit/section-message": "^6.0.0",
60
60
  "@atlaskit/ssr": "*",
61
- "@atlaskit/util-data-test": "^17.4.0",
61
+ "@atlaskit/util-data-test": "^17.5.0",
62
62
  "@atlaskit/visual-regression": "*",
63
63
  "@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
64
64
  "@atlassian/ufo": "^0.1.10",