42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { RelationType, Room } from 'matrix-js-sdk';
|
|
import { Editor } from 'slate';
|
|
import { ReactEditor } from 'slate-react';
|
|
import { getEditedEvent } from '../../utils/room';
|
|
import { IReplyDraft } from '../../state/room/roomInputDrafts';
|
|
|
|
export const startReplyToEvent = (
|
|
room: Room,
|
|
eventId: string,
|
|
setReplyDraft: (draft: IReplyDraft | undefined) => void,
|
|
editor?: Editor,
|
|
startThread = false
|
|
): boolean => {
|
|
const replyEvt = room.findEventById(eventId);
|
|
if (!replyEvt || replyEvt.isRedacted()) return false;
|
|
|
|
const editedReply = getEditedEvent(eventId, replyEvt, room.getUnfilteredTimelineSet());
|
|
const content = editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent();
|
|
const { body, formatted_body: formattedBody } = content;
|
|
const senderId = replyEvt.getSender();
|
|
|
|
if (!senderId || typeof body !== 'string') return false;
|
|
|
|
const relation = startThread
|
|
? { rel_type: RelationType.Thread, event_id: eventId }
|
|
: replyEvt.getWireContent()['m.relates_to'];
|
|
|
|
setReplyDraft({
|
|
userId: senderId,
|
|
eventId,
|
|
body,
|
|
formattedBody,
|
|
relation,
|
|
});
|
|
|
|
if (editor) {
|
|
setTimeout(() => ReactEditor.focus(editor), 100);
|
|
}
|
|
|
|
return true;
|
|
};
|