Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit a74db3a

Browse files
committed
Get basic keyboard selection working
1 parent fb6eec0 commit a74db3a

File tree

3 files changed

+84
-6
lines changed

3 files changed

+84
-6
lines changed

src/components/views/rooms/Autocomplete.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
3+
import classNames from 'classnames';
34

45
import {getCompletions} from '../../../autocomplete/Autocompleter';
56

@@ -41,16 +42,34 @@ export default class Autocomplete extends React.Component {
4142
});
4243
}
4344

45+
onUpArrow() {
46+
this.setState({selectionOffset: this.state.selectionOffset - 1});
47+
return true;
48+
}
49+
50+
onDownArrow() {
51+
this.setState({selectionOffset: this.state.selectionOffset + 1});
52+
return true;
53+
}
54+
4455
render() {
56+
let position = 0;
4557
let renderedCompletions = this.state.completions.map((completionResult, i) => {
4658
let completions = completionResult.completions.map((completion, i) => {
4759
let Component = completion.component;
60+
let className = classNames('mx_Autocomplete_Completion', {
61+
'selected': position == this.state.selectionOffset
62+
});
63+
let componentPosition = position;
64+
position++;
4865
if(Component) {
4966
return Component;
5067
}
5168

5269
return (
53-
<div key={i} className="mx_Autocomplete_Completion" tabIndex={0}>
70+
<div key={i}
71+
className={className}
72+
onMouseOver={() => this.setState({selectionOffset: componentPosition})}>
5473
<span style={{fontWeight: 600}}>{completion.title}</span>
5574
<span>{completion.subtitle}</span>
5675
<span style={{flex: 1}} />

src/components/views/rooms/MessageComposer.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ export default class MessageComposer extends React.Component {
3434
this.onUploadFileSelected = this.onUploadFileSelected.bind(this);
3535
this.onVoiceCallClick = this.onVoiceCallClick.bind(this);
3636
this.onInputContentChanged = this.onInputContentChanged.bind(this);
37+
this.onUpArrow = this.onUpArrow.bind(this);
38+
this.onDownArrow = this.onDownArrow.bind(this);
39+
this.onTab = this.onTab.bind(this);
3740

3841
this.state = {
3942
autocompleteQuery: '',
@@ -129,6 +132,18 @@ export default class MessageComposer extends React.Component {
129132
});
130133
}
131134

135+
onUpArrow() {
136+
return this.refs.autocomplete.onUpArrow();
137+
}
138+
139+
onDownArrow() {
140+
return this.refs.autocomplete.onDownArrow();
141+
}
142+
143+
onTab() {
144+
return this.refs.autocomplete.onTab();
145+
}
146+
132147
render() {
133148
var me = this.props.room.getMember(MatrixClientPeg.get().credentials.userId);
134149
var uploadInputStyle = {display: 'none'};
@@ -182,9 +197,14 @@ export default class MessageComposer extends React.Component {
182197
);
183198

184199
controls.push(
185-
<MessageComposerInput key="controls_input" tabComplete={this.props.tabComplete}
186-
onResize={this.props.onResize} room={this.props.room}
187-
onContentChanged={this.onInputContentChanged} />,
200+
<MessageComposerInput
201+
key="controls_input"
202+
onResize={this.props.onResize}
203+
room={this.props.room}
204+
onUpArrow={this.onUpArrow}
205+
onDownArrow={this.onDownArrow}
206+
onTab={this.onTab}
207+
onContentChanged={this.onInputContentChanged} />,
188208
uploadButton,
189209
hangupButton,
190210
callButton,
@@ -201,7 +221,10 @@ export default class MessageComposer extends React.Component {
201221
return (
202222
<div className="mx_MessageComposer mx_fadable" style={{ opacity: this.props.opacity }}>
203223
<div className="mx_MessageComposer_autocomplete_wrapper">
204-
<Autocomplete query={this.state.autocompleteQuery} selection={this.state.selection} />
224+
<Autocomplete
225+
ref="autocomplete"
226+
query={this.state.autocompleteQuery}
227+
selection={this.state.selection} />
205228
</div>
206229
<div className="mx_MessageComposer_wrapper">
207230
<div className="mx_MessageComposer_row">

src/components/views/rooms/MessageComposerInput.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ export default class MessageComposerInput extends React.Component {
7373
this.handleReturn = this.handleReturn.bind(this);
7474
this.handleKeyCommand = this.handleKeyCommand.bind(this);
7575
this.setEditorState = this.setEditorState.bind(this);
76+
this.onUpArrow = this.onUpArrow.bind(this);
77+
this.onDownArrow = this.onDownArrow.bind(this);
78+
this.onTab = this.onTab.bind(this);
7679

7780
let isRichtextEnabled = window.localStorage.getItem('mx_editor_rte_enabled');
7881
if(isRichtextEnabled == null) {
@@ -489,6 +492,30 @@ export default class MessageComposerInput extends React.Component {
489492
return true;
490493
}
491494

495+
onUpArrow(e) {
496+
if(this.props.onUpArrow) {
497+
if(this.props.onUpArrow()) {
498+
e.preventDefault();
499+
}
500+
}
501+
}
502+
503+
onDownArrow(e) {
504+
if(this.props.onDownArrow) {
505+
if(this.props.onDownArrow()) {
506+
e.preventDefault();
507+
}
508+
}
509+
}
510+
511+
onTab(e) {
512+
if(this.props.onTab) {
513+
if(this.props.onTab()) {
514+
e.preventDefault();
515+
}
516+
}
517+
}
518+
492519
render() {
493520
let className = "mx_MessageComposer_input";
494521

@@ -507,6 +534,9 @@ export default class MessageComposerInput extends React.Component {
507534
handleKeyCommand={this.handleKeyCommand}
508535
handleReturn={this.handleReturn}
509536
stripPastedStyles={!this.state.isRichtextEnabled}
537+
onTab={this.onTab}
538+
onUpArrow={this.onUpArrow}
539+
onDownArrow={this.onDownArrow}
510540
spellCheck={true} />
511541
</div>
512542
);
@@ -524,5 +554,11 @@ MessageComposerInput.propTypes = {
524554
room: React.PropTypes.object.isRequired,
525555

526556
// called with current plaintext content (as a string) whenever it changes
527-
onContentChanged: React.PropTypes.func
557+
onContentChanged: React.PropTypes.func,
558+
559+
onUpArrow: React.PropTypes.func,
560+
561+
onDownArrow: React.PropTypes.func,
562+
563+
onTab: React.PropTypes.func
528564
};

0 commit comments

Comments
 (0)