@@ -13,6 +13,7 @@ import { IFile } from "../../../../../webchat/store/input/input-reducer";
13
13
import MediaQuery from "react-responsive" ;
14
14
import PersistentMenu from "../menu/PersistentMenu" ;
15
15
import IconButton from "../../../presentational/IconButton" ;
16
+ import { IPersistentMenuItem } from "../../../../../common/interfaces/webchat-config" ;
16
17
17
18
const InputWrapper = styled . div ( ( ) => ( {
18
19
display : "flex" ,
@@ -140,6 +141,8 @@ const SubmitButton = styled(Button)(({ theme }) => iconButtonStyles);
140
141
141
142
export interface TextInputState {
142
143
text : string ;
144
+ selectionStart : number ;
145
+ selectionEnd : number ;
143
146
}
144
147
145
148
interface ISpeechInputState {
@@ -215,6 +218,8 @@ export class BaseInput extends React.PureComponent<IBaseInputProps, IBaseInputSt
215
218
speechResult : "" ,
216
219
isFinalResult : false ,
217
220
isMenuOpen : false ,
221
+ selectionStart : 0 ,
222
+ selectionEnd : 0 ,
218
223
} as IBaseInputState ;
219
224
}
220
225
@@ -418,10 +423,40 @@ export class BaseInput extends React.PureComponent<IBaseInputProps, IBaseInputSt
418
423
} , 200 ) ;
419
424
} ;
420
425
421
- handleBlur = ( ) => {
426
+ handleBlur : React . FocusEventHandler < HTMLTextAreaElement > = e => {
422
427
setTimeout ( ( ) => {
423
428
this . props . onSetTextActive ( false ) ;
424
429
} , 200 ) ;
430
+ this . setState ( {
431
+ selectionStart : e . target . selectionStart ,
432
+ selectionEnd : e . target . selectionEnd ,
433
+ } ) ;
434
+ } ;
435
+
436
+ togglePeristentMenu = ( ) => {
437
+ this . setState (
438
+ prevState => ( {
439
+ isMenuOpen : ! prevState . isMenuOpen ,
440
+ } ) ,
441
+ ( ) => {
442
+ if ( ! this . state . isMenuOpen ) {
443
+ if ( this . inputRef . current ) {
444
+ this . inputRef . current ?. setSelectionRange (
445
+ this . state . selectionStart ,
446
+ this . state . selectionEnd ,
447
+ ) ;
448
+ this . inputRef . current . focus ( ) ;
449
+ }
450
+ }
451
+ } ,
452
+ ) ;
453
+ } ;
454
+
455
+ onSelectPersistentMenuItem = ( item : IPersistentMenuItem ) => {
456
+ this . togglePeristentMenu ( ) ;
457
+ this . props . onSendMessage ( item . payload , null , {
458
+ label : item . title ,
459
+ } ) ;
425
460
} ;
426
461
427
462
render ( ) {
@@ -456,7 +491,7 @@ export class BaseInput extends React.PureComponent<IBaseInputProps, IBaseInputSt
456
491
>
457
492
{ showPersistentMenu && (
458
493
< MenuButton
459
- onClick = { ( ) => this . setState ( { isMenuOpen : ! isMenuOpen } ) }
494
+ onClick = { this . togglePeristentMenu }
460
495
aria-label = "Toggle persistent menu"
461
496
aria-expanded = { isMenuOpen }
462
497
className = "webchat-input-persistent-menu-button"
@@ -471,14 +506,7 @@ export class BaseInput extends React.PureComponent<IBaseInputProps, IBaseInputSt
471
506
< PersistentMenu
472
507
title = { persistentMenu . title }
473
508
menuItems = { persistentMenu . menuItems }
474
- onSelect = { item => {
475
- this . setState ( { isMenuOpen : false } ) ;
476
- this . props . onSendMessage ( item . payload , null , {
477
- label : item . title ,
478
- } ) ;
479
-
480
- if ( this . inputRef . current ) this . inputRef . current . focus ( ) ;
481
- } }
509
+ onSelect = { this . onSelectPersistentMenuItem }
482
510
/>
483
511
) : (
484
512
< >
0 commit comments