50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import type { MatrixEvent } from "matrix-js-sdk";
|
|
import { RelationType } from "matrix-js-sdk";
|
|
import type { RoomMessageEventContent } from "matrix-js-sdk/lib/@types/events.js";
|
|
|
|
export function resolveMatrixThreadTarget(params: {
|
|
threadReplies: "off" | "inbound" | "always";
|
|
messageId: string;
|
|
threadRootId?: string;
|
|
isThreadRoot?: boolean;
|
|
}): string | undefined {
|
|
const { threadReplies, messageId, threadRootId } = params;
|
|
if (threadReplies === "off") return undefined;
|
|
const isThreadRoot = params.isThreadRoot === true;
|
|
const hasInboundThread = Boolean(threadRootId && threadRootId !== messageId && !isThreadRoot);
|
|
if (threadReplies === "inbound") {
|
|
return hasInboundThread ? threadRootId : undefined;
|
|
}
|
|
if (threadReplies === "always") {
|
|
return threadRootId ?? messageId;
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
export function resolveMatrixThreadRootId(params: {
|
|
event: MatrixEvent;
|
|
content: RoomMessageEventContent;
|
|
}): string | undefined {
|
|
const fromThread = params.event.getThread?.()?.id;
|
|
if (fromThread) return fromThread;
|
|
const direct = params.event.threadRootId ?? undefined;
|
|
if (direct) return direct;
|
|
const relates = params.content["m.relates_to"];
|
|
if (!relates || typeof relates !== "object") return undefined;
|
|
if ("rel_type" in relates && relates.rel_type === RelationType.Thread) {
|
|
if ("event_id" in relates && typeof relates.event_id === "string") {
|
|
return relates.event_id;
|
|
}
|
|
if (
|
|
"m.in_reply_to" in relates &&
|
|
typeof relates["m.in_reply_to"] === "object" &&
|
|
relates["m.in_reply_to"] &&
|
|
"event_id" in relates["m.in_reply_to"] &&
|
|
typeof relates["m.in_reply_to"].event_id === "string"
|
|
) {
|
|
return relates["m.in_reply_to"].event_id;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|