Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 35ebca2

Browse files
author
Germain
authored
Fix thread filtering and ordering (#7586)
1 parent 91743c9 commit 35ebca2

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/components/structures/ThreadPanel.tsx

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
17+
import React, { useContext, useEffect, useRef, useState } from 'react';
1818
import { EventTimelineSet } from 'matrix-js-sdk/src/models/event-timeline-set';
1919
import { Room } from 'matrix-js-sdk/src/models/room';
2020
import { RelationType } from 'matrix-js-sdk/src/@types/event';
@@ -25,6 +25,7 @@ import {
2525
UNSTABLE_FILTER_RELATION_SENDERS,
2626
UNSTABLE_FILTER_RELATION_TYPES,
2727
} from 'matrix-js-sdk/src/filter';
28+
import { ThreadEvent } from 'matrix-js-sdk/src/models/thread';
2829

2930
import BaseCard from "../views/right_panel/BaseCard";
3031
import ResizeNotifier from '../../utils/ResizeNotifier';
@@ -37,6 +38,7 @@ import TimelinePanel from './TimelinePanel';
3738
import { Layout } from '../../settings/enums/Layout';
3839
import { TileShape } from '../views/rooms/EventTile';
3940
import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks';
41+
import { useEventEmitter } from '../../hooks/useEventEmitter';
4042

4143
async function getThreadTimelineSet(
4244
client: MatrixClient,
@@ -84,12 +86,18 @@ async function getThreadTimelineSet(
8486
// filter fields. We fallback to the threads that have been discovered in
8587
// the main timeline
8688
const timelineSet = new EventTimelineSet(room, {});
87-
for (const [, thread] of room.threads) {
88-
const isOwnEvent = thread.rootEvent.getSender() === client.getUserId();
89-
if (filterType !== ThreadFilterType.My || isOwnEvent) {
90-
timelineSet.getLiveTimeline().addEvent(thread.rootEvent, false);
91-
}
92-
}
89+
90+
Array.from(room.threads)
91+
.sort(([, threadA], [, threadB]) => threadA.lastReply.getTs() - threadB.lastReply.getTs())
92+
.forEach(([, thread]) => {
93+
const isOwnEvent = thread.rootEvent.getSender() === client.getUserId();
94+
if (filterType !== ThreadFilterType.My || isOwnEvent) {
95+
timelineSet.getLiveTimeline().addEvent(thread.rootEvent, false);
96+
}
97+
});
98+
99+
// for (const [, thread] of room.threads) {
100+
// }
93101
return timelineSet;
94102
}
95103
}
@@ -210,18 +218,18 @@ const ThreadPanel: React.FC<IProps> = ({ roomId, onClose, permalinkCreator }) =>
210218
const ref = useRef<TimelinePanel>();
211219

212220
const [timelineSet, setTimelineSet] = useState<EventTimelineSet | null>(null);
213-
const timelineSetPromise = useMemo(
214-
async () => {
215-
const timelineSet = getThreadTimelineSet(mxClient, room, filterOption);
216-
return timelineSet;
217-
},
218-
[mxClient, room, filterOption],
219-
);
220221
useEffect(() => {
221-
timelineSetPromise
222+
getThreadTimelineSet(mxClient, room, filterOption)
222223
.then(timelineSet => { setTimelineSet(timelineSet); })
223224
.catch(() => setTimelineSet(null));
224-
}, [timelineSetPromise]);
225+
}, [mxClient, room, filterOption]);
226+
227+
useEffect(() => {
228+
if (timelineSet) ref.current.refreshTimeline();
229+
}, [timelineSet, ref]);
230+
useEventEmitter(room, ThreadEvent.Update, () => {
231+
if (timelineSet) ref.current.refreshTimeline();
232+
});
225233

226234
return (
227235
<RoomContext.Provider value={{

0 commit comments

Comments
 (0)