@atlaskit/emoji 65.1.1 → 65.2.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 (95) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/components/common/CachingEmoji.js +84 -151
  3. package/dist/cjs/components/common/Emoji.js +2 -2
  4. package/dist/cjs/components/common/EmojiActions.js +129 -175
  5. package/dist/cjs/components/common/EmojiErrorMessage.js +23 -59
  6. package/dist/cjs/components/common/EmojiPreviewComponent.js +1 -0
  7. package/dist/cjs/components/common/EmojiUploadPicker.js +235 -293
  8. package/dist/cjs/components/common/FileChooser.js +34 -71
  9. package/dist/cjs/components/common/Popup.js +105 -154
  10. package/dist/cjs/components/common/RetryableButton.js +43 -64
  11. package/dist/cjs/components/common/ToneSelector.js +50 -89
  12. package/dist/cjs/components/common/styles.js +14 -16
  13. package/dist/cjs/components/hooks.js +16 -0
  14. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +16 -48
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +496 -516
  16. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +33 -60
  17. package/dist/cjs/components/picker/EmojiPickerFooter.js +13 -48
  18. package/dist/cjs/components/uploader/EmojiUploadComponent.js +124 -109
  19. package/dist/cjs/hooks/useEmojiContext.js +16 -0
  20. package/dist/cjs/hooks/{index.js → usePrevious.js} +0 -0
  21. package/dist/cjs/index.js +16 -0
  22. package/dist/cjs/version.json +1 -1
  23. package/dist/es2019/components/common/CachingEmoji.js +65 -112
  24. package/dist/es2019/components/common/Emoji.js +2 -2
  25. package/dist/es2019/components/common/EmojiActions.js +124 -150
  26. package/dist/es2019/components/common/EmojiErrorMessage.js +22 -26
  27. package/dist/es2019/components/common/EmojiPreviewComponent.js +1 -0
  28. package/dist/es2019/components/common/EmojiUploadPicker.js +190 -253
  29. package/dist/es2019/components/common/FileChooser.js +37 -40
  30. package/dist/es2019/components/common/Popup.js +89 -109
  31. package/dist/es2019/components/common/RetryableButton.js +43 -34
  32. package/dist/es2019/components/common/ToneSelector.js +46 -59
  33. package/dist/es2019/components/common/styles.js +9 -9
  34. package/dist/es2019/components/hooks.js +8 -0
  35. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +13 -17
  36. package/dist/es2019/components/picker/EmojiPickerComponent.js +417 -506
  37. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +32 -35
  38. package/dist/es2019/components/picker/EmojiPickerFooter.js +11 -21
  39. package/dist/es2019/components/uploader/EmojiUploadComponent.js +81 -91
  40. package/dist/es2019/hooks/useEmojiContext.js +3 -0
  41. package/dist/es2019/hooks/{index.js → usePrevious.js} +0 -0
  42. package/dist/es2019/index.js +4 -1
  43. package/dist/es2019/version.json +1 -1
  44. package/dist/esm/components/common/CachingEmoji.js +86 -156
  45. package/dist/esm/components/common/Emoji.js +2 -2
  46. package/dist/esm/components/common/EmojiActions.js +129 -176
  47. package/dist/esm/components/common/EmojiErrorMessage.js +21 -56
  48. package/dist/esm/components/common/EmojiPreviewComponent.js +1 -0
  49. package/dist/esm/components/common/EmojiUploadPicker.js +233 -299
  50. package/dist/esm/components/common/FileChooser.js +34 -70
  51. package/dist/esm/components/common/Popup.js +104 -155
  52. package/dist/esm/components/common/RetryableButton.js +40 -60
  53. package/dist/esm/components/common/ToneSelector.js +50 -87
  54. package/dist/esm/components/common/styles.js +10 -10
  55. package/dist/esm/components/hooks.js +8 -0
  56. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +14 -43
  57. package/dist/esm/components/picker/EmojiPickerComponent.js +486 -535
  58. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +31 -59
  59. package/dist/esm/components/picker/EmojiPickerFooter.js +14 -49
  60. package/dist/esm/components/uploader/EmojiUploadComponent.js +119 -113
  61. package/dist/esm/hooks/useEmojiContext.js +5 -0
  62. package/dist/esm/hooks/{index.js → usePrevious.js} +0 -0
  63. package/dist/esm/index.js +4 -1
  64. package/dist/esm/version.json +1 -1
  65. package/dist/types/components/common/CachingEmoji.d.ts +3 -13
  66. package/dist/types/components/common/Emoji.d.ts +1 -1
  67. package/dist/types/components/common/EmojiActions.d.ts +6 -17
  68. package/dist/types/components/common/EmojiErrorMessage.d.ts +3 -6
  69. package/dist/types/components/common/EmojiPreviewComponent.d.ts +2 -2
  70. package/dist/types/components/common/EmojiUploadPicker.d.ts +3 -27
  71. package/dist/types/components/common/FileChooser.d.ts +3 -5
  72. package/dist/types/components/common/Popup.d.ts +3 -20
  73. package/dist/types/components/common/RetryableButton.d.ts +3 -7
  74. package/dist/types/components/common/ToneSelector.d.ts +4 -10
  75. package/dist/types/components/common/setSkinToneAriaLabelText.d.ts +1 -1
  76. package/dist/types/components/common/styles.d.ts +1 -3
  77. package/dist/types/components/hooks.d.ts +1 -0
  78. package/dist/types/components/picker/CategorySelector.d.ts +1 -1
  79. package/dist/types/components/picker/EmojiPicker.d.ts +3 -3
  80. package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +3 -4
  81. package/dist/types/components/picker/EmojiPickerComponent.d.ts +4 -80
  82. package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +3 -4
  83. package/dist/types/components/picker/EmojiPickerFooter.d.ts +3 -6
  84. package/dist/types/components/uploader/EmojiUploadComponent.d.ts +3 -17
  85. package/dist/types/components/uploader/EmojiUploader.d.ts +5 -7
  86. package/dist/types/hooks/useEmojiContext.d.ts +1 -0
  87. package/dist/types/hooks/{index.d.ts → usePrevious.d.ts} +0 -0
  88. package/dist/types/index.d.ts +3 -1
  89. package/dist/types/types.d.ts +2 -1
  90. package/local-config-example.ts +3 -1
  91. package/package.json +17 -4
  92. package/dist/cjs/components/common/EmojiPreview.js +0 -194
  93. package/dist/es2019/components/common/EmojiPreview.js +0 -152
  94. package/dist/esm/components/common/EmojiPreview.js +0 -170
  95. package/dist/types/components/common/EmojiPreview.d.ts +0 -31
