PR feedback: put findPrev/NextEditableEvent in one function with flag
parent
4626581dbe
commit
e193522db1
|
@ -23,7 +23,7 @@ import EditorModel from '../../../editor/model';
|
||||||
import {setCaretPosition} from '../../../editor/caret';
|
import {setCaretPosition} from '../../../editor/caret';
|
||||||
import {getCaretOffsetAndText} from '../../../editor/dom';
|
import {getCaretOffsetAndText} from '../../../editor/dom';
|
||||||
import {htmlSerializeIfNeeded, textSerialize} from '../../../editor/serialize';
|
import {htmlSerializeIfNeeded, textSerialize} from '../../../editor/serialize';
|
||||||
import {findPreviousEditableEvent, findNextEditableEvent} from '../../../utils/EventUtils';
|
import {findEditableEvent} from '../../../utils/EventUtils';
|
||||||
import {parseEvent} from '../../../editor/deserialize';
|
import {parseEvent} from '../../../editor/deserialize';
|
||||||
import Autocomplete from '../rooms/Autocomplete';
|
import Autocomplete from '../rooms/Autocomplete';
|
||||||
import {PartCreator} from '../../../editor/parts';
|
import {PartCreator} from '../../../editor/parts';
|
||||||
|
@ -133,7 +133,7 @@ export default class MessageEditor extends React.Component {
|
||||||
if (this._hasModifications || !this._isCaretAtStart()) {
|
if (this._hasModifications || !this._isCaretAtStart()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const previousEvent = findPreviousEditableEvent(this._getRoom(), this.props.event.getId());
|
const previousEvent = findEditableEvent(this._getRoom(), false, this.props.event.getId());
|
||||||
if (previousEvent) {
|
if (previousEvent) {
|
||||||
dis.dispatch({action: 'edit_event', event: previousEvent});
|
dis.dispatch({action: 'edit_event', event: previousEvent});
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -142,7 +142,7 @@ export default class MessageEditor extends React.Component {
|
||||||
if (this._hasModifications || !this._isCaretAtEnd()) {
|
if (this._hasModifications || !this._isCaretAtEnd()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const nextEvent = findNextEditableEvent(this._getRoom(), this.props.event.getId());
|
const nextEvent = findEditableEvent(this._getRoom(), true, this.props.event.getId());
|
||||||
if (nextEvent) {
|
if (nextEvent) {
|
||||||
dis.dispatch({action: 'edit_event', event: nextEvent});
|
dis.dispatch({action: 'edit_event', event: nextEvent});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -59,7 +59,7 @@ import RoomViewStore from '../../../stores/RoomViewStore';
|
||||||
import ReplyThread from "../elements/ReplyThread";
|
import ReplyThread from "../elements/ReplyThread";
|
||||||
import {ContentHelpers} from 'matrix-js-sdk';
|
import {ContentHelpers} from 'matrix-js-sdk';
|
||||||
import AccessibleButton from '../elements/AccessibleButton';
|
import AccessibleButton from '../elements/AccessibleButton';
|
||||||
import { findPreviousEditableEvent } from '../../../utils/EventUtils';
|
import {findEditableEvent} from '../../../utils/EventUtils';
|
||||||
|
|
||||||
const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$');
|
const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$');
|
||||||
|
|
||||||
|
@ -1181,7 +1181,7 @@ export default class MessageComposerInput extends React.Component {
|
||||||
if (up) {
|
if (up) {
|
||||||
if (!selection.anchor.isAtStartOfNode(document)) return;
|
if (!selection.anchor.isAtStartOfNode(document)) return;
|
||||||
|
|
||||||
const editEvent = findPreviousEditableEvent(this.props.room);
|
const editEvent = findEditableEvent(this.props.room, false);
|
||||||
if (editEvent) {
|
if (editEvent) {
|
||||||
// We're selecting history, so prevent the key event from doing anything else
|
// We're selecting history, so prevent the key event from doing anything else
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
|
@ -52,34 +52,29 @@ export function canEditContent(mxEvent) {
|
||||||
mxEvent.getSender() === MatrixClientPeg.get().getUserId();
|
mxEvent.getSender() === MatrixClientPeg.get().getUserId();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function findPreviousEditableEvent(room, fromEventId = undefined) {
|
export function findEditableEvent(room, isForward, fromEventId = undefined) {
|
||||||
const liveTimeline = room.getLiveTimeline();
|
const liveTimeline = room.getLiveTimeline();
|
||||||
const events = liveTimeline.getEvents();
|
const events = liveTimeline.getEvents();
|
||||||
let startFromIdx = events.length - 1;
|
const maxIdx = events.length - 1;
|
||||||
if (fromEventId) {
|
const inc = isForward ? 1 : -1;
|
||||||
const fromEventIdx = findLastIndex(events, e => e.getId() === fromEventId);
|
const beginIdx = isForward ? 0 : maxIdx;
|
||||||
if (fromEventIdx !== -1) {
|
let endIdx = isForward ? maxIdx : 0;
|
||||||
startFromIdx = fromEventIdx - 1;
|
if (!fromEventId) {
|
||||||
|
endIdx = Math.min(Math.max(0, beginIdx + (inc * 100)), maxIdx);
|
||||||
}
|
}
|
||||||
|
let foundFromEventId = !fromEventId;
|
||||||
|
for (let i = beginIdx; i !== (endIdx + inc); i += inc) {
|
||||||
|
const e = events[i];
|
||||||
|
// find start event first
|
||||||
|
if (!foundFromEventId && e.getId() === fromEventId) {
|
||||||
|
foundFromEventId = true;
|
||||||
|
// don't look further than 100 events from `fromEventId`
|
||||||
|
// to not iterate potentially 1000nds of events on key up/down
|
||||||
|
endIdx = Math.min(Math.max(0, i + (inc * 100)), maxIdx);
|
||||||
|
} else if (foundFromEventId && !shouldHideEvent(e) && canEditContent(e)) {
|
||||||
|
// otherwise look for editable event
|
||||||
|
return e;
|
||||||
}
|
}
|
||||||
const nextEventIdx = findLastIndex(events, e => !shouldHideEvent(e) && canEditContent(e), startFromIdx);
|
|
||||||
if (nextEventIdx !== -1) {
|
|
||||||
return events[nextEventIdx];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function findNextEditableEvent(room, fromEventId = undefined) {
|
|
||||||
const liveTimeline = room.getLiveTimeline();
|
|
||||||
const events = liveTimeline.getEvents();
|
|
||||||
let startFromIdx = 0;
|
|
||||||
if (fromEventId) {
|
|
||||||
const fromEventIdx = findIndex(events, e => e.getId() === fromEventId);
|
|
||||||
if (fromEventIdx !== -1) {
|
|
||||||
startFromIdx = fromEventIdx + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const nextEventIdx = findIndex(events, e => !shouldHideEvent(e) && canEditContent(e), startFromIdx);
|
|
||||||
if (nextEventIdx !== -1) {
|
|
||||||
return events[nextEventIdx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue