@atlaskit/emoji 68.0.4 → 69.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/dist/cjs/components/common/CachingEmoji.js +61 -21
  4. package/dist/cjs/components/common/DeletableEmojiTooltipContent.js +13 -4
  5. package/dist/cjs/components/common/EmojiActions.js +4 -4
  6. package/dist/cjs/components/common/EmojiUploadPreview.js +1 -1
  7. package/dist/cjs/components/common/ResourcedEmojiComponent.js +18 -3
  8. package/dist/cjs/components/common/RetryableButton.js +3 -1
  9. package/dist/cjs/components/compiled/common/DeleteButton.compiled.css +9 -0
  10. package/dist/cjs/components/compiled/common/DeleteButton.js +52 -0
  11. package/dist/cjs/components/compiled/common/Emoji.compiled.css +23 -0
  12. package/dist/cjs/components/compiled/common/Emoji.js +380 -0
  13. package/dist/cjs/components/compiled/common/EmojiActions.compiled.css +21 -0
  14. package/dist/cjs/components/compiled/common/EmojiActions.js +220 -0
  15. package/dist/cjs/components/compiled/common/EmojiDeletePreview.compiled.css +21 -0
  16. package/dist/cjs/components/compiled/common/EmojiDeletePreview.js +152 -0
  17. package/dist/cjs/components/compiled/common/EmojiErrorMessage.compiled.css +9 -0
  18. package/dist/cjs/components/compiled/common/EmojiErrorMessage.js +58 -0
  19. package/dist/cjs/components/compiled/common/EmojiFallback.compiled.css +7 -0
  20. package/dist/cjs/components/compiled/common/EmojiFallback.js +36 -0
  21. package/dist/cjs/components/compiled/common/EmojiPlaceholder.compiled.css +20 -0
  22. package/dist/cjs/components/compiled/common/EmojiPlaceholder.js +68 -0
  23. package/dist/cjs/components/compiled/common/EmojiPreviewComponent.compiled.css +52 -0
  24. package/dist/cjs/components/compiled/common/EmojiPreviewComponent.js +45 -0
  25. package/dist/cjs/components/compiled/common/EmojiRadioButton.compiled.css +39 -0
  26. package/dist/cjs/components/compiled/common/EmojiRadioButton.js +72 -0
  27. package/dist/cjs/components/compiled/common/EmojiUploadPicker.compiled.css +26 -0
  28. package/dist/cjs/components/compiled/common/EmojiUploadPicker.js +322 -0
  29. package/dist/cjs/components/compiled/common/EmojiUploadPreview.compiled.css +20 -0
  30. package/dist/cjs/components/compiled/common/EmojiUploadPreview.js +124 -0
  31. package/dist/cjs/components/compiled/common/RetryableButton.compiled.css +2 -0
  32. package/dist/cjs/components/compiled/common/RetryableButton.js +73 -0
  33. package/dist/cjs/components/compiled/common/Scrollable.compiled.css +13 -0
  34. package/dist/cjs/components/compiled/common/Scrollable.js +97 -0
  35. package/dist/cjs/components/compiled/common/TonePreviewButton.compiled.css +32 -0
  36. package/dist/cjs/components/compiled/common/TonePreviewButton.js +52 -0
  37. package/dist/cjs/components/compiled/common/ToneSelector.compiled.css +3 -0
  38. package/dist/cjs/components/compiled/common/ToneSelector.js +111 -0
  39. package/dist/cjs/components/compiled/common/ToolTipContentWithKeymap.compiled.css +7 -0
  40. package/dist/cjs/components/compiled/common/ToolTipContentWithKeymap.js +28 -0
  41. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
  42. package/dist/cjs/components/picker/EmojiPickerList.js +1 -0
  43. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +2 -1
  44. package/dist/cjs/components/typeahead/EmojiTypeAheadItem.js +1 -0
  45. package/dist/cjs/components/typeahead/EmojiTypeAheadList.js +3 -1
  46. package/dist/cjs/components/uploader/EmojiUploadComponent.js +2 -0
  47. package/dist/cjs/element.js +9 -15
  48. package/dist/cjs/index.js +3 -4
  49. package/dist/cjs/util/analytics/analytics.js +1 -1
  50. package/dist/es2019/components/common/CachingEmoji.js +63 -23
  51. package/dist/es2019/components/common/DeletableEmojiTooltipContent.js +14 -5
  52. package/dist/es2019/components/common/EmojiActions.js +4 -4
  53. package/dist/es2019/components/common/EmojiUploadPreview.js +1 -1
  54. package/dist/es2019/components/common/ResourcedEmojiComponent.js +20 -5
  55. package/dist/es2019/components/common/RetryableButton.js +3 -1
  56. package/dist/es2019/components/compiled/common/DeleteButton.compiled.css +9 -0
  57. package/dist/es2019/components/compiled/common/DeleteButton.js +40 -0
  58. package/dist/es2019/components/compiled/common/Emoji.compiled.css +23 -0
  59. package/dist/es2019/components/compiled/common/Emoji.js +368 -0
  60. package/dist/es2019/components/compiled/common/EmojiActions.compiled.css +21 -0
  61. package/dist/es2019/components/compiled/common/EmojiActions.js +195 -0
  62. package/dist/es2019/components/compiled/common/EmojiDeletePreview.compiled.css +21 -0
  63. package/dist/es2019/components/compiled/common/EmojiDeletePreview.js +126 -0
  64. package/dist/es2019/components/compiled/common/EmojiErrorMessage.compiled.css +9 -0
  65. package/dist/es2019/components/compiled/common/EmojiErrorMessage.js +51 -0
  66. package/dist/es2019/components/compiled/common/EmojiFallback.compiled.css +7 -0
  67. package/dist/es2019/components/compiled/common/EmojiFallback.js +33 -0
  68. package/dist/es2019/components/compiled/common/EmojiPlaceholder.compiled.css +21 -0
  69. package/dist/es2019/components/compiled/common/EmojiPlaceholder.js +51 -0
  70. package/dist/es2019/components/compiled/common/EmojiPreviewComponent.compiled.css +52 -0
  71. package/dist/es2019/components/compiled/common/EmojiPreviewComponent.js +29 -0
  72. package/dist/es2019/components/compiled/common/EmojiRadioButton.compiled.css +39 -0
  73. package/dist/es2019/components/compiled/common/EmojiRadioButton.js +58 -0
  74. package/dist/es2019/components/compiled/common/EmojiUploadPicker.compiled.css +26 -0
  75. package/dist/es2019/components/compiled/common/EmojiUploadPicker.js +276 -0
  76. package/dist/es2019/components/compiled/common/EmojiUploadPreview.compiled.css +20 -0
  77. package/dist/es2019/components/compiled/common/EmojiUploadPreview.js +96 -0
  78. package/dist/es2019/components/compiled/common/RetryableButton.compiled.css +2 -0
  79. package/dist/es2019/components/compiled/common/RetryableButton.js +67 -0
  80. package/dist/es2019/components/compiled/common/Scrollable.compiled.css +13 -0
  81. package/dist/es2019/components/compiled/common/Scrollable.js +69 -0
  82. package/dist/es2019/components/compiled/common/TonePreviewButton.compiled.css +32 -0
  83. package/dist/es2019/components/compiled/common/TonePreviewButton.js +41 -0
  84. package/dist/es2019/components/compiled/common/ToneSelector.compiled.css +3 -0
  85. package/dist/es2019/components/compiled/common/ToneSelector.js +99 -0
  86. package/dist/es2019/components/compiled/common/ToolTipContentWithKeymap.compiled.css +7 -0
  87. package/dist/es2019/components/compiled/common/ToolTipContentWithKeymap.js +17 -0
  88. package/dist/es2019/components/picker/EmojiPickerFooter.js +1 -1
  89. package/dist/es2019/components/picker/EmojiPickerList.js +2 -1
  90. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +2 -1
  91. package/dist/es2019/components/typeahead/EmojiTypeAheadItem.js +1 -1
  92. package/dist/es2019/components/typeahead/EmojiTypeAheadList.js +3 -2
  93. package/dist/es2019/components/uploader/EmojiUploadComponent.js +1 -1
  94. package/dist/es2019/element.js +9 -2
  95. package/dist/es2019/index.js +1 -2
  96. package/dist/es2019/util/analytics/analytics.js +1 -1
  97. package/dist/esm/components/common/CachingEmoji.js +63 -23
  98. package/dist/esm/components/common/DeletableEmojiTooltipContent.js +14 -5
  99. package/dist/esm/components/common/EmojiActions.js +4 -4
  100. package/dist/esm/components/common/EmojiUploadPreview.js +1 -1
  101. package/dist/esm/components/common/ResourcedEmojiComponent.js +20 -5
  102. package/dist/esm/components/common/RetryableButton.js +3 -1
  103. package/dist/esm/components/compiled/common/DeleteButton.compiled.css +9 -0
  104. package/dist/esm/components/compiled/common/DeleteButton.js +42 -0
  105. package/dist/esm/components/compiled/common/Emoji.compiled.css +23 -0
  106. package/dist/esm/components/compiled/common/Emoji.js +370 -0
  107. package/dist/esm/components/compiled/common/EmojiActions.compiled.css +21 -0
  108. package/dist/esm/components/compiled/common/EmojiActions.js +210 -0
  109. package/dist/esm/components/compiled/common/EmojiDeletePreview.compiled.css +21 -0
  110. package/dist/esm/components/compiled/common/EmojiDeletePreview.js +142 -0
  111. package/dist/esm/components/compiled/common/EmojiErrorMessage.compiled.css +9 -0
  112. package/dist/esm/components/compiled/common/EmojiErrorMessage.js +48 -0
  113. package/dist/esm/components/compiled/common/EmojiFallback.compiled.css +7 -0
  114. package/dist/esm/components/compiled/common/EmojiFallback.js +29 -0
  115. package/dist/esm/components/compiled/common/EmojiPlaceholder.compiled.css +20 -0
  116. package/dist/esm/components/compiled/common/EmojiPlaceholder.js +58 -0
  117. package/dist/esm/components/compiled/common/EmojiPreviewComponent.compiled.css +52 -0
  118. package/dist/esm/components/compiled/common/EmojiPreviewComponent.js +35 -0
  119. package/dist/esm/components/compiled/common/EmojiRadioButton.compiled.css +39 -0
  120. package/dist/esm/components/compiled/common/EmojiRadioButton.js +62 -0
  121. package/dist/esm/components/compiled/common/EmojiUploadPicker.compiled.css +26 -0
  122. package/dist/esm/components/compiled/common/EmojiUploadPicker.js +312 -0
  123. package/dist/esm/components/compiled/common/EmojiUploadPreview.compiled.css +20 -0
  124. package/dist/esm/components/compiled/common/EmojiUploadPreview.js +114 -0
  125. package/dist/esm/components/compiled/common/RetryableButton.compiled.css +2 -0
  126. package/dist/esm/components/compiled/common/RetryableButton.js +63 -0
  127. package/dist/esm/components/compiled/common/Scrollable.compiled.css +13 -0
  128. package/dist/esm/components/compiled/common/Scrollable.js +90 -0
  129. package/dist/esm/components/compiled/common/TonePreviewButton.compiled.css +32 -0
  130. package/dist/esm/components/compiled/common/TonePreviewButton.js +42 -0
  131. package/dist/esm/components/compiled/common/ToneSelector.compiled.css +3 -0
  132. package/dist/esm/components/compiled/common/ToneSelector.js +101 -0
  133. package/dist/esm/components/compiled/common/ToolTipContentWithKeymap.compiled.css +7 -0
  134. package/dist/esm/components/compiled/common/ToolTipContentWithKeymap.js +19 -0
  135. package/dist/esm/components/picker/EmojiPickerFooter.js +1 -1
  136. package/dist/esm/components/picker/EmojiPickerList.js +2 -1
  137. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +2 -1
  138. package/dist/esm/components/typeahead/EmojiTypeAheadItem.js +1 -1
  139. package/dist/esm/components/typeahead/EmojiTypeAheadList.js +3 -2
  140. package/dist/esm/components/uploader/EmojiUploadComponent.js +1 -1
  141. package/dist/esm/element.js +9 -2
  142. package/dist/esm/index.js +1 -2
  143. package/dist/esm/util/analytics/analytics.js +1 -1
  144. package/dist/types/components/common/EmojiActions.d.ts +2 -2
  145. package/dist/types/components/compiled/common/DeleteButton.d.ts +8 -0
  146. package/dist/types/components/compiled/common/Emoji.d.ts +95 -0
  147. package/dist/types/components/compiled/common/EmojiActions.d.ts +34 -0
  148. package/dist/types/components/compiled/common/EmojiDeletePreview.d.ts +21 -0
  149. package/dist/types/components/compiled/common/EmojiErrorMessage.d.ts +14 -0
  150. package/dist/types/components/compiled/common/EmojiFallback.d.ts +8 -0
  151. package/dist/types/components/compiled/common/EmojiPlaceholder.d.ts +12 -0
  152. package/dist/types/components/compiled/common/EmojiPreviewComponent.d.ts +7 -0
  153. package/dist/types/components/compiled/common/EmojiRadioButton.d.ts +16 -0
  154. package/dist/types/components/compiled/common/EmojiUploadPicker.d.ts +20 -0
  155. package/dist/types/components/compiled/common/EmojiUploadPreview.d.ts +18 -0
  156. package/dist/types/components/compiled/common/RetryableButton.d.ts +14 -0
  157. package/dist/types/components/compiled/common/Scrollable.d.ts +19 -0
  158. package/dist/types/components/compiled/common/TonePreviewButton.d.ts +14 -0
  159. package/dist/types/components/compiled/common/ToneSelector.d.ts +15 -0
  160. package/dist/types/components/compiled/common/ToolTipContentWithKeymap.d.ts +11 -0
  161. package/dist/types/element.d.ts +5 -2
  162. package/dist/types/index.d.ts +1 -2
  163. package/dist/types-ts4.5/components/common/EmojiActions.d.ts +2 -2
  164. package/dist/types-ts4.5/components/compiled/common/DeleteButton.d.ts +8 -0
  165. package/dist/types-ts4.5/components/compiled/common/Emoji.d.ts +95 -0
  166. package/dist/types-ts4.5/components/compiled/common/EmojiActions.d.ts +34 -0
  167. package/dist/types-ts4.5/components/compiled/common/EmojiDeletePreview.d.ts +21 -0
  168. package/dist/types-ts4.5/components/compiled/common/EmojiErrorMessage.d.ts +14 -0
  169. package/dist/types-ts4.5/components/compiled/common/EmojiFallback.d.ts +8 -0
  170. package/dist/types-ts4.5/components/compiled/common/EmojiPlaceholder.d.ts +12 -0
  171. package/dist/types-ts4.5/components/compiled/common/EmojiPreviewComponent.d.ts +7 -0
  172. package/dist/types-ts4.5/components/compiled/common/EmojiRadioButton.d.ts +16 -0
  173. package/dist/types-ts4.5/components/compiled/common/EmojiUploadPicker.d.ts +20 -0
  174. package/dist/types-ts4.5/components/compiled/common/EmojiUploadPreview.d.ts +18 -0
  175. package/dist/types-ts4.5/components/compiled/common/RetryableButton.d.ts +14 -0
  176. package/dist/types-ts4.5/components/compiled/common/Scrollable.d.ts +19 -0
  177. package/dist/types-ts4.5/components/compiled/common/TonePreviewButton.d.ts +14 -0
  178. package/dist/types-ts4.5/components/compiled/common/ToneSelector.d.ts +15 -0
  179. package/dist/types-ts4.5/components/compiled/common/ToolTipContentWithKeymap.d.ts +11 -0
  180. package/dist/types-ts4.5/element.d.ts +5 -2
  181. package/dist/types-ts4.5/index.d.ts +1 -2
  182. package/package.json +10 -2
