mirror of
https://github.com/element-hq/element-web.git
synced 2024-12-01 10:27:06 +03:00
Merge pull request #1160 from matrix-org/luke/fix-rte-history-overwrite-current-message
Fix #4422 by persisting the "currently composed" message
This commit is contained in:
commit
a2d6918562
2 changed files with 27 additions and 7 deletions
|
@ -52,21 +52,19 @@ export default class ComposerHistoryManager {
|
||||||
history: Array<HistoryItem> = [];
|
history: Array<HistoryItem> = [];
|
||||||
prefix: string;
|
prefix: string;
|
||||||
lastIndex: number = 0;
|
lastIndex: number = 0;
|
||||||
currentIndex: number = -1;
|
currentIndex: number = 0;
|
||||||
|
|
||||||
constructor(roomId: string, prefix: string = 'mx_composer_history_') {
|
constructor(roomId: string, prefix: string = 'mx_composer_history_') {
|
||||||
this.prefix = prefix + roomId;
|
this.prefix = prefix + roomId;
|
||||||
|
|
||||||
// TODO: Performance issues?
|
// TODO: Performance issues?
|
||||||
for(; sessionStorage.getItem(`${this.prefix}[${this.lastIndex}]`); this.lastIndex++, this.currentIndex++) {
|
let item;
|
||||||
|
for(; item = sessionStorage.getItem(`${this.prefix}[${this.currentIndex}]`); this.currentIndex++) {
|
||||||
this.history.push(
|
this.history.push(
|
||||||
Object.assign(
|
Object.assign(new HistoryItem(), JSON.parse(item)),
|
||||||
new HistoryItem(),
|
|
||||||
JSON.parse(sessionStorage.getItem(`${this.prefix}[${this.lastIndex}]`)),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.currentIndex--;
|
this.lastIndex = this.currentIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
addItem(message: string, format: MessageFormat) {
|
addItem(message: string, format: MessageFormat) {
|
||||||
|
|
|
@ -134,6 +134,10 @@ export default class MessageComposerInput extends React.Component {
|
||||||
|
|
||||||
// the original editor state, before we started tabbing through completions
|
// the original editor state, before we started tabbing through completions
|
||||||
originalEditorState: null,
|
originalEditorState: null,
|
||||||
|
|
||||||
|
// the virtual state "above" the history stack, the message currently being composed that
|
||||||
|
// we want to persist whilst browsing history
|
||||||
|
currentlyComposedEditorState: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
// bit of a hack, but we need to do this here since createEditorState needs isRichtextEnabled
|
// bit of a hack, but we need to do this here since createEditorState needs isRichtextEnabled
|
||||||
|
@ -579,6 +583,24 @@ export default class MessageComposerInput extends React.Component {
|
||||||
selectHistory = async (up) => {
|
selectHistory = async (up) => {
|
||||||
const delta = up ? -1 : 1;
|
const delta = up ? -1 : 1;
|
||||||
|
|
||||||
|
// True if we are not currently selecting history, but composing a message
|
||||||
|
if (this.historyManager.currentIndex === this.historyManager.history.length) {
|
||||||
|
// We can't go any further - there isn't any more history, so nop.
|
||||||
|
if (!up) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
currentlyComposedEditorState: this.state.editorState,
|
||||||
|
});
|
||||||
|
} else if (this.historyManager.currentIndex + delta === this.historyManager.history.length) {
|
||||||
|
// True when we return to the message being composed currently
|
||||||
|
this.setState({
|
||||||
|
editorState: this.state.currentlyComposedEditorState,
|
||||||
|
});
|
||||||
|
this.historyManager.currentIndex = this.historyManager.history.length;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const newContent = this.historyManager.getItem(delta, this.state.isRichtextEnabled ? 'html' : 'markdown');
|
const newContent = this.historyManager.getItem(delta, this.state.isRichtextEnabled ? 'html' : 'markdown');
|
||||||
if (!newContent) return false;
|
if (!newContent) return false;
|
||||||
let editorState = EditorState.push(
|
let editorState = EditorState.push(
|
||||||
|
|
Loading…
Reference in a new issue