mirror of
https://github.com/element-hq/element-web.git
synced 2024-12-16 21:11:56 +03:00
Allow click inserting mentions into the edit composer too
This commit is contained in:
parent
ee9e1a72cb
commit
ace3a62bac
4 changed files with 63 additions and 35 deletions
|
@ -450,10 +450,12 @@ class TimelinePanel extends React.Component {
|
||||||
};
|
};
|
||||||
|
|
||||||
onAction = payload => {
|
onAction = payload => {
|
||||||
if (payload.action === 'ignore_state_changed') {
|
switch (payload.action) {
|
||||||
|
case "ignore_state_changed":
|
||||||
this.forceUpdate();
|
this.forceUpdate();
|
||||||
}
|
break;
|
||||||
if (payload.action === "edit_event") {
|
|
||||||
|
case "edit_event": {
|
||||||
const editState = payload.event ? new EditorStateTransfer(payload.event) : null;
|
const editState = payload.event ? new EditorStateTransfer(payload.event) : null;
|
||||||
this.setState({editState}, () => {
|
this.setState({editState}, () => {
|
||||||
if (payload.event && this._messagePanel.current) {
|
if (payload.event && this._messagePanel.current) {
|
||||||
|
@ -462,9 +464,27 @@ class TimelinePanel extends React.Component {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (payload.action === "scroll_to_bottom") {
|
|
||||||
|
case "insert_mention": {
|
||||||
|
if (this.state.editState) {
|
||||||
|
dis.dispatch({
|
||||||
|
...payload,
|
||||||
|
action: "insert_mention_edit_composer",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
dis.dispatch({
|
||||||
|
...payload,
|
||||||
|
action: "insert_mention_send_composer",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "scroll_to_bottom":
|
||||||
this.jumpToLiveTimeline();
|
this.jumpToLiveTimeline();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -713,4 +713,23 @@ export default class BasicMessageEditor extends React.Component<IProps, IState>
|
||||||
focus() {
|
focus() {
|
||||||
this.editorRef.current.focus();
|
this.editorRef.current.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public insertMention(userId: string) {
|
||||||
|
const {model} = this.props;
|
||||||
|
const {partCreator} = model;
|
||||||
|
const member = this.props.room.getMember(userId);
|
||||||
|
const displayName = member ?
|
||||||
|
member.rawDisplayName : userId;
|
||||||
|
const caret = this.getCaret();
|
||||||
|
const position = model.positionForOffset(caret.offset, caret.atNodeEnd);
|
||||||
|
// index is -1 if there are no parts but we only care for if this would be the part in position 0
|
||||||
|
const insertIndex = position.index > 0 ? position.index : 0;
|
||||||
|
const parts = partCreator.createMentionParts(insertIndex, displayName, userId);
|
||||||
|
model.transform(() => {
|
||||||
|
const addedLen = model.insert(parts, position);
|
||||||
|
return model.positionForOffset(caret.offset + addedLen, true);
|
||||||
|
});
|
||||||
|
// refocus on composer, as we just clicked "Mention"
|
||||||
|
this.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,7 @@ export default class EditMessageComposer extends React.Component {
|
||||||
saveDisabled: true,
|
saveDisabled: true,
|
||||||
};
|
};
|
||||||
this._createEditorModel();
|
this._createEditorModel();
|
||||||
|
this.dispatcherRef = dis.register(this.onAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
_setEditorRef = ref => {
|
_setEditorRef = ref => {
|
||||||
|
@ -235,6 +236,7 @@ export default class EditMessageComposer extends React.Component {
|
||||||
// then when mounting the editor again with the same editor state,
|
// then when mounting the editor again with the same editor state,
|
||||||
// it will set the cursor at the end.
|
// it will set the cursor at the end.
|
||||||
this.props.editState.setEditorState(caret, parts);
|
this.props.editState.setEditorState(caret, parts);
|
||||||
|
dis.unregister(this.dispatcherRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
_createEditorModel() {
|
_createEditorModel() {
|
||||||
|
@ -278,6 +280,12 @@ export default class EditMessageComposer extends React.Component {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onAction = payload => {
|
||||||
|
if (payload.action === "insert_mention_edit_composer" && this._editorRef) {
|
||||||
|
this._editorRef.insertMention(payload.user_id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||||
return (<div className={classNames("mx_EditMessageComposer", this.props.className)} onKeyDown={this._onKeyDown}>
|
return (<div className={classNames("mx_EditMessageComposer", this.props.className)} onKeyDown={this._onKeyDown}>
|
||||||
|
|
|
@ -482,8 +482,8 @@ export default class SendMessageComposer extends React.Component {
|
||||||
case Action.FocusComposer:
|
case Action.FocusComposer:
|
||||||
this._editorRef && this._editorRef.focus();
|
this._editorRef && this._editorRef.focus();
|
||||||
break;
|
break;
|
||||||
case 'insert_mention':
|
case 'insert_mention_send_composer':
|
||||||
this._insertMention(payload.user_id);
|
this._editorRef && this._editorRef.insertMention(payload.user_id);
|
||||||
break;
|
break;
|
||||||
case 'quote':
|
case 'quote':
|
||||||
this._insertQuotedMessage(payload.event);
|
this._insertQuotedMessage(payload.event);
|
||||||
|
@ -494,25 +494,6 @@ export default class SendMessageComposer extends React.Component {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_insertMention(userId) {
|
|
||||||
const {model} = this;
|
|
||||||
const {partCreator} = model;
|
|
||||||
const member = this.props.room.getMember(userId);
|
|
||||||
const displayName = member ?
|
|
||||||
member.rawDisplayName : userId;
|
|
||||||
const caret = this._editorRef.getCaret();
|
|
||||||
const position = model.positionForOffset(caret.offset, caret.atNodeEnd);
|
|
||||||
// index is -1 if there are no parts but we only care for if this would be the part in position 0
|
|
||||||
const insertIndex = position.index > 0 ? position.index : 0;
|
|
||||||
const parts = partCreator.createMentionParts(insertIndex, displayName, userId);
|
|
||||||
model.transform(() => {
|
|
||||||
const addedLen = model.insert(parts, position);
|
|
||||||
return model.positionForOffset(caret.offset + addedLen, true);
|
|
||||||
});
|
|
||||||
// refocus on composer, as we just clicked "Mention"
|
|
||||||
this._editorRef && this._editorRef.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
_insertQuotedMessage(event) {
|
_insertQuotedMessage(event) {
|
||||||
const {model} = this;
|
const {model} = this;
|
||||||
const {partCreator} = model;
|
const {partCreator} = model;
|
||||||
|
|
Loading…
Reference in a new issue