mirror of
https://github.com/element-hq/element-web.git
synced 2024-12-18 07:01:59 +03:00
Merge pull request #6951 from matrix-org/gsouquet/fix-thread-root-hidden
This commit is contained in:
commit
cee0d6894f
3 changed files with 40 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue