Merge pull request #6951 from matrix-org/gsouquet/fix-thread-root-hidden

This commit is contained in:
Germain 2021-10-15 15:00:17 +01:00 committed by GitHub
commit cee0d6894f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 5 deletions

View file

@ -460,7 +460,7 @@ export default class MessagePanel extends React.Component<IProps, IState> {
// Checking if the message has a "parentEventId" as we do not // Checking if the message has a "parentEventId" as we do not
// want to hide the root event of the thread // want to hide the root event of the thread
if (mxEv.isThreadRoot && this.props.hideThreadedMessages if (mxEv.isThreadRelation && this.props.hideThreadedMessages
&& SettingsStore.getValue("feature_thread")) { && SettingsStore.getValue("feature_thread")) {
return false; return false;
} }

View file

@ -48,10 +48,8 @@ interface IProps {
} }
interface IState { interface IState {
replyToEvent?: MatrixEvent;
thread?: Thread; thread?: Thread;
editState?: EditorStateTransfer; editState?: EditorStateTransfer;
} }
@replaceableComponent("structures.ThreadView") @replaceableComponent("structures.ThreadView")
@ -69,11 +67,16 @@ export default class ThreadView extends React.Component<IProps, IState> {
public componentDidMount(): void { public componentDidMount(): void {
this.setupThread(this.props.mxEvent); this.setupThread(this.props.mxEvent);
this.dispatcherRef = dis.register(this.onAction); this.dispatcherRef = dis.register(this.onAction);
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
room.on(ThreadEvent.New, this.onNewThread);
} }
public componentWillUnmount(): void { public componentWillUnmount(): void {
this.teardownThread(); this.teardownThread();
dis.unregister(this.dispatcherRef); dis.unregister(this.dispatcherRef);
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
room.on(ThreadEvent.New, this.onNewThread);
} }
public componentDidUpdate(prevProps) { public componentDidUpdate(prevProps) {
@ -135,11 +138,17 @@ export default class ThreadView extends React.Component<IProps, IState> {
} }
}; };
private onNewThread = (thread: Thread) => {
if (thread.id === this.props.mxEvent.getId()) {
this.teardownThread();
this.setupThread(this.props.mxEvent);
}
};
private updateThread = (thread?: Thread) => { private updateThread = (thread?: Thread) => {
if (thread) { if (thread) {
this.setState({ this.setState({
thread, thread,
replyToEvent: thread.replyToEvent,
}); });
} }

View file

@ -476,6 +476,9 @@ export default class EventTile extends React.Component<IProps, IState> {
this.props.mxEvent.once(ThreadEvent.Ready, this.updateThread); this.props.mxEvent.once(ThreadEvent.Ready, this.updateThread);
this.props.mxEvent.on(ThreadEvent.Update, this.updateThread); this.props.mxEvent.on(ThreadEvent.Update, this.updateThread);
} }
const room = this.context.getRoom(this.props.mxEvent.getRoomId());
room.on(ThreadEvent.New, this.onNewThread);
} }
private updateThread = (thread) => { private updateThread = (thread) => {
@ -517,6 +520,9 @@ export default class EventTile extends React.Component<IProps, IState> {
this.props.mxEvent.off(ThreadEvent.Ready, this.updateThread); this.props.mxEvent.off(ThreadEvent.Ready, this.updateThread);
this.props.mxEvent.off(ThreadEvent.Update, this.updateThread); this.props.mxEvent.off(ThreadEvent.Update, this.updateThread);
} }
const room = this.context.getRoom(this.props.mxEvent.getRoomId());
room.off(ThreadEvent.New, this.onNewThread);
} }
componentDidUpdate(prevProps, prevState, snapshot) { componentDidUpdate(prevProps, prevState, snapshot) {
@ -527,12 +533,32 @@ export default class EventTile extends React.Component<IProps, IState> {
} }
} }
private onNewThread = (thread: Thread) => {
if (thread.id === this.props.mxEvent.getId()) {
this.updateThread(thread);
const room = this.context.getRoom(this.props.mxEvent.getRoomId());
room.off(ThreadEvent.New, this.onNewThread);
}
};
private renderThreadInfo(): React.ReactNode { private renderThreadInfo(): React.ReactNode {
if (!SettingsStore.getValue("feature_thread")) { if (!SettingsStore.getValue("feature_thread")) {
return null; return null;
} }
const thread = this.state.thread; /**
* Accessing the threads value through the room due to a race condition
* that will be solved when there are proper backend support for threads
* We currently have no reliable way to discover than an event is a thread
* when we are at the sync stage
*/
const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
const thread = room.threads.get(this.props.mxEvent.getId());
if (thread && !thread.ready) {
thread.addEvent(this.props.mxEvent, true);
}
if (!thread || this.props.showThreadInfo === false || thread.length <= 1) { if (!thread || this.props.showThreadInfo === false || thread.length <= 1) {
return null; return null;
} }