Skip to content

Commit 2f2987b

Browse files
authored
Merge pull request #839 from GetStream/fix-autocomplete-trigger-hightlight
CRS-494 Fix autocomplete trigger hightlight
2 parents 630a21d + 1748420 commit 2f2987b

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

src/components/AutoCompleteTextarea/List.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ const List = (props) => {
1010
const {
1111
className,
1212
component,
13+
currentTrigger,
1314
dropdownScroll,
1415
getSelectedItem,
1516
getTextToReplace,
1617
itemClassName,
1718
itemStyle,
1819
onSelect,
1920
style,
21+
selectionEnd,
2022
SuggestionItem = Item,
2123
value: propValue,
2224
values,
@@ -123,7 +125,10 @@ const List = (props) => {
123125
const restructureItem = (item) => {
124126
const matched = item.name || item.id;
125127

126-
const editedPropValue = escapeRegExp(propValue.slice(1));
128+
const textBeforeCursor = propValue.slice(0, selectionEnd);
129+
const triggerIndex = textBeforeCursor.lastIndexOf(currentTrigger);
130+
const editedPropValue = escapeRegExp(textBeforeCursor.slice(triggerIndex + 1));
131+
127132
const parts = matched.split(new RegExp(`(${editedPropValue})`, 'gi'));
128133

129134
const itemNameParts = { match: editedPropValue, parts };

src/components/AutoCompleteTextarea/Textarea.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,7 @@ class ReactTextareaAutocomplete extends React.Component {
194194

195195
const textToModify = textareaValue.slice(0, selectionEnd);
196196

197-
// It's important to escape the currentTrigger char for chars like [, (,...
198-
const findTriggerRegExp = new RegExp(`\\${currentTrigger}${`[^\\${currentTrigger}${'\\s'}]`}*`);
199-
// reverse the string so we can easily find the first index of the currentTrigger
200-
const reversedString = textToModify.split('').reverse().join('');
201-
// find the first instance of currentTrigger (-1 if not found)
202-
const distanceFromEndOfString = reversedString.search(findTriggerRegExp) + 1;
203-
// if found, distract from the length of the string to revert the position back to an actual string index.
204-
const startOfTokenPosition =
205-
distanceFromEndOfString === -1 ? 0 : textToModify.length - distanceFromEndOfString;
197+
const startOfTokenPosition = textToModify.lastIndexOf(currentTrigger);
206198

207199
// we add space after emoji is selected if a caret position is next
208200
const newTokenString = newToken.caretPosition === 'next' ? `${newToken.text} ` : newToken.text;
@@ -635,12 +627,14 @@ class ReactTextareaAutocomplete extends React.Component {
635627
<SuggestionList
636628
className={listClassName}
637629
component={component}
630+
currentTrigger={currentTrigger}
638631
dropdownScroll={this._dropdownScroll}
639632
getSelectedItem={selectedItem}
640633
getTextToReplace={textToReplace}
641634
itemClassName={itemClassName}
642635
itemStyle={itemStyle}
643636
onSelect={this._onSelect}
637+
selectionEnd={this.state.selectionEnd}
644638
SuggestionItem={SuggestionItem}
645639
value={value}
646640
values={suggestionData}

0 commit comments

Comments
 (0)