118 lines
3.6 KiB
TypeScript
118 lines
3.6 KiB
TypeScript
/*
|
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import { IContent, IEventRelation, MatrixEvent, MsgType } from "matrix-js-sdk/src/matrix";
|
|
|
|
import { RoomPermalinkCreator } from "../../../../../utils/permalinks/Permalinks";
|
|
import { addReplyToMessageContent } from "../../../../../utils/Reply";
|
|
|
|
// Merges favouring the given relation
|
|
function attachRelation(content: IContent, relation?: IEventRelation): void {
|
|
if (relation) {
|
|
content['m.relates_to'] = {
|
|
...(content['m.relates_to'] || {}),
|
|
...relation,
|
|
};
|
|
}
|
|
}
|
|
|
|
function getHtmlReplyFallback(mxEvent: MatrixEvent): string {
|
|
const html = mxEvent.getContent().formatted_body;
|
|
if (!html) {
|
|
return "";
|
|
}
|
|
const rootNode = new DOMParser().parseFromString(html, "text/html").body;
|
|
const mxReply = rootNode.querySelector("mx-reply");
|
|
return (mxReply && mxReply.outerHTML) || "";
|
|
}
|
|
|
|
interface CreateMessageContentParams {
|
|
relation?: IEventRelation;
|
|
replyToEvent?: MatrixEvent;
|
|
permalinkCreator?: RoomPermalinkCreator;
|
|
includeReplyLegacyFallback?: boolean;
|
|
editedEvent?: MatrixEvent;
|
|
}
|
|
|
|
export function createMessageContent(
|
|
message: string,
|
|
{ relation, replyToEvent, permalinkCreator, includeReplyLegacyFallback = true, editedEvent }:
|
|
CreateMessageContentParams,
|
|
): IContent {
|
|
// TODO emote ?
|
|
|
|
const isReply = Boolean(replyToEvent?.replyEventId);
|
|
const isEditing = Boolean(editedEvent);
|
|
|
|
/*const isEmote = containsEmote(model);
|
|
if (isEmote) {
|
|
model = stripEmoteCommand(model);
|
|
}
|
|
if (startsWith(model, "//")) {
|
|
model = stripPrefix(model, "/");
|
|
}
|
|
model = unescapeMessage(model);*/
|
|
|
|
// const body = textSerialize(model);
|
|
const body = message;
|
|
|
|
const content: IContent = {
|
|
// TODO emote
|
|
// msgtype: isEmote ? "m.emote" : "m.text",
|
|
msgtype: MsgType.Text,
|
|
body: body,
|
|
};
|
|
|
|
// TODO markdown support
|
|
|
|
/*const formattedBody = htmlSerializeIfNeeded(model, {
|
|
forceHTML: !!replyToEvent,
|
|
useMarkdown: SettingsStore.getValue("MessageComposerInput.useMarkdown"),
|
|
});*/
|
|
const formattedBody = message;
|
|
|
|
if (formattedBody) {
|
|
content.format = "org.matrix.custom.html";
|
|
|
|
const htmlPrefix = isReply ? getHtmlReplyFallback(editedEvent) : '';
|
|
content.formatted_body = isEditing ? `${htmlPrefix} * ${formattedBody}` : formattedBody;
|
|
|
|
if (isEditing) {
|
|
content['m.new_content'] = {
|
|
"msgtype": content.msgtype,
|
|
"body": body,
|
|
"format": "org.matrix.custom.html",
|
|
'formatted_body': formattedBody,
|
|
};
|
|
}
|
|
}
|
|
|
|
const newRelation = isEditing ?
|
|
{ ...relation, 'rel_type': 'm.replace', 'event_id': editedEvent.getId() }
|
|
: relation;
|
|
|
|
attachRelation(content, newRelation);
|
|
|
|
if (!isEditing && replyToEvent && permalinkCreator) {
|
|
addReplyToMessageContent(content, replyToEvent, {
|
|
permalinkCreator,
|
|
includeLegacyFallback: includeReplyLegacyFallback,
|
|
});
|
|
}
|
|
|
|
return content;
|
|
}
|