Implement reply chain fallback for threads backwards compatibility (#7565)
This commit is contained in:
parent
a00d359422
commit
41b9e4aa4f
6 changed files with 87 additions and 40 deletions
|
@ -17,7 +17,7 @@ limitations under the License.
|
|||
|
||||
import React from 'react';
|
||||
import classNames from 'classnames';
|
||||
import { MatrixEvent } from 'matrix-js-sdk/src/models/event';
|
||||
import { IEventRelation, MatrixEvent } from 'matrix-js-sdk/src/models/event';
|
||||
import escapeHtml from "escape-html";
|
||||
import sanitizeHtml from "sanitize-html";
|
||||
import { Room } from 'matrix-js-sdk/src/models/room';
|
||||
|
@ -99,22 +99,8 @@ export default class ReplyChain extends React.Component<IProps, IState> {
|
|||
|
||||
public static getParentEventId(ev: MatrixEvent): string | undefined {
|
||||
if (!ev || ev.isRedacted()) return;
|
||||
|
||||
// XXX: For newer relations (annotations, replacements, etc.), we now
|
||||
// have a `getRelation` helper on the event, and you might assume it
|
||||
// could be used here for replies as well... However, the helper
|
||||
// currently assumes the relation has a `rel_type`, which older replies
|
||||
// do not, so this block is left as-is for now.
|
||||
//
|
||||
// We're prefer ev.getContent() over ev.getWireContent() to make sure
|
||||
// we grab the latest edit with potentially new relations. But we also
|
||||
// can't just rely on ev.getContent() by itself because historically we
|
||||
// still show the reply from the original message even though the edit
|
||||
// event does not include the relation reply.
|
||||
const mRelatesTo = ev.getContent()['m.relates_to'] || ev.getWireContent()['m.relates_to'];
|
||||
if (mRelatesTo && mRelatesTo['m.in_reply_to']) {
|
||||
const mInReplyTo = mRelatesTo['m.in_reply_to'];
|
||||
if (mInReplyTo && mInReplyTo['event_id']) return mInReplyTo['event_id'];
|
||||
if (ev.replyEventId) {
|
||||
return ev.replyEventId;
|
||||
} else if (!SettingsStore.getValue("feature_thread") && ev.isThreadRelation) {
|
||||
return ev.threadRootId;
|
||||
}
|
||||
|
@ -232,7 +218,7 @@ export default class ReplyChain extends React.Component<IProps, IState> {
|
|||
return { body, html };
|
||||
}
|
||||
|
||||
public static makeReplyMixIn(ev: MatrixEvent) {
|
||||
public static makeReplyMixIn(ev: MatrixEvent, renderIn?: string[]) {
|
||||
if (!ev) return {};
|
||||
|
||||
const mixin: any = {
|
||||
|
@ -243,6 +229,10 @@ export default class ReplyChain extends React.Component<IProps, IState> {
|
|||
},
|
||||
};
|
||||
|
||||
if (renderIn) {
|
||||
mixin['m.relates_to']['m.in_reply_to']['m.render_in'] = renderIn;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the event replied is part of a thread
|
||||
* Add the `m.thread` relation so that clients
|
||||
|
@ -260,8 +250,21 @@ export default class ReplyChain extends React.Component<IProps, IState> {
|
|||
return mixin;
|
||||
}
|
||||
|
||||
public static hasReply(event: MatrixEvent) {
|
||||
return Boolean(ReplyChain.getParentEventId(event));
|
||||
public static shouldDisplayReply(event: MatrixEvent, renderTarget?: string): boolean {
|
||||
const parentExist = Boolean(ReplyChain.getParentEventId(event));
|
||||
|
||||
const relations = event.getRelation();
|
||||
const renderIn = relations?.["m.in_reply_to"]?.["m.render_in"] ?? [];
|
||||
|
||||
const shouldRenderInTarget = !renderTarget || (renderIn.includes(renderTarget));
|
||||
|
||||
return parentExist && shouldRenderInTarget;
|
||||
}
|
||||
|
||||
public static getRenderInMixin(relation?: IEventRelation): string[] | undefined {
|
||||
if (relation?.rel_type === RelationType.Thread) {
|
||||
return [RelationType.Thread];
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue