Remove remaining reply fallbacks code (#28610)

* Remove remaining reply fallbacks code

as MSC2781 has been merged

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Update tests

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2024-12-02 13:13:12 +00:00 committed by GitHub
parent 00aadf1580
commit 84709df3c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 18 additions and 74 deletions

View file

@ -43,25 +43,6 @@ import { attachMentions, attachRelation } from "./SendMessageComposer";
import { filterBoolean } from "../../../utils/arrays"; import { filterBoolean } from "../../../utils/arrays";
import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { MatrixClientPeg } from "../../../MatrixClientPeg";
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) || "";
}
function getTextReplyFallback(mxEvent: MatrixEvent): string {
const body: string = mxEvent.getContent().body;
const lines = body.split("\n").map((l) => l.trim());
if (lines.length > 2 && lines[0].startsWith("> ") && lines[1].length === 0) {
return `${lines[0]}\n\n`;
}
return "";
}
// exported for tests // exported for tests
export function createEditContent( export function createEditContent(
model: EditorModel, model: EditorModel,
@ -72,15 +53,6 @@ export function createEditContent(
if (isEmote) { if (isEmote) {
model = stripEmoteCommand(model); model = stripEmoteCommand(model);
} }
const isReply = !!editedEvent.replyEventId;
let plainPrefix = "";
let htmlPrefix = "";
if (isReply) {
plainPrefix = getTextReplyFallback(editedEvent);
htmlPrefix = getHtmlReplyFallback(editedEvent);
}
const body = textSerialize(model); const body = textSerialize(model);
const newContent: RoomMessageEventContent = { const newContent: RoomMessageEventContent = {
@ -89,19 +61,18 @@ export function createEditContent(
}; };
const contentBody: RoomMessageTextEventContent & Omit<ReplacementEvent<RoomMessageEventContent>, "m.relates_to"> = { const contentBody: RoomMessageTextEventContent & Omit<ReplacementEvent<RoomMessageEventContent>, "m.relates_to"> = {
"msgtype": newContent.msgtype, "msgtype": newContent.msgtype,
"body": `${plainPrefix} * ${body}`, "body": `* ${body}`,
"m.new_content": newContent, "m.new_content": newContent,
}; };
const formattedBody = htmlSerializeIfNeeded(model, { const formattedBody = htmlSerializeIfNeeded(model, {
forceHTML: isReply,
useMarkdown: SettingsStore.getValue("MessageComposerInput.useMarkdown"), useMarkdown: SettingsStore.getValue("MessageComposerInput.useMarkdown"),
}); });
if (formattedBody) { if (formattedBody) {
newContent.format = "org.matrix.custom.html"; newContent.format = "org.matrix.custom.html";
newContent.formatted_body = formattedBody; newContent.formatted_body = formattedBody;
contentBody.format = newContent.format; contentBody.format = newContent.format;
contentBody.formatted_body = `${htmlPrefix} * ${formattedBody}`; contentBody.formatted_body = `* ${formattedBody}`;
} }
// Build the mentions properties for both the content and new_content. // Build the mentions properties for both the content and new_content.

View file

@ -193,7 +193,6 @@ export function createMessageContent(
body: body, body: body,
}; };
const formattedBody = htmlSerializeIfNeeded(model, { const formattedBody = htmlSerializeIfNeeded(model, {
forceHTML: !!replyToEvent,
useMarkdown: SettingsStore.getValue("MessageComposerInput.useMarkdown"), useMarkdown: SettingsStore.getValue("MessageComposerInput.useMarkdown"),
}); });
if (formattedBody) { if (formattedBody) {

View file

@ -27,28 +27,6 @@ function attachRelation(content: IContent, relation?: IEventRelation): void {
} }
} }
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) || "";
}
function getTextReplyFallback(mxEvent: MatrixEvent): string {
const body = mxEvent.getContent().body;
if (typeof body !== "string") {
return "";
}
const lines = body.split("\n").map((l) => l.trim());
if (lines.length > 2 && lines[0].startsWith("> ") && lines[1].length === 0) {
return `${lines[0]}\n\n`;
}
return "";
}
interface CreateMessageContentParams { interface CreateMessageContentParams {
relation?: IEventRelation; relation?: IEventRelation;
replyToEvent?: MatrixEvent; replyToEvent?: MatrixEvent;
@ -63,8 +41,6 @@ export async function createMessageContent(
{ relation, replyToEvent, editedEvent }: CreateMessageContentParams, { relation, replyToEvent, editedEvent }: CreateMessageContentParams,
): Promise<RoomMessageEventContent> { ): Promise<RoomMessageEventContent> {
const isEditing = isMatrixEvent(editedEvent); const isEditing = isMatrixEvent(editedEvent);
const isReply = isEditing ? Boolean(editedEvent.replyEventId) : isMatrixEvent(replyToEvent);
const isReplyAndEditing = isEditing && isReply;
const isEmote = message.startsWith(EMOTE_PREFIX); const isEmote = message.startsWith(EMOTE_PREFIX);
if (isEmote) { if (isEmote) {
@ -82,12 +58,10 @@ export async function createMessageContent(
// if we're editing rich text, the message content is pure html // if we're editing rich text, the message content is pure html
// BUT if we're not, the message content will be plain text where we need to convert the mentions // BUT if we're not, the message content will be plain text where we need to convert the mentions
const body = isHTML ? await richToPlain(message, false) : convertPlainTextToBody(message); const body = isHTML ? await richToPlain(message, false) : convertPlainTextToBody(message);
const bodyPrefix = (isReplyAndEditing && getTextReplyFallback(editedEvent)) || "";
const formattedBodyPrefix = (isReplyAndEditing && getHtmlReplyFallback(editedEvent)) || "";
const content = { const content = {
msgtype: isEmote ? MsgType.Emote : MsgType.Text, msgtype: isEmote ? MsgType.Emote : MsgType.Text,
body: isEditing ? `${bodyPrefix} * ${body}` : body, body: isEditing ? `* ${body}` : body,
} as RoomMessageTextEventContent & ReplacementEvent<RoomMessageTextEventContent>; } as RoomMessageTextEventContent & ReplacementEvent<RoomMessageTextEventContent>;
// TODO markdown support // TODO markdown support
@ -97,7 +71,7 @@ export async function createMessageContent(
if (formattedBody) { if (formattedBody) {
content.format = "org.matrix.custom.html"; content.format = "org.matrix.custom.html";
content.formatted_body = isEditing ? `${formattedBodyPrefix} * ${formattedBody}` : formattedBody; content.formatted_body = isEditing ? `* ${formattedBody}` : formattedBody;
} }
if (isEditing) { if (isEditing) {

View file

@ -128,7 +128,7 @@ describe("<EditMessageComposer/>", () => {
const expectedBody = { const expectedBody = {
...editedEvent.getContent(), ...editedEvent.getContent(),
"body": " * original message + edit", "body": "* original message + edit",
"m.new_content": { "m.new_content": {
"body": "original message + edit", "body": "original message + edit",
"msgtype": "m.text", "msgtype": "m.text",
@ -160,7 +160,7 @@ describe("<EditMessageComposer/>", () => {
const content = createEditContent(model, editedEvent); const content = createEditContent(model, editedEvent);
expect(content).toEqual({ expect(content).toEqual({
"body": " * hello world", "body": "* hello world",
"msgtype": "m.text", "msgtype": "m.text",
"m.new_content": { "m.new_content": {
"body": "hello world", "body": "hello world",
@ -183,10 +183,10 @@ describe("<EditMessageComposer/>", () => {
const content = createEditContent(model, editedEvent); const content = createEditContent(model, editedEvent);
expect(content).toEqual({ expect(content).toEqual({
"body": " * hello *world*", "body": "* hello *world*",
"msgtype": "m.text", "msgtype": "m.text",
"format": "org.matrix.custom.html", "format": "org.matrix.custom.html",
"formatted_body": " * hello <em>world</em>", "formatted_body": "* hello <em>world</em>",
"m.new_content": { "m.new_content": {
"body": "hello *world*", "body": "hello *world*",
"msgtype": "m.text", "msgtype": "m.text",
@ -210,10 +210,10 @@ describe("<EditMessageComposer/>", () => {
const content = createEditContent(model, editedEvent); const content = createEditContent(model, editedEvent);
expect(content).toEqual({ expect(content).toEqual({
"body": " * blinks __quickly__", "body": "* blinks __quickly__",
"msgtype": "m.emote", "msgtype": "m.emote",
"format": "org.matrix.custom.html", "format": "org.matrix.custom.html",
"formatted_body": " * blinks <strong>quickly</strong>", "formatted_body": "* blinks <strong>quickly</strong>",
"m.new_content": { "m.new_content": {
"body": "blinks __quickly__", "body": "blinks __quickly__",
"msgtype": "m.emote", "msgtype": "m.emote",
@ -238,7 +238,7 @@ describe("<EditMessageComposer/>", () => {
const content = createEditContent(model, editedEvent); const content = createEditContent(model, editedEvent);
expect(content).toEqual({ expect(content).toEqual({
"body": " * ✨sparkles✨", "body": "* ✨sparkles✨",
"msgtype": "m.emote", "msgtype": "m.emote",
"m.new_content": { "m.new_content": {
"body": "✨sparkles✨", "body": "✨sparkles✨",
@ -264,7 +264,7 @@ describe("<EditMessageComposer/>", () => {
// TODO Edits do not properly strip the double slash used to skip // TODO Edits do not properly strip the double slash used to skip
// command processing. // command processing.
expect(content).toEqual({ expect(content).toEqual({
"body": " * //dev/null is my favourite place", "body": "* //dev/null is my favourite place",
"msgtype": "m.text", "msgtype": "m.text",
"m.new_content": { "m.new_content": {
"body": "//dev/null is my favourite place", "body": "//dev/null is my favourite place",

View file

@ -196,9 +196,9 @@ describe("EditWysiwygComposer", () => {
// Then // Then
screen.getByText("Save").click(); screen.getByText("Save").click();
const expectedContent = { const expectedContent = {
"body": ` * foo bar`, "body": `* foo bar`,
"format": "org.matrix.custom.html", "format": "org.matrix.custom.html",
"formatted_body": ` * foo bar`, "formatted_body": `* foo bar`,
"m.new_content": { "m.new_content": {
body: "foo bar", body: "foo bar",
format: "org.matrix.custom.html", format: "org.matrix.custom.html",

View file

@ -88,9 +88,9 @@ describe("createMessageContent", () => {
// Then // Then
expect(content).toEqual({ expect(content).toEqual({
"body": " * *__hello__ world*", "body": "* *__hello__ world*",
"format": "org.matrix.custom.html", "format": "org.matrix.custom.html",
"formatted_body": ` * ${message}`, "formatted_body": `* ${message}`,
"msgtype": "m.text", "msgtype": "m.text",
"m.new_content": { "m.new_content": {
body: "*__hello__ world*", body: "*__hello__ world*",

View file

@ -418,8 +418,8 @@ describe("message", () => {
// Then // Then
const { msgtype, format } = mockEvent.getContent(); const { msgtype, format } = mockEvent.getContent();
const expectedContent = { const expectedContent = {
"body": ` * ${newMessage}`, "body": `* ${newMessage}`,
"formatted_body": ` * ${newMessage}`, "formatted_body": `* ${newMessage}`,
"m.new_content": { "m.new_content": {
body: "Replying to this new content", body: "Replying to this new content",
format: "org.matrix.custom.html", format: "org.matrix.custom.html",