Skip to content

Commit cb9d520

Browse files
authored
Merge pull request #782 from GetStream/CRS-442_emoji-keyboard-navigation
CRS-442 emoji keyboard navigation
2 parents 02e9bba + f03230e commit cb9d520

File tree

4 files changed

+56
-50
lines changed

4 files changed

+56
-50
lines changed

src/components/AutoCompleteTextarea/List.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const List = (props) => {
2424

2525
const [selectedItem, setSelectedItem] = useState(undefined);
2626

27-
const itemsRef = {};
27+
const itemsRef = [];
2828

2929
const isSelected = (item) => selectedItem === values.indexOf(item);
3030

@@ -53,24 +53,29 @@ const List = (props) => {
5353
modifyText(values[selectedItem]);
5454
};
5555

56-
const selectItem = (item, keyboard = false) => {
56+
const selectItem = (item) => {
5757
setSelectedItem(values.indexOf(item));
58-
if (keyboard) dropdownScroll(itemsRef[getId(item)]);
5958
};
6059

6160
const handleKeyDown = useCallback(
6261
(event) => {
6362
if (event.which === KEY_CODES.UP) {
6463
setSelectedItem((prevSelected) => {
6564
if (prevSelected === undefined) return 0;
66-
return prevSelected === 0 ? values.length - 1 : prevSelected - 1;
65+
const newID =
66+
prevSelected === 0 ? values.length - 1 : prevSelected - 1;
67+
dropdownScroll(itemsRef[newID]);
68+
return newID;
6769
});
6870
}
6971

7072
if (event.which === KEY_CODES.DOWN) {
7173
setSelectedItem((prevSelected) => {
7274
if (prevSelected === undefined) return 0;
73-
return prevSelected === values.length - 1 ? 0 : prevSelected + 1;
75+
const newID =
76+
prevSelected === values.length - 1 ? 0 : prevSelected + 1;
77+
dropdownScroll(itemsRef[newID]);
78+
return newID;
7479
});
7580
}
7681

@@ -123,7 +128,7 @@ const List = (props) => {
123128
__html: renderHeader(propValue),
124129
}}
125130
/>
126-
{values.map((item) => (
131+
{values.map((item, i) => (
127132
<Item
128133
className={itemClassName}
129134
component={component}
@@ -132,7 +137,7 @@ const List = (props) => {
132137
onClickHandler={handleClick}
133138
onSelectHandler={selectItem}
134139
ref={(ref) => {
135-
itemsRef[getId(item)] = ref;
140+
itemsRef[i] = ref;
136141
}}
137142
selected={isSelected(item)}
138143
style={itemStyle}

src/components/AutoCompleteTextarea/Textarea.js

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -619,62 +619,61 @@ class ReactTextareaAutocomplete extends React.Component {
619619
scrollToItem(this.dropdownRef, item);
620620
};
621621

622-
render() {
622+
renderSuggestionListContainer() {
623623
const {
624-
className,
625-
containerClassName,
626-
containerStyle,
627624
disableMentions,
628625
dropdownClassName,
629626
dropdownStyle,
630627
itemClassName,
631628
itemStyle,
632629
listClassName,
633-
style,
634630
SuggestionList = DefaultSuggestionList,
635631
} = this.props;
636-
637-
let { maxRows } = this.props;
638-
639632
const { component, currentTrigger, dataLoading, value } = this.state;
640633

641634
const selectedItem = this._getItemOnSelect();
642635
const suggestionData = this._getSuggestions();
643636
const textToReplace = this._getTextToReplace();
644637

645-
const SuggestionListContainer = () => {
646-
if (
647-
(dataLoading || suggestionData) &&
648-
currentTrigger &&
649-
!(disableMentions && currentTrigger === '@')
650-
) {
651-
return (
652-
<div
653-
className={`rta__autocomplete ${dropdownClassName || ''}`}
654-
ref={(ref) => {
655-
this.dropdownRef = ref;
656-
}}
657-
style={dropdownStyle}
658-
>
659-
{component && suggestionData && textToReplace && (
660-
<SuggestionList
661-
className={listClassName}
662-
component={component}
663-
dropdownScroll={this._dropdownScroll}
664-
getSelectedItem={selectedItem}
665-
getTextToReplace={textToReplace}
666-
itemClassName={itemClassName}
667-
itemStyle={itemStyle}
668-
onSelect={this._onSelect}
669-
value={value}
670-
values={suggestionData}
671-
/>
672-
)}
673-
</div>
674-
);
675-
}
676-
return null;
677-
};
638+
if (
639+
(dataLoading || suggestionData) &&
640+
currentTrigger &&
641+
!(disableMentions && currentTrigger === '@')
642+
) {
643+
return (
644+
<div
645+
className={`rta__autocomplete ${dropdownClassName || ''}`}
646+
ref={(ref) => {
647+
this.dropdownRef = ref;
648+
}}
649+
style={dropdownStyle}
650+
>
651+
{component && suggestionData && textToReplace && (
652+
<SuggestionList
653+
className={listClassName}
654+
component={component}
655+
dropdownScroll={this._dropdownScroll}
656+
getSelectedItem={selectedItem}
657+
getTextToReplace={textToReplace}
658+
itemClassName={itemClassName}
659+
itemStyle={itemStyle}
660+
onSelect={this._onSelect}
661+
value={value}
662+
values={suggestionData}
663+
/>
664+
)}
665+
</div>
666+
);
667+
}
668+
return null;
669+
}
670+
671+
render() {
672+
const { className, containerClassName, containerStyle, style } = this.props;
673+
674+
let { maxRows } = this.props;
675+
676+
const { dataLoading, value } = this.state;
678677

679678
if (!this.props.grow) maxRows = 1;
680679

@@ -685,7 +684,7 @@ class ReactTextareaAutocomplete extends React.Component {
685684
}`}
686685
style={containerStyle}
687686
>
688-
<SuggestionListContainer />
687+
{this.renderSuggestionListContainer()}
689688
<Textarea
690689
{...this._cleanUpProps()}
691690
className={`rta__textarea ${className || ''}`}

src/styles/MessageList.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
overflow-y: auto;
55
-webkit-overflow-scrolling: touch; /* enable smooth scrolling on ios */
66
padding: 0 0 0 0;
7+
position: relative;
8+
z-index: 0;
79
.str-chat__reverse-infinite-scroll {
810
padding-top: 75px;
911
}

src/styles/index.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
// Components
66

7-
@import 'mml-react/src/styles/index.scss';
7+
@import '../../node_modules/mml-react/src/styles/index.scss';
88
@import './vendor/react-file-utils.scss';
99
@import './vendor/emoji-mart.scss';
1010

0 commit comments

Comments
 (0)