Fix handler to use react bubbling rather than a native global onKeyDown

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
pull/21833/head
Michael Telatynski 2020-04-14 15:24:41 +01:00
parent 76104edeca
commit 69382ff8e5
1 changed files with 25 additions and 7 deletions

View File

@ -422,7 +422,7 @@ export default createReactClass({
} }
this.onResize(); this.onResize();
document.addEventListener("keydown", this.onKeyDown); document.addEventListener("keydown", this.onNativeKeyDown);
}, },
shouldComponentUpdate: function(nextProps, nextState) { shouldComponentUpdate: function(nextProps, nextState) {
@ -500,7 +500,7 @@ export default createReactClass({
this.props.resizeNotifier.removeListener("middlePanelResized", this.onResize); this.props.resizeNotifier.removeListener("middlePanelResized", this.onResize);
} }
document.removeEventListener("keydown", this.onKeyDown); document.removeEventListener("keydown", this.onNativeKeyDown);
// Remove RoomStore listener // Remove RoomStore listener
if (this._roomStoreToken) { if (this._roomStoreToken) {
@ -542,7 +542,8 @@ export default createReactClass({
} }
}, },
onKeyDown: function(ev) { // we register global shortcuts here, they *must not conflict* with local shortcuts elsewhere or both will fire
onNativeKeyDown: function(ev) {
let handled = false; let handled = false;
const ctrlCmdOnly = isOnlyCtrlOrCmdKeyEvent(ev); const ctrlCmdOnly = isOnlyCtrlOrCmdKeyEvent(ev);
@ -560,11 +561,24 @@ export default createReactClass({
handled = true; handled = true;
} }
break; break;
}
if (handled) {
ev.stopPropagation();
ev.preventDefault();
}
},
onReactKeyDown: function(ev) {
let handled = false;
switch (ev.key) {
case Key.ESCAPE: case Key.ESCAPE:
this._messagePanel.forgetReadMarker(); if (!ev.altKey && !ev.ctrlKey && !ev.shiftKey && !ev.metaKey) {
this.jumpToLiveTimeline(); this._messagePanel.forgetReadMarker();
handled = true; this.jumpToLiveTimeline();
handled = true;
}
break; break;
} }
@ -2030,9 +2044,13 @@ export default createReactClass({
mx_RoomView_timeline_rr_enabled: this.state.showReadReceipts, mx_RoomView_timeline_rr_enabled: this.state.showReadReceipts,
}); });
const mainClasses = classNames("mx_RoomView", {
mx_RoomView_inCall: inCall,
});
return ( return (
<RoomContext.Provider value={this.state}> <RoomContext.Provider value={this.state}>
<main className={"mx_RoomView" + (inCall ? " mx_RoomView_inCall" : "")} ref={this._roomView}> <main className={mainClasses} ref={this._roomView} onKeyDown={this.onReactKeyDown}>
<ErrorBoundary> <ErrorBoundary>
<RoomHeader <RoomHeader
room={this.state.room} room={this.state.room}