@@ -1,9 +1,6 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
-
3
1
  /** @jsx jsx */
4
2
  import { jsx } from '@emotion/core';
5
- import React, { Fragment } from 'react';
6
- import { PureComponent } from 'react';
3
+ import React, { Fragment, useEffect, useState } from 'react';
7
4
  import { FormattedMessage, injectIntl } from 'react-intl-next';
8
5
  import TextField from '@atlaskit/textfield';
9
6
  import * as ImageUtil from '../../util/image';
@@ -31,269 +28,209 @@ const toEmojiName = uploadName => {
31
28
  return `${name.substr(0, 1).toLocaleUpperCase()}${name.substr(1)}`;
32
29
  };
33
30
 
34
- class ChooseEmojiFile extends PureComponent {
35
- constructor(...args) {
36
- super(...args);
37
-
38
- _defineProperty(this, "onKeyDown", event => {
39
- if (event.key === 'Escape') {
40
- this.props.onUploadCancelled();
41
- }
42
- });
43
- }
44
-
45
- render() {
46
- const {
47
- name = '',
48
- onChooseFile,
49
- onClick,
50
- onNameChange,
51
- errorMessage,
52
- intl
53
- } = this.props;
54
- const {
55
- formatMessage
56
- } = intl;
57
- const disableChooser = !name;
58
- const fileChooserButtonDescriptionId = 'choose.emoji.file.button.screen.reader.description.id'; // Note: FileChooser.accept does not work in Electron due to a bug: https://product-fabric.atlassian.net/browse/FS-1626
59
-
60
- return jsx("div", {
61
- css: emojiUpload
62
- }, jsx("div", {
63
- css: uploadChooseFileMessage
64
- }, jsx(FormattedMessage, messages.addCustomEmojiLabel, message => jsx("h5", null, message))), jsx("div", {
65
- css: uploadChooseFileRow
66
- }, jsx("span", {
67
- css: uploadChooseFileEmojiName
68
- }, jsx(TextField, {
69
- placeholder: formatMessage(messages.emojiPlaceholder),
70
- "aria-label": formatMessage(messages.emojiNameAriaLabel),
71
- maxLength: maxNameLength,
72
- onChange: onNameChange,
73
- onKeyDown: this.onKeyDown,
74
- value: name,
75
- isCompact: true,
76
- autoFocus: true
77
- })), jsx("span", {
78
- css: uploadChooseFileBrowse
79
- }, jsx(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, screenReaderDescription => jsx(Fragment, null, jsx("span", {
80
- hidden: true,
81
- id: fileChooserButtonDescriptionId
82
- }, screenReaderDescription), jsx(FileChooser, {
83
- label: formatMessage(messages.emojiChooseFileTitle),
84
- onChange: onChooseFile,
85
- onClick: onClick,
86
- accept: "image/png,image/jpeg,image/gif",
87
- ariaDescribedBy: fileChooserButtonDescriptionId,
88
- isDisabled: disableChooser
89
- }))))), jsx("div", {
90
- css: emojiUploadBottom
91
- }, !errorMessage ? jsx("p", null, jsx(FormattedMessage, messages.emojiImageRequirements)) : jsx(EmojiErrorMessage, {
92
- messageStyles: emojiChooseFileErrorMessage,
93
- message: errorMessage
94
- })));
95
- }
96
-
97
- }
98
-
99
- export class EmojiUploadPicker extends PureComponent {
100
- constructor(props) {
101
- super(props);
102
-
103
- _defineProperty(this, "state", {
104
- uploadStatus: UploadStatus.Waiting,
105
- chooseEmojiErrorMessage: undefined
106
- });
107
-
108
- _defineProperty(this, "onNameChange", event => {
109
- let newName = sanitizeName(event.target.value);
110
-
111
- if (this.state.name !== newName) {
112
- this.setState({
113
- name: newName
114
- });
115
- }
116
- });
117
-
118
- _defineProperty(this, "onAddEmoji", () => {
119
- const {
120
- onUploadEmoji
121
- } = this.props;
122
- const {
123
- filename,
124
- name,
125
- previewImage,
126
- uploadStatus
127
- } = this.state;
31
+ const ChooseEmojiFile = props => {
32
+ const {
33
+ name = '',
34
+ onChooseFile,
35
+ onClick,
36
+ onNameChange,
37
+ onUploadCancelled,
38
+ errorMessage,
39
+ intl
40
+ } = props;
41
+ const {
42
+ formatMessage
43
+ } = intl;
44
+ const disableChooser = !name;
45
+ const fileChooserButtonDescriptionId = 'choose.emoji.file.button.screen.reader.description.id';
46
+
47
+ const onKeyDownHandler = event => {
48
+ if (event.key === 'Escape') {
49
+ onUploadCancelled();
50
+ }
51
+ };
52
+
53
+ return jsx("div", {
54
+ css: emojiUpload
55
+ }, jsx("div", {
56
+ css: uploadChooseFileMessage
57
+ }, jsx(FormattedMessage, messages.addCustomEmojiLabel, message => jsx("h5", null, message))), jsx("div", {
58
+ css: uploadChooseFileRow
59
+ }, jsx("span", {
60
+ css: uploadChooseFileEmojiName
61
+ }, jsx(TextField, {
62
+ placeholder: formatMessage(messages.emojiPlaceholder),
63
+ "aria-label": formatMessage(messages.emojiNameAriaLabel),
64
+ maxLength: maxNameLength,
65
+ onChange: onNameChange,
66
+ onKeyDown: onKeyDownHandler,
67
+ value: name,
68
+ isCompact: true,
69
+ autoFocus: true
70
+ })), jsx("span", {
71
+ css: uploadChooseFileBrowse
72
+ }, jsx(FormattedMessage, messages.emojiChooseFileScreenReaderDescription, screenReaderDescription => jsx(Fragment, null, jsx("span", {
73
+ hidden: true,
74
+ id: fileChooserButtonDescriptionId
75
+ }, screenReaderDescription), jsx(FileChooser, {
76
+ label: formatMessage(messages.emojiChooseFileTitle),
77
+ onChange: onChooseFile,
78
+ onClick: onClick,
79
+ accept: "image/png,image/jpeg,image/gif",
80
+ ariaDescribedBy: fileChooserButtonDescriptionId,
81
+ isDisabled: disableChooser
82
+ }))))), jsx("div", {
83
+ css: emojiUploadBottom
84
+ }, !errorMessage ? jsx("p", null, jsx(FormattedMessage, messages.emojiImageRequirements)) : jsx(EmojiErrorMessage, {
85
+ messageStyles: emojiChooseFileErrorMessage,
86
+ message: errorMessage
87
+ })));
88
+ };
128
89
 
129
- if (uploadStatus === UploadStatus.Uploading) {
130
- return;
90
+ const EmojiUploadPicker = props => {
91
+ const {
92
+ errorMessage,
93
+ initialUploadName,
94
+ onUploadEmoji,
95
+ onFileChooserClicked,
96
+ onUploadCancelled,
97
+ intl
98
+ } = props;
99
+ const [uploadStatus, setUploadStatus] = useState(errorMessage ? UploadStatus.Error : UploadStatus.Waiting);
100
+ const [chooseEmojiErrorMessage, setChooseEmojiErrorMessage] = useState();
101
+ const [name, setName] = useState(initialUploadName && sanitizeName(initialUploadName));
102
+ const [filename, setFilename] = useState();
103
+ const [previewImage, setPreviewImage] = useState();
104
+ useEffect(() => {
105
+ if (errorMessage) {
106
+ setUploadStatus(UploadStatus.Error);
107
+ return;
108
+ } else {
109
+ if (uploadStatus === UploadStatus.Error) {
110
+ setUploadStatus(UploadStatus.Waiting);
131
111
  }
112
+ }
113
+ }, [errorMessage, uploadStatus]);
114
+ useEffect(() => {
115
+ if (initialUploadName) {
116
+ setName(sanitizeName(initialUploadName));
117
+ }
118
+ }, [initialUploadName]);
132
119
 
133
- if (filename && name && previewImage) {
134
- const notifyUpload = size => {
135
- const {
136
- width,
137
- height
138
- } = size;
139
- this.setState({
140
- uploadStatus: UploadStatus.Uploading
141
- });
142
- onUploadEmoji({
143
- name: toEmojiName(name),
144
- shortName: `:${name}:`,
145
- filename,
146
- dataURL: previewImage,
147
- width,
148
- height
149
- }, uploadStatus === UploadStatus.Error);
150
- };
151
-
152
- ImageUtil.getNaturalImageSize(previewImage).then(size => {
153
- notifyUpload(size);
154
- }).catch(error => {
155
- debug('getNaturalImageSize error', error); // Just set arbitrary size, worse case is it may render
156
- // in wrong aspect ratio in some circumstances.
120
+ const onNameChange = event => {
121
+ let newName = sanitizeName(event.target.value);
157
122
 
158
- notifyUpload({
159
- width: 32,
160
- height: 32
161
- });
162
- });
163
- }
164
- });
123
+ if (name !== newName) {
124
+ setName(newName);
125
+ }
126
+ };
165
127
 
166
- _defineProperty(this, "errorOnUpload", event => {
167
- debug('File load error: ', event);
168
- this.setState({
169
- chooseEmojiErrorMessage: messages.emojiUploadFailed
170
- });
171
- this.cancelChooseFile();
172
- });
128
+ const onAddEmoji = () => {
129
+ if (uploadStatus === UploadStatus.Uploading) {
130
+ return;
131
+ }
173
132
 
174
- _defineProperty(this, "onFileLoad", file => f => {
175
- return ImageUtil.parseImage(f.target.result).then(() => {
176
- const state = {
177
- previewImage: f.target.result,
178
- filename: file.name
179
- };
180
- this.setState(state);
181
- }).catch(() => {
182
- this.setState({
183
- chooseEmojiErrorMessage: messages.emojiInvalidImage
133
+ if (filename && name && previewImage) {
134
+ const notifyUpload = size => {
135
+ const {
136
+ width,
137
+ height
138
+ } = size;
139
+ setUploadStatus(UploadStatus.Uploading);
140
+ onUploadEmoji({
141
+ name: toEmojiName(name),
142
+ shortName: `:${name}:`,
143
+ filename,
144
+ dataURL: previewImage,
145
+ width,
146
+ height
147
+ }, uploadStatus === UploadStatus.Error, clearUploadPicker);
148
+ };
149
+
150
+ ImageUtil.getNaturalImageSize(previewImage).then(size => {
151
+ notifyUpload(size);
152
+ }).catch(error => {
153
+ debug('getNaturalImageSize error', error); // Just set arbitrary size, worse case is it may render
154
+ // in wrong aspect ratio in some circumstances.
155
+
156
+ notifyUpload({
157
+ width: 32,
158
+ height: 32
184
159
  });
185
- this.cancelChooseFile();
186
160
  });
187
- });
188
-
189
- _defineProperty(this, "cancelChooseFile", () => {
190
- this.setState({
191
- previewImage: undefined
192
- });
193
- });
194
-
195
- _defineProperty(this, "onChooseFile", event => {
196
- const files = event.target.files;
197
-
198
- if (files.length) {
199
- const reader = new FileReader();
200
- const file = files[0];
201
-
202
- if (ImageUtil.hasFileExceededSize(file)) {
203
- this.setState({
204
- chooseEmojiErrorMessage: messages.emojiImageTooBig
205
- });
206
- this.cancelChooseFile();
207
- return;
208
- }
209
-
210
- reader.addEventListener('load', this.onFileLoad(file));
211
- reader.addEventListener('abort', this.errorOnUpload);
212
- reader.addEventListener('error', this.errorOnUpload);
213
- reader.readAsDataURL(file);
214
- } else {
215
- this.cancelChooseFile();
216
- }
217
- });
218
-
219
- _defineProperty(this, "clearUploadPicker", () => {
220
- this.setState({
221
- name: undefined,
222
- previewImage: undefined,
223
- uploadStatus: UploadStatus.Waiting
224
- });
225
- });
226
-
227
- if (props.errorMessage) {
228
- this.state.uploadStatus = UploadStatus.Error;
229
161
  }
230
-
231
- if (props.initialUploadName) {
232
- this.state.name = sanitizeName(props.initialUploadName);
162
+ };
163
+
164
+ const errorOnUpload = event => {
165
+ debug('File load error: ', event);
166
+ setChooseEmojiErrorMessage(messages.emojiUploadFailed);
167
+ cancelChooseFile();
168
+ };
169
+
170
+ const onFileLoad = file => async f => {
171
+ try {
172
+ setFilename(file.name);
173
+ await ImageUtil.parseImage(f.target.result);
174
+ setPreviewImage(f.target.result);
175
+ } catch {
176
+ setChooseEmojiErrorMessage(messages.emojiInvalidImage);
177
+ cancelChooseFile();
233
178
  }
234
- }
179
+ };
235
180
 
236
- UNSAFE_componentWillReceiveProps(nextProps) {
237
- const updatedState = {};
181
+ const cancelChooseFile = () => {
182
+ setPreviewImage(undefined);
183
+ };
238
184
 
239
- if (nextProps.errorMessage) {
240
- updatedState.uploadStatus = UploadStatus.Error;
241
- } else {
242
- if (this.state.uploadStatus === UploadStatus.Error) {
243
- updatedState.uploadStatus = UploadStatus.Waiting;
244
- }
245
- }
246
-
247
- if (nextProps.initialUploadName) {
248
- if (!this.state.name) {
249
- updatedState.name = sanitizeName(nextProps.initialUploadName);
250
- }
251
- }
252
-
253
- this.setState(updatedState);
254
- }
185
+ const onChooseFile = event => {
186
+ const files = event.target.files;
255
187
 
256
- render() {
257
- const {
258
- errorMessage,
259
- onUploadCancelled,
260
- intl
261
- } = this.props;
262
- const {
263
- name,
264
- previewImage,
265
- uploadStatus,
266
- chooseEmojiErrorMessage
267
- } = this.state;
188
+ if (files.length) {
189
+ const reader = new FileReader();
190
+ const file = files[0];
268
191
 
269
- const cancelUpload = () => {
270
- this.clearUploadPicker();
271
- onUploadCancelled();
272
- };
192
+ if (ImageUtil.hasFileExceededSize(file)) {
193
+ setChooseEmojiErrorMessage(messages.emojiImageTooBig);
194
+ cancelChooseFile();
195
+ return;
196
+ }
273
197
 
274
- if (name && previewImage) {
275
- return jsx(EmojiUploadPreview, {
276
- errorMessage: errorMessage,
277
- name: name,
278
- onAddEmoji: this.onAddEmoji,
279
- onUploadCancelled: cancelUpload,
280
- previewImage: previewImage,
281
- uploadStatus: uploadStatus
282
- });
198
+ reader.addEventListener('load', onFileLoad(file));
199
+ reader.addEventListener('abort', errorOnUpload);
200
+ reader.addEventListener('error', errorOnUpload);
201
+ reader.readAsDataURL(file);
202
+ } else {
203
+ cancelChooseFile();
283
204
  }
205
+ };
206
+
207
+ const clearUploadPicker = () => {
208
+ setName(undefined);
209
+ setPreviewImage(undefined);
210
+ setUploadStatus(UploadStatus.Waiting);
211
+ };
212
+
213
+ const cancelUpload = () => {
214
+ clearUploadPicker();
215
+ onUploadCancelled();
216
+ };
217
+
218
+ return jsx(React.Fragment, null, name && previewImage ? jsx(EmojiUploadPreview, {
219
+ errorMessage: errorMessage,
220
+ name: name,
221
+ onAddEmoji: onAddEmoji,
222
+ onUploadCancelled: cancelUpload,
223
+ previewImage: previewImage,
224
+ uploadStatus: uploadStatus
225
+ }) : jsx(ChooseEmojiFile, {
226
+ name: name,
227
+ onChooseFile: onChooseFile,
228
+ onClick: onFileChooserClicked,
229
+ onNameChange: onNameChange,
230
+ onUploadCancelled: cancelUpload,
231
+ errorMessage: chooseEmojiErrorMessage ? jsx(FormattedMessage, chooseEmojiErrorMessage) : undefined,
232
+ intl: intl
233
+ }));
234
+ };
284
235
 
285
- return jsx(ChooseEmojiFile, {
286
- name: name,
287
- onChooseFile: this.onChooseFile,
288
- onClick: this.props.onFileChooserClicked,
289
- onNameChange: this.onNameChange,
290
- onUploadCancelled: cancelUpload,
291
- errorMessage: chooseEmojiErrorMessage ? jsx(FormattedMessage, chooseEmojiErrorMessage) : undefined,
292
- intl: intl
293
- });
294
- }
295
-
296
- }
297
- export default injectIntl(EmojiUploadPicker, {
298
- forwardRef: true
299
- });
236
+ export default injectIntl(EmojiUploadPicker);
@@ -1,46 +1,43 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React from 'react';
3
- import { PureComponent } from 'react';
1
+ import React, { useRef } from 'react';
4
2
  import AkButton from '@atlaskit/button/custom-theme-button';
5
- export default class FileChooser extends PureComponent {
6
- constructor(...args) {
7
- super(...args);
8
3
 
9
- _defineProperty(this, "onChooseFile", () => {
10
- if (this.props.onClick) {
11
- this.props.onClick();
12
- }
4
+ const FileChooser = props => {
5
+ const {
6
+ accept,
7
+ ariaDescribedBy,
8
+ isDisabled,
9
+ label,
10
+ onChange,
11
+ onClick
12
+ } = props;
13
+ const filePickerRef = useRef(null);
13
14
 
14
- const chooseFile = this.refs['chooseFile'];
15
+ const handleOnChooseFile = () => {
16
+ if (!filePickerRef.current) {
17
+ return;
18
+ }
15
19
 
16
- if (chooseFile) {
17
- chooseFile.click();
18
- }
19
- });
20
- }
20
+ if (onClick) {
21
+ onClick();
22
+ }
21
23
 
22
- render() {
23
- const {
24
- accept,
25
- ariaDescribedBy,
26
- isDisabled,
27
- label,
28
- onChange
29
- } = this.props;
30
- return /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(AkButton, {
31
- onClick: this.onChooseFile,
32
- isDisabled: isDisabled,
33
- "aria-describedby": ariaDescribedBy
34
- }, label), /*#__PURE__*/React.createElement("input", {
35
- className: "emojiUploadFileInput",
36
- ref: "chooseFile",
37
- onChange: onChange,
38
- type: "file",
39
- accept: accept,
40
- style: {
41
- display: 'none'
42
- }
43
- }));
44
- }
24
+ filePickerRef.current.click();
25
+ };
45
26
 
46
- }
27
+ return /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(AkButton, {
28
+ onClick: handleOnChooseFile,
29
+ isDisabled: isDisabled,
30
+ "aria-describedby": ariaDescribedBy
31
+ }, label), /*#__PURE__*/React.createElement("input", {
32
+ className: "emojiUploadFileInput",
33
+ ref: filePickerRef,
34
+ onChange: onChange,
35
+ type: "file",
36
+ accept: accept,
37
+ style: {
38
+ display: 'none'
39
+ }
40
+ }));
41
+ };
42
+
43
+ export default FileChooser;