@@ -138,7 +138,7 @@ const MessageInput = React.forwardRef<HTMLInputElement, MessageInputProps>((prop
138
138
139
139
const textFieldId = messageFieldId || TEXT_FIELD_ID ;
140
140
const { stringSet } = useLocalization ( ) ;
141
- const { config } = useSendbirdStateContext ( ) ;
141
+ const { config, eventHandlers } = useSendbirdStateContext ( ) ;
142
142
143
143
const isFileUploadEnabled = checkIfFileUploadEnabled ( {
144
144
channel,
@@ -391,38 +391,45 @@ const MessageInput = React.forwardRef<HTMLInputElement, MessageInputProps>((prop
391
391
} , [ isMentionEnabled ] ) ;
392
392
393
393
const sendMessage = ( ) => {
394
- const textField = internalRef ?. current ;
395
- if ( ! isEdit && textField ?. textContent ) {
396
- const { messageText, mentionTemplate } = extractTextAndMentions ( textField . childNodes ) ;
397
- const params = { message : messageText , mentionTemplate } ;
398
- onSendMessage ( params ) ;
399
- resetInput ( internalRef ) ;
394
+ try {
395
+ const textField = internalRef ?. current ;
396
+ if ( ! isEdit && textField ?. textContent ) {
397
+ const { messageText, mentionTemplate } = extractTextAndMentions ( textField . childNodes ) ;
398
+ const params = { message : messageText , mentionTemplate } ;
399
+ onSendMessage ( params ) ;
400
+ resetInput ( internalRef ) ;
401
+ /**
402
+ * Note: contentEditable does not work as expected in mobile WebKit (Safari).
403
+ * @see https://github.com/sendbird/sendbird-uikit-react/pull/1108
404
+ */
405
+ if ( isMobileIOS ( navigator . userAgent ) ) {
406
+ if ( ghostInputRef . current ) ghostInputRef . current . focus ( ) ;
407
+ requestAnimationFrame ( ( ) => textField . focus ( ) ) ;
408
+ } else {
409
+ // important: keeps the keyboard open -> must add test on refactor
410
+ textField . focus ( ) ;
411
+ }
400
412
401
- /**
402
- * Note: contentEditable does not work as expected in mobile WebKit (Safari).
403
- * @see https://github.com/sendbird/sendbird-uikit-react/pull/1108
404
- */
405
- if ( isMobileIOS ( navigator . userAgent ) ) {
406
- if ( ghostInputRef . current ) ghostInputRef . current . focus ( ) ;
407
- requestAnimationFrame ( ( ) => textField . focus ( ) ) ;
408
- } else {
409
- // important: keeps the keyboard open -> must add test on refactor
410
- textField . focus ( ) ;
413
+ setIsInput ( false ) ;
414
+ setHeight ( ) ;
411
415
}
412
-
413
- setIsInput ( false ) ;
414
- setHeight ( ) ;
416
+ } catch ( error ) {
417
+ eventHandlers ?. message ?. onSendMessageFailed ?.( message , error ) ;
415
418
}
416
419
} ;
417
420
const isEditDisabled = ! internalRef ?. current ?. textContent ?. trim ( ) ;
418
421
const editMessage = ( ) => {
419
- const textField = internalRef ?. current ;
420
- const messageId = message ?. messageId ;
421
- if ( isEdit && messageId && textField ) {
422
- const { messageText, mentionTemplate } = extractTextAndMentions ( textField . childNodes ) ;
423
- const params = { messageId, message : messageText , mentionTemplate } ;
424
- onUpdateMessage ( params ) ;
425
- resetInput ( internalRef ) ;
422
+ try {
423
+ const textField = internalRef ?. current ;
424
+ const messageId = message ?. messageId ;
425
+ if ( isEdit && messageId && textField ) {
426
+ const { messageText, mentionTemplate } = extractTextAndMentions ( textField . childNodes ) ;
427
+ const params = { messageId, message : messageText , mentionTemplate } ;
428
+ onUpdateMessage ( params ) ;
429
+ resetInput ( internalRef ) ;
430
+ }
431
+ } catch ( error ) {
432
+ eventHandlers ?. message ?. onUpdateMessageFailed ?.( message , error ) ;
426
433
}
427
434
} ;
428
435
const onPaste = usePaste ( {
@@ -433,6 +440,19 @@ const MessageInput = React.forwardRef<HTMLInputElement, MessageInputProps>((prop
433
440
setHeight,
434
441
} ) ;
435
442
443
+ const uploadFile = ( event : React . ChangeEvent < HTMLInputElement > ) => {
444
+ const { files } = event . currentTarget ;
445
+ try {
446
+ if ( files ) {
447
+ onFileUpload ( Array . from ( files ) ) ;
448
+ }
449
+ } catch ( error ) {
450
+ eventHandlers ?. message ?. onFileUploadFailed ?.( error ) ;
451
+ } finally {
452
+ event . target . value = '' ;
453
+ }
454
+ } ;
455
+
436
456
return (
437
457
< form className = { classnames (
438
458
...( Array . isArray ( className ) ? className : [ className ] ) ,
@@ -559,13 +579,7 @@ const MessageInput = React.forwardRef<HTMLInputElement, MessageInputProps>((prop
559
579
type = "file"
560
580
ref = { fileInputRef }
561
581
// It will affect to <Channel /> and <Thread />
562
- onChange = { ( event ) => {
563
- const { files } = event . currentTarget ;
564
- if ( files ) {
565
- onFileUpload ( files && files . length === 1 ? [ files [ 0 ] ] : Array . from ( files ) ) ;
566
- }
567
- event . target . value = '' ;
568
- } }
582
+ onChange = { ( event ) => uploadFile ( event ) }
569
583
accept = { getMimeTypesUIKitAccepts ( acceptableMimeTypes ) }
570
584
multiple = { isSelectingMultipleFilesEnabled && isChannelTypeSupportsMultipleFilesMessage ( channel ) }
571
585
/>
0 commit comments