@@ -0,0 +1,276 @@
1
+ /* EmojiUploadPicker.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import "./EmojiUploadPicker.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { useEffect, useLayoutEffect, useState, useRef, memo, useCallback } from 'react';
6
+ import { N300 } from '@atlaskit/theme/colors';
7
+ import { FormattedMessage, injectIntl } from 'react-intl-next';
8
+ import TextField from '@atlaskit/textfield';
9
+ import CrossIcon from '@atlaskit/icon/core/migration/close--cross';
10
+ import AkButton from '@atlaskit/button/standard-button';
11
+ import { Text } from '@atlaskit/primitives';
12
+ import FocusLock from 'react-focus-lock';
13
+ import * as ImageUtil from '../../../util/image';
14
+ import debug from '../../../util/logger';
15
+ import { messages } from '../../i18n';
16
+ import EmojiErrorMessage from './EmojiErrorMessage';
17
+ import EmojiUploadPreview from './EmojiUploadPreview';
18
+ import FileChooser from '../../common/FileChooser';
19
+ import { UploadStatus } from '../../common/internal-types';
20
+ const closeEmojiUploadButton = null;
21
+ const emojiUpload = null;
22
+ const emojiUploadTop = null;
23
+ const headingH5 = null;
24
+ const uploadChooseFileEmojiName = null;
25
+ const uploadChooseFileMessage = null;
26
+ const uploadChooseFileRow = null;
27
+ export const uploadEmojiNameInputTestId = 'upload-emoji-name-input';
28
+ export const uploadEmojiComponentTestId = 'upload-emoji-component';
29
+ export const cancelEmojiUploadPickerTestId = 'cancel-emoji-upload-picker';
30
+ const disallowedReplacementsMap = new Map([[':', ''], ['!', ''], ['@', ''], ['#', ''], ['%', ''], ['^', ''], ['&', ''], ['*', ''], ['(', ''], [')', ''], [' ', '_']]);
31
+ const sanitizeName = name => {
32
+ // prevent / replace certain characters, allow others
33
+ disallowedReplacementsMap.forEach((replaceWith, exclude) => {
34
+ name = name.split(exclude).join(replaceWith);
35
+ });
36
+ return name;
37
+ };
38
+ const maxNameLength = 50;
39
+ const toEmojiName = uploadName => {
40
+ const name = uploadName.split('_').join(' ');
41
+ return `${name.substr(0, 1).toLocaleUpperCase()}${name.substr(1)}`;
42
+ };
43
+ const ChooseEmojiFile = /*#__PURE__*/memo(props => {
44
+ const {
45
+ name = '',
46
+ onChooseFile,
47
+ onClick,
48
+ onNameChange,
49
+ onUploadCancelled,
50
+ errorMessage,
51
+ intl
52
+ } = props;
53
+ const {
54
+ formatMessage
55
+ } = intl;
56
+ const disableChooser = !name;
57
+ const fileChooserButtonDescriptionId = 'choose.emoji.file.button.screen.reader.description.id';
58
+ const inputRef = useRef(null);
59
+ const onKeyDownHandler = useCallback(event => {
60
+ if (event.key === 'Escape') {
61
+ onUploadCancelled();
62
+ }
63
+ }, [onUploadCancelled]);
64
+ useLayoutEffect(() => {
65
+ requestAnimationFrame(() => {
66
+ var _inputRef$current;
67
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
68
+ });
69
+ }, []);
70
+ const cancelLabel = formatMessage(messages.cancelLabel);
71
+ const emojiPlaceholder = formatMessage(messages.emojiPlaceholder);
72
+ const emojiNameAriaLabel = formatMessage(messages.emojiNameAriaLabel);
73
+ const emojiChooseFileTitle = formatMessage(messages.emojiChooseFileTitle);
74
+ return /*#__PURE__*/React.createElement("div", {
75
+ "data-testid": uploadEmojiComponentTestId,
76
+ className: ax(["_ca0q19bv _u5f319bv _n3td19bv _19bv19bv _4t3icae7 _1e0c1txw _2lx21bp4 _1bah1b1v"])
77
+ }, /*#__PURE__*/React.createElement("div", {
78
+ className: ax(["_11c8dcr7 _n3td1v6z _1e0c1txw _1bah1yb4 _4cvresu3"])
79
+ }, /*#__PURE__*/React.createElement("label", {
80
+ htmlFor: "new-emoji-name-input",
81
+ className: ax(["_1w901n3s", "_fqoxdcr7 _12r21pd9"])
82
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.addCustomEmojiLabel)), /*#__PURE__*/React.createElement("div", {
83
+ className: ax(["_1e0c1txw"])
84
+ }, /*#__PURE__*/React.createElement(AkButton, {
85
+ onClick: onUploadCancelled,
86
+ "aria-label": cancelLabel,
87
+ appearance: "subtle",
88
+ spacing: "none",
89
+ shouldFitContainer: true,
90
+ testId: cancelEmojiUploadPickerTestId
91
+ }, /*#__PURE__*/React.createElement(CrossIcon, {
92
+ color: "currentColor",
93
+ LEGACY_size: "small",
94
+ label: cancelLabel
95
+ })))), /*#__PURE__*/React.createElement("div", {
96
+ className: ax(["_1e0c1txw _1bah1yb4 _n3td1v6z"])
97
+ }, /*#__PURE__*/React.createElement("span", {
98
+ className: ax(["_16jlkb7n _1o9zkb7n _i0dl1wug _2hwx14y2 _1rwq1j28 _scffidpf _xmji1r31 _gxxuglyw _34ir1o36 _coc6glyw _9bj2glyw"])
99
+ }, /*#__PURE__*/React.createElement(TextField, {
100
+ placeholder: emojiPlaceholder,
101
+ "aria-label": emojiNameAriaLabel,
102
+ maxLength: maxNameLength,
103
+ onChange: onNameChange,
104
+ onKeyDown: onKeyDownHandler,
105
+ value: name,
106
+ isCompact: true,
107
+ autoFocus: true,
108
+ testId: uploadEmojiNameInputTestId,
109
+ ref: inputRef,
110
+ id: "new-emoji-name-input",
111
+ "aria-required": true
112
+ })), /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, () => /*#__PURE__*/React.createElement(FileChooser, {
113
+ label: emojiChooseFileTitle,
114
+ onChange: onChooseFile,
115
+ onClick: onClick,
116
+ accept: "image/png,image/jpeg,image/gif",
117
+ ariaDescribedBy: fileChooserButtonDescriptionId,
118
+ isDisabled: disableChooser
119
+ })))), /*#__PURE__*/React.createElement("div", {
120
+ id: fileChooserButtonDescriptionId
121
+ }, !errorMessage ? /*#__PURE__*/React.createElement(Text, {
122
+ as: "p",
123
+ size: "small"
124
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiImageRequirements)) : /*#__PURE__*/React.createElement(EmojiErrorMessage, {
125
+ errorStyle: "chooseFile",
126
+ message: errorMessage
127
+ })));
128
+ });
129
+ const EmojiUploadPicker = props => {
130
+ var _document$activeEleme;
131
+ const {
132
+ errorMessage,
133
+ initialUploadName,
134
+ onUploadEmoji,
135
+ onFileChooserClicked,
136
+ onUploadCancelled,
137
+ intl
138
+ } = props;
139
+ const [uploadStatus, setUploadStatus] = useState(errorMessage ? UploadStatus.Error : UploadStatus.Waiting);
140
+ const [chooseEmojiErrorMessage, setChooseEmojiErrorMessage] = useState();
141
+ const [name, setName] = useState(initialUploadName && sanitizeName(initialUploadName));
142
+ const [filename, setFilename] = useState();
143
+ const [previewImage, setPreviewImage] = useState();
144
+ // document is undefined during ssr rendering and throws an error
145
+ const lastFocusedElementId = useRef(typeof document !== 'undefined' ? (_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.id : '');
146
+ useEffect(() => {
147
+ if (errorMessage) {
148
+ setUploadStatus(UploadStatus.Error);
149
+ return;
150
+ } else {
151
+ if (uploadStatus === UploadStatus.Error) {
152
+ setUploadStatus(UploadStatus.Waiting);
153
+ }
154
+ }
155
+ }, [errorMessage, uploadStatus]);
156
+ useEffect(() => {
157
+ if (initialUploadName) {
158
+ setName(sanitizeName(initialUploadName));
159
+ }
160
+ }, [initialUploadName]);
161
+ const clearUploadPicker = useCallback(() => {
162
+ setName(undefined);
163
+ setPreviewImage(undefined);
164
+ setUploadStatus(UploadStatus.Waiting);
165
+ }, []);
166
+ const onNameChange = useCallback(event => {
167
+ let newName = sanitizeName(event.target.value);
168
+ if (name !== newName) {
169
+ setName(newName);
170
+ }
171
+ }, [name]);
172
+ const onAddEmoji = useCallback(() => {
173
+ if (uploadStatus === UploadStatus.Uploading) {
174
+ return;
175
+ }
176
+ if (filename && name && previewImage) {
177
+ const notifyUpload = size => {
178
+ const {
179
+ width,
180
+ height
181
+ } = size;
182
+ setUploadStatus(UploadStatus.Uploading);
183
+ onUploadEmoji({
184
+ name: toEmojiName(name),
185
+ shortName: `:${name}:`,
186
+ filename,
187
+ dataURL: previewImage,
188
+ width,
189
+ height
190
+ }, uploadStatus === UploadStatus.Error, clearUploadPicker);
191
+ };
192
+ ImageUtil.getNaturalImageSize(previewImage).then(size => {
193
+ notifyUpload(size);
194
+ }).catch(error => {
195
+ debug('getNaturalImageSize error', error);
196
+ // Just set arbitrary size, worse case is it may render
197
+ // in wrong aspect ratio in some circumstances.
198
+ notifyUpload({
199
+ width: 32,
200
+ height: 32
201
+ });
202
+ });
203
+ }
204
+ }, [clearUploadPicker, filename, name, onUploadEmoji, previewImage, uploadStatus]);
205
+ const cancelChooseFile = useCallback(() => {
206
+ setPreviewImage(undefined);
207
+ }, []);
208
+ const errorOnUpload = useCallback(event => {
209
+ debug('File load error: ', event);
210
+ setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiUploadFailed));
211
+ cancelChooseFile();
212
+ }, [cancelChooseFile]);
213
+ const onFileLoad = useCallback(file => async f => {
214
+ try {
215
+ setFilename(file.name);
216
+ await ImageUtil.parseImage(f.target.result);
217
+ setPreviewImage(f.target.result);
218
+ } catch {
219
+ setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiInvalidImage));
220
+ cancelChooseFile();
221
+ }
222
+ }, [cancelChooseFile]);
223
+ const onChooseFile = useCallback(event => {
224
+ const files = event.target.files;
225
+ if (files.length) {
226
+ const reader = new FileReader();
227
+ const file = files[0];
228
+ if (ImageUtil.hasFileExceededSize(file)) {
229
+ setChooseEmojiErrorMessage( /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiImageTooBig));
230
+ cancelChooseFile();
231
+ return;
232
+ }
233
+ reader.addEventListener('load', onFileLoad(file));
234
+ reader.addEventListener('abort', errorOnUpload);
235
+ reader.addEventListener('error', errorOnUpload);
236
+ reader.readAsDataURL(file);
237
+ } else {
238
+ cancelChooseFile();
239
+ }
240
+ }, [cancelChooseFile, errorOnUpload, onFileLoad]);
241
+ const cancelUpload = useCallback(() => {
242
+ clearUploadPicker();
243
+ onUploadCancelled();
244
+
245
+ // using setTimeout here to allow the UI to update before setting focus
246
+ setTimeout(lastFocus => {
247
+ if (lastFocus) {
248
+ var _document$getElementB;
249
+ (_document$getElementB = document.getElementById(lastFocus)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.focus();
250
+ }
251
+ }, 0, lastFocusedElementId.current);
252
+ }, [clearUploadPicker, onUploadCancelled]);
253
+ const onChooseFileClicked = () => {
254
+ onFileChooserClicked && onFileChooserClicked();
255
+ };
256
+ return /*#__PURE__*/React.createElement(FocusLock, {
257
+ noFocusGuards: true
258
+ }, name && previewImage ? /*#__PURE__*/React.createElement(EmojiUploadPreview, {
259
+ errorMessage: errorMessage,
260
+ name: name,
261
+ onAddEmoji: onAddEmoji,
262
+ onUploadCancelled: cancelUpload,
263
+ previewImage: previewImage,
264
+ uploadStatus: uploadStatus
265
+ }) : /*#__PURE__*/React.createElement(ChooseEmojiFile, {
266
+ name: name,
267
+ onChooseFile: onChooseFile,
268
+ onClick: onChooseFileClicked,
269
+ onNameChange: onNameChange,
270
+ onUploadCancelled: cancelUpload,
271
+ errorMessage: chooseEmojiErrorMessage,
272
+ intl: intl
273
+ }));
274
+ };
275
+ const EmojiUploadPickerComponent = injectIntl( /*#__PURE__*/memo(EmojiUploadPicker));
276
+ export default EmojiUploadPickerComponent;
@@ -0,0 +1,20 @@
1
+
2
+ ._1fztdcr7 h5{font:var(--ds-font-body-UNSAFE_small,normal 400 9pt/1pc ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._2rkosqtm{border-radius:var(--ds-border-radius-100,3px)}._19bv19bv{padding-left:10px}
4
+ ._19bv1b66{padding-left:var(--ds-space-050,4px)}
5
+ ._19l31ylp img{max-height:40px}
6
+ ._19l3gktf img{max-height:20px}
7
+ ._1bah1yb4{justify-content:space-between}
8
+ ._1bahesu3{justify-content:flex-end}
9
+ ._1e0c1txw{display:flex}
10
+ ._2lx21bp4{flex-direction:column}
11
+ ._4cvr1h6o{align-items:center}
12
+ ._4t3i53f4{height:75pt}
13
+ ._avw21b66 h5{padding-bottom:var(--ds-space-050,4px)}
14
+ ._bfhk1s4m{background-color:var(--ds-background-neutral,#f4f5f7)}
15
+ ._ca0q19bv{padding-top:10px}
16
+ ._jl6w1n3s h5{color:var(--ds-text-subtle,#5e6c84)}
17
+ ._n3td19bv{padding-bottom:10px}
18
+ ._rtys12am img{max-width:50px}
19
+ ._rtys53f4 img{max-width:75pt}
20
+ ._u5f319bv{padding-right:10px}
@@ -0,0 +1,96 @@
1
+ /* EmojiUploadPreview.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import "./EmojiUploadPreview.compiled.css";
4
+ import * as React from 'react';
5
+ import { ax, ix } from "@compiled/react/runtime";
6
+ import { PureComponent } from 'react';
7
+ import { N20, N300 } from '@atlaskit/theme/colors';
8
+ import AkButton from '@atlaskit/button/standard-button';
9
+ import Heading from '@atlaskit/heading';
10
+ import { FormattedMessage, injectIntl } from 'react-intl-next';
11
+ import { customCategory } from '../../../util/constants';
12
+ import { messages } from '../../i18n';
13
+ import Emoji from './Emoji';
14
+ import EmojiErrorMessage from './EmojiErrorMessage';
15
+ import { UploadStatus } from '../../common/internal-types';
16
+ import RetryableButton from './RetryableButton';
17
+ const bigEmojiPreview = null;
18
+ const uploadAddRow = null;
19
+ const uploadPreview = null;
20
+ const uploadPreviewFooter = null;
21
+ const uploadPreviewText = null;
22
+ export const uploadPreviewTestId = 'upload-preview';
23
+ export const cancelUploadButtonTestId = 'cancel-upload-button';
24
+ const addEmojiPreviewDescriptionId = 'fabric.emoji.preview.description.id';
25
+ class EmojiUploadPreview extends PureComponent {
26
+ render() {
27
+ const {
28
+ name,
29
+ previewImage,
30
+ uploadStatus,
31
+ errorMessage,
32
+ onAddEmoji,
33
+ onUploadCancelled,
34
+ intl
35
+ } = this.props;
36
+ const {
37
+ formatMessage
38
+ } = intl;
39
+ let emojiComponent;
40
+ if (previewImage) {
41
+ const emoji = {
42
+ shortName: `:${name}:`,
43
+ type: customCategory,
44
+ category: customCategory,
45
+ representation: {
46
+ imagePath: previewImage,
47
+ width: 24,
48
+ height: 24
49
+ },
50
+ searchable: true
51
+ };
52
+ emojiComponent = /*#__PURE__*/React.createElement(Emoji, {
53
+ emoji: emoji
54
+ });
55
+ }
56
+ const uploading = uploadStatus === UploadStatus.Uploading;
57
+ const retryableButtonLabel = errorMessage ? formatMessage(messages.retryLabel) : formatMessage(messages.addEmojiLabel);
58
+ return /*#__PURE__*/React.createElement("div", {
59
+ className: ax(["_ca0q19bv _u5f319bv _n3td19bv _19bv19bv _1e0c1txw _2lx21bp4 _4t3i53f4"])
60
+ }, /*#__PURE__*/React.createElement("div", {
61
+ "data-testid": uploadPreviewTestId,
62
+ className: ax(["_2rkosqtm _ca0q19bv _u5f319bv _n3td19bv _19bv19bv _1e0c1txw _1bah1yb4 _4cvr1h6o _bfhk1s4m"])
63
+ }, /*#__PURE__*/React.createElement("div", {
64
+ className: ax(["_1fztdcr7 _jl6w1n3s _avw21b66 _19l3gktf _rtys12am"])
65
+ }, /*#__PURE__*/React.createElement(Heading, {
66
+ size: "xsmall"
67
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiPreviewTitle)), /*#__PURE__*/React.createElement("div", {
68
+ id: addEmojiPreviewDescriptionId
69
+ }, /*#__PURE__*/React.createElement(FormattedMessage, _extends({}, messages.emojiPreview, {
70
+ values: {
71
+ emoji: emojiComponent
72
+ }
73
+ })))), /*#__PURE__*/React.createElement("div", {
74
+ className: ax(["_19bv1b66 _19l31ylp _rtys53f4"])
75
+ }, emojiComponent)), /*#__PURE__*/React.createElement("div", {
76
+ className: ax(["_1e0c1txw _1bahesu3 _4cvr1h6o _ca0q19bv"])
77
+ }, !uploading && errorMessage ? /*#__PURE__*/React.createElement(EmojiErrorMessage, {
78
+ errorStyle: "preview",
79
+ message: errorMessage,
80
+ tooltip: true
81
+ }) : null, /*#__PURE__*/React.createElement(RetryableButton, {
82
+ label: retryableButtonLabel,
83
+ onSubmit: onAddEmoji,
84
+ appearance: "primary",
85
+ loading: uploading,
86
+ error: !!errorMessage,
87
+ ariaDescribedBy: addEmojiPreviewDescriptionId
88
+ }), /*#__PURE__*/React.createElement(AkButton, {
89
+ onClick: onUploadCancelled,
90
+ appearance: "subtle",
91
+ isDisabled: uploading,
92
+ testId: cancelUploadButtonTestId
93
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.cancelLabel))));
94
+ }
95
+ }
96
+ export default injectIntl(EmojiUploadPreview);
@@ -0,0 +1,2 @@
1
+ ._18u019bv{margin-left:10px}
2
+ ._2hwx19bv{margin-right:10px}
@@ -0,0 +1,67 @@
1
+ /* RetryableButton.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import "./RetryableButton.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { FormattedMessage } from 'react-intl-next';
6
+ import AkButton from '@atlaskit/button/new';
7
+ import Spinner from '@atlaskit/spinner';
8
+ import { Box } from '@atlaskit/primitives/compiled';
9
+ import { messages } from '../../i18n';
10
+ const buttonSpinner = null;
11
+ export const retryUploadButtonTestId = 'retry-upload-button';
12
+ export const uploadEmojiButtonTestId = 'upload-emoji-button';
13
+ const LoadingSpinner = () => {
14
+ return /*#__PURE__*/React.createElement("span", {
15
+ className: ax(["_2hwx19bv _18u019bv"])
16
+ }, /*#__PURE__*/React.createElement(Spinner, null));
17
+ };
18
+ const RetryButton = props => {
19
+ const {
20
+ onSubmit,
21
+ ariaLabelledBy,
22
+ ariaDescribedBy
23
+ } = props;
24
+ return /*#__PURE__*/React.createElement(FormattedMessage, messages.retryLabel, retryLabel => /*#__PURE__*/React.createElement(Box, {
25
+ paddingInlineEnd: "space.050"
26
+ }, /*#__PURE__*/React.createElement(AkButton, {
27
+ appearance: "warning",
28
+ onClick: onSubmit,
29
+ testId: retryUploadButtonTestId,
30
+ "aria-describedby": ariaDescribedBy,
31
+ "aria-labelledby": ariaLabelledBy,
32
+ autoFocus: true
33
+ }, retryLabel)));
34
+ };
35
+ const UploadButton = props => {
36
+ const {
37
+ appearance,
38
+ onSubmit,
39
+ label,
40
+ ariaLabelledBy,
41
+ ariaDescribedBy
42
+ } = props;
43
+ return /*#__PURE__*/React.createElement(Box, {
44
+ paddingInlineEnd: "space.050"
45
+ }, /*#__PURE__*/React.createElement(AkButton, {
46
+ appearance: appearance,
47
+ onClick: onSubmit,
48
+ testId: uploadEmojiButtonTestId,
49
+ "aria-describedby": ariaDescribedBy,
50
+ "aria-labelledby": ariaLabelledBy,
51
+ autoFocus: true
52
+ }, label));
53
+ };
54
+ const RetryableButton = props => {
55
+ const {
56
+ loading,
57
+ error
58
+ } = props;
59
+ if (loading) {
60
+ return /*#__PURE__*/React.createElement(LoadingSpinner, null);
61
+ }
62
+ if (error) {
63
+ return /*#__PURE__*/React.createElement(RetryButton, props);
64
+ }
65
+ return /*#__PURE__*/React.createElement(UploadButton, props);
66
+ };
67
+ export default RetryableButton;
@@ -0,0 +1,13 @@
1
+
2
+ ._19it1l1c{border:1px solid var(--ds-border,#fff)}
3
+ ._2rkosqtm{border-radius:var(--ds-border-radius-100,3px)}._18m91wug{overflow-y:auto}
4
+ ._18u0idpf{margin-left:0}
5
+ ._19bvidpf{padding-left:0}
6
+ ._19pkidpf{margin-top:0}
7
+ ._1e0c1ule{display:block}
8
+ ._1reo15vq{overflow-x:hidden}
9
+ ._2hwxidpf{margin-right:0}
10
+ ._ca0qidpf{padding-top:0}
11
+ ._n3tdidpf{padding-bottom:0}
12
+ ._otyridpf{margin-bottom:0}
13
+ ._u5f3idpf{padding-right:0}
@@ -0,0 +1,69 @@
1
+ /* Scrollable.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import "./Scrollable.compiled.css";
4
+ import * as React from 'react';
5
+ import { ax, ix } from "@compiled/react/runtime";
6
+ // FIXME - FAB-1732 looking at making a shared component for this
7
+
8
+ import { PureComponent } from 'react';
9
+ const emojiScrollable = null;
10
+ export default class Scrollable extends PureComponent {
11
+ constructor(...args) {
12
+ super(...args);
13
+ _defineProperty(this, "scrollableDiv", null);
14
+ // API
15
+ _defineProperty(this, "reveal", (child, forceToTop) => {
16
+ if (child && this.scrollableDiv) {
17
+ // Not using Element.scrollIntoView as it scrolls even to top/bottom of view even if
18
+ // already visible
19
+ const scrollableRect = this.scrollableDiv.getBoundingClientRect();
20
+ const elementRect = child.getBoundingClientRect();
21
+ if (forceToTop || elementRect.top < scrollableRect.top) {
22
+ this.scrollableDiv.scrollTop += elementRect.top - scrollableRect.top;
23
+ } else if (elementRect.bottom > scrollableRect.bottom) {
24
+ this.scrollableDiv.scrollTop += elementRect.bottom - scrollableRect.bottom;
25
+ }
26
+ }
27
+ });
28
+ _defineProperty(this, "scrollToBottom", () => {
29
+ if (this.scrollableDiv) {
30
+ this.scrollableDiv.scrollTop = this.scrollableDiv.scrollHeight;
31
+ }
32
+ });
33
+ _defineProperty(this, "handleScroll", event => {
34
+ const sampleOffset = 10;
35
+ let firstElement;
36
+ if (this.scrollableDiv) {
37
+ const scrollableRect = this.scrollableDiv.getBoundingClientRect();
38
+ firstElement = document.elementFromPoint(scrollableRect.left + sampleOffset, scrollableRect.top + sampleOffset);
39
+ }
40
+ if (this.props.onScroll && firstElement) {
41
+ this.props.onScroll(firstElement, event);
42
+ }
43
+ });
44
+ _defineProperty(this, "handleRef", ref => {
45
+ this.scrollableDiv = ref;
46
+ });
47
+ }
48
+ render() {
49
+ const {
50
+ children,
51
+ className,
52
+ maxHeight,
53
+ onMouseLeave
54
+ } = this.props;
55
+ const style = maxHeight ? {
56
+ maxHeight
57
+ } : {};
58
+ return /*#__PURE__*/React.createElement("div", {
59
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
60
+ className: ax(["_19it1l1c _2rkosqtm _19pkidpf _2hwxidpf _otyridpf _18u0idpf _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _1e0c1ule _1reo15vq _18m91wug", `emoji-scrollable ${className}`]),
61
+ onMouseLeave: onMouseLeave,
62
+ onScroll: this.handleScroll,
63
+ ref: this.handleRef
64
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
65
+ ,
66
+ style: style
67
+ }, children);
68
+ }
69
+ }
@@ -0,0 +1,32 @@
1
+
2
+ ._19itidpf{border:0}
3
+ ._2rkosqtm{border-radius:var(--ds-border-radius-100,3px)}._11bcidpf::-moz-focus-inner{border-width:0}
4
+ ._dqozglyw::-moz-focus-inner{border-style:none}
5
+ ._19bvidpf{padding-left:0}
6
+ ._1at812x7>span{padding-top:var(--ds-space-075,6px)}
7
+ ._1cjo12x7>span{padding-bottom:var(--ds-space-075,6px)}
8
+ ._1cx6idpf::-moz-focus-inner{padding-right:0}
9
+ ._1e0c1o8l{display:inline-block}
10
+ ._1e0cglyw{display:none}
11
+ ._1i911tcg>span>img{height:24px}
12
+ ._1s3c1tcg>span>.emoji-common-emoji-sprite{width:24px}
13
+ ._1ye71tcg>span>img{width:24px}
14
+ ._1yg612x7>span{padding-left:var(--ds-space-075,6px)}
15
+ ._2ewlidpf::-moz-focus-inner{padding-left:0}
16
+ ._3um015vq{visibility:hidden}
17
+ ._80omtlke{cursor:pointer}
18
+ ._bfhk1j28{background-color:transparent}
19
+ ._ca0qidpf{padding-top:0}
20
+ ._hjaq12x7>span{padding-right:var(--ds-space-075,6px)}
21
+ ._hlt21tcg>span>.emoji-common-emoji-sprite{height:24px}
22
+ ._kqswh2mm{position:relative}
23
+ ._lev4idpf::-moz-focus-inner{padding-top:0}
24
+ ._n3tdidpf{padding-bottom:0}
25
+ ._tyukidpf::-moz-focus-inner{padding-bottom:0}
26
+ ._tzy4idpf{opacity:0}
27
+ ._u5f3idpf{padding-right:0}
28
+ ._1hvw1o36:focus{outline-width:medium}
29
+ ._491113zc:focus{transition-duration:0s,.2s}
30
+ ._49pcglyw:focus{outline-style:none}
31
+ ._7ehi1n2i:focus{box-shadow:0 0 0 2px var(--ds-border-focused,#4c9aff)}
32
+ ._nt751r31:focus{outline-color:currentColor}
@@ -0,0 +1,41 @@
1
+ /* TonePreviewButton.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import "./TonePreviewButton.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { forwardRef, memo } from 'react';
6
+ import { B100 } from '@atlaskit/theme/colors';
7
+ import Emoji from './Emoji';
8
+ export const tonePreviewTestId = 'tone-preview';
9
+ const emojiButton = null;
10
+ const hidden = null;
11
+ export const TonePreviewButton = /*#__PURE__*/forwardRef((props, ref) => {
12
+ const {
13
+ emoji,
14
+ selectOnHover,
15
+ ariaLabelText,
16
+ ariaExpanded,
17
+ onSelected,
18
+ isVisible = true
19
+ } = props;
20
+ return /*#__PURE__*/React.createElement("button", {
21
+ ref: ref,
22
+ onClick: onSelected,
23
+ "aria-label": ariaLabelText,
24
+ "aria-expanded": ariaExpanded,
25
+ "aria-controls": "emoji-picker-tone-selector"
26
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
27
+ ,
28
+ style: {
29
+ overflow: 'hidden'
30
+ },
31
+ "data-testid": tonePreviewTestId,
32
+ type: "button",
33
+ className: ax(["_19itidpf _2rkosqtm _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _bfhk1j28 _80omtlke _kqswh2mm _1e0c1o8l _lev4idpf _1cx6idpf _tyukidpf _2ewlidpf _11bcidpf _dqozglyw _1at812x7 _1cjo12x7 _1yg612x7 _hjaq12x7 _hlt21tcg _1s3c1tcg _1i911tcg _1ye71tcg _nt751r31 _49pcglyw _1hvw1o36 _7ehi1n2i _491113zc", !isVisible && "_tzy4idpf _3um015vq _1e0cglyw"])
34
+ }, /*#__PURE__*/React.createElement(Emoji, {
35
+ emoji: emoji,
36
+ selectOnHover: selectOnHover,
37
+ shouldBeInteractive: false,
38
+ "aria-hidden": true
39
+ }));
40
+ });
41
+ export default /*#__PURE__*/memo(TonePreviewButton);
@@ -0,0 +1,3 @@
1
+ ._1e0cglyw{display:none}
2
+ ._3um015vq{visibility:hidden}
3
+ ._tzy4idpf{opacity:0}