Merge pull request #619 from vector-im/threading-fallback-threading

Threading fallback - PR 3 - Send replies to threaded message as thread
This commit is contained in:
Bruno Windels 2022-01-14 19:16:13 +01:00 committed by GitHub
commit 144f1304b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 8 deletions

View file

@ -16,9 +16,9 @@ limitations under the License.
import {BaseEntry} from "./BaseEntry"; import {BaseEntry} from "./BaseEntry";
import {REDACTION_TYPE} from "../../common.js"; import {REDACTION_TYPE} from "../../common.js";
import {createAnnotation, ANNOTATION_RELATION_TYPE, getRelationFromContent} from "../relations.js"; import {createAnnotation, ANNOTATION_RELATION_TYPE, THREADING_RELATION_TYPE, getRelationFromContent} from "../relations.js";
import {PendingAnnotation} from "../PendingAnnotation.js"; import {PendingAnnotation} from "../PendingAnnotation.js";
import {createReplyContent} from "./reply.js" import {createReplyContent} from "./reply.js";
/** Deals mainly with local echo for relations and redactions, /** Deals mainly with local echo for relations and redactions,
* so it is shared between PendingEventEntry and EventEntry */ * so it is shared between PendingEventEntry and EventEntry */
@ -32,7 +32,11 @@ export class BaseEventEntry extends BaseEntry {
} }
get isReply() { get isReply() {
return !!this.relation?.["m.in_reply_to"]; return !!this.relation?.["m.in_reply_to"] || this.isThread;
}
get isThread() {
return this.relation?.["rel_type"] === THREADING_RELATION_TYPE;
} }
get isRedacting() { get isRedacting() {

View file

@ -124,6 +124,13 @@ export class EventEntry extends BaseEventEntry {
return getRelatedEventId(this.event); return getRelatedEventId(this.event);
} }
get threadEventId() {
if (this.isThread) {
return this.relation?.event_id;
}
return null;
}
get isRedacted() { get isRedacted() {
return super.isRedacted || isRedacted(this._eventEntry.event); return super.isRedacted || isRedacted(this._eventEntry.event);
} }

View file

@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import {THREADING_RELATION_TYPE} from "../relations.js";
function htmlEscape(string) { function htmlEscape(string) {
return string.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); return string.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
} }
@ -36,8 +38,8 @@ function fallbackPrefix(msgtype) {
return msgtype === "m.emote" ? "* " : ""; return msgtype === "m.emote" ? "* " : "";
} }
function _createReplyContent(targetId, msgtype, body, formattedBody) { function _createReplyContent(targetId, msgtype, body, formattedBody, threadId) {
return { const reply = {
msgtype, msgtype,
body, body,
"format": "org.matrix.custom.html", "format": "org.matrix.custom.html",
@ -48,10 +50,16 @@ function _createReplyContent(targetId, msgtype, body, formattedBody) {
} }
} }
}; };
if (threadId) {
Object.assign(reply["m.relates_to"], {
rel_type: THREADING_RELATION_TYPE,
event_id: threadId,
});
}
return reply;
} }
export function createReplyContent(entry, msgtype, body) { export function createReplyContent(entry, msgtype, body) {
// TODO check for absense of sender / body / msgtype / etc?
const nonTextual = fallbackForNonTextualMessage(entry.content.msgtype); const nonTextual = fallbackForNonTextualMessage(entry.content.msgtype);
const prefix = fallbackPrefix(entry.content.msgtype); const prefix = fallbackPrefix(entry.content.msgtype);
const sender = entry.sender; const sender = entry.sender;
@ -70,5 +78,5 @@ export function createReplyContent(entry, msgtype, body) {
const newBody = plainFallback + '\n\n' + body; const newBody = plainFallback + '\n\n' + body;
const newFormattedBody = formattedFallback + htmlEscape(body); const newFormattedBody = formattedFallback + htmlEscape(body);
return _createReplyContent(entry.id, msgtype, newBody, newFormattedBody); return _createReplyContent(entry.id, msgtype, newBody, newFormattedBody, entry.threadEventId);
} }

View file

@ -18,6 +18,7 @@ import {REDACTION_TYPE} from "../common.js";
export const REACTION_TYPE = "m.reaction"; export const REACTION_TYPE = "m.reaction";
export const ANNOTATION_RELATION_TYPE = "m.annotation"; export const ANNOTATION_RELATION_TYPE = "m.annotation";
export const THREADING_RELATION_TYPE = "io.element.thread";
export function createAnnotation(targetId, key) { export function createAnnotation(targetId, key) {
return { return {
@ -30,7 +31,7 @@ export function createAnnotation(targetId, key) {
} }
export function getRelationTarget(relation) { export function getRelationTarget(relation) {
return relation.event_id || relation["m.in_reply_to"]?.event_id return relation["m.in_reply_to"]?.event_id || relation.event_id;
} }
export function setRelationTarget(relation, target) { export function setRelationTarget(relation, target) {