@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.
- package/CHANGELOG.md +11 -0
- package/dist/cjs/components/common/ResourcedEmojiComponent.js +10 -5
- package/dist/cjs/components/picker/EmojiPickerComponent.js +12 -4
- package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/cjs/components/picker/styles.js +16 -13
- package/dist/cjs/hooks/index.js +16 -0
- package/dist/cjs/util/constants.js +3 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/components/common/ResourcedEmojiComponent.js +5 -4
- package/dist/es2019/components/picker/EmojiPickerComponent.js +13 -4
- package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/es2019/components/picker/styles.js +16 -14
- package/dist/es2019/hooks/index.js +8 -0
- package/dist/es2019/util/constants.js +1 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/components/common/ResourcedEmojiComponent.js +8 -4
- package/dist/esm/components/picker/EmojiPickerComponent.js +13 -4
- package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/esm/components/picker/styles.js +16 -14
- package/dist/esm/hooks/index.js +8 -0
- package/dist/esm/util/constants.js +1 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/api/EmojiResource.d.ts +2 -3
- package/dist/types/components/common/Emoji.d.ts +0 -1
- package/dist/types/components/common/LoadingEmojiComponent.d.ts +3 -0
- package/dist/types/components/common/ResourcedEmojiComponent.d.ts +23 -11
- package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
- package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
- package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
- package/dist/types/components/picker/styles.d.ts +1 -1
- package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/util/constants.d.ts +1 -0
- package/docs/0-intro.tsx +35 -27
- package/docs/1-resourced-emoji.tsx +74 -0
- package/docs/2-emoji-picker.tsx +56 -0
- package/docs/3-typeahead.tsx +20 -0
- package/docs/4-emoji-provider.tsx +98 -0
- 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
|
-
|
|
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
|
-
|
|
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 = (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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");
|
package/dist/cjs/version.json
CHANGED
|
@@ -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 =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
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';
|
|
@@ -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'];
|
package/dist/es2019/version.json
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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';
|
|
@@ -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'];
|
package/dist/esm/version.json
CHANGED
|
@@ -36,9 +36,8 @@ export interface EmojiResourceConfig {
|
|
|
36
36
|
*/
|
|
37
37
|
singleEmojiApi?: SingleEmojiApiLoaderConfig;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
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
|
}
|
|
@@ -1,36 +1,48 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import
|
|
3
|
-
import { EmojiId
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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 {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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",
|