Skip to content

Commit c8f075e

Browse files
authored
fix: reduce number of http calls to fetch messages
1 parent 5c2cbd3 commit c8f075e

File tree

1 file changed

+44
-38
lines changed

1 file changed

+44
-38
lines changed

src/hooks/useLatestEvents.ts

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -61,51 +61,57 @@ const useLatestEvents = ({
6161

6262
useEffect(() => {
6363
if (mx) {
64-
(async () => {
65-
const decryptionPromises = rooms.map((room) => room.decryptCriticalEvents());
64+
const getLatestPreviewEvent = async (room: Room) => {
65+
const lastLiveEvent = room.getLastLiveEvent();
66+
67+
if (lastLiveEvent && shouldShowEvent(mx, lastLiveEvent)) {
68+
await mx.decryptEventIfNeeded(lastLiveEvent);
69+
return lastLiveEvent;
70+
}
71+
72+
const events = room.getLiveTimeline().getEvents();
73+
const decryptionPromises = events.map((event) => mx.decryptEventIfNeeded(event));
6674
await Promise.all(decryptionPromises);
67-
const _latestEvents = rooms.map((room) => {
68-
const events = room.getLiveTimeline().getEvents();
6975

70-
for (let i = events.length - 1; i >= 0; i -= 1) {
71-
const event = events[i];
72-
if (shouldShowEvent(mx, event)) {
73-
return event;
74-
}
76+
const decryptedEvents = room.getLiveTimeline().getEvents();
77+
for (let i = decryptedEvents.length - 1; i >= 0; i -= 1) {
78+
const event = decryptedEvents[i];
79+
if (shouldShowEvent(mx, event)) {
80+
return event;
7581
}
76-
return undefined;
77-
});
78-
setLatestEvents(_latestEvents);
79-
})();
80-
}
81-
}, [mx, rooms]);
82+
}
83+
84+
return undefined;
85+
};
8286

83-
useEffect(() => {
84-
if (mx) {
8587
(async () => {
86-
const timelinePromises = rooms.map((room) => {
87-
const timeline = room.getLiveTimeline();
88-
return mx?.paginateEventTimeline(timeline, {
89-
backwards: true,
90-
limit: 10,
91-
});
92-
});
93-
await Promise.all(timelinePromises);
94-
95-
const decryptionPromises = rooms.map((room) => room.decryptAllEvents());
96-
await Promise.all(decryptionPromises);
97-
const _latestEvents = rooms.map((room) => {
98-
const events = room.getLiveTimeline().getEvents();
88+
const latestEventsPromises = rooms.map((room) => getLatestPreviewEvent(room));
89+
const _latestEvents = await Promise.all(latestEventsPromises);
9990

100-
for (let i = events.length - 1; i >= 0; i -= 1) {
101-
const event = events[i];
102-
if (shouldShowEvent(mx, event)) {
103-
return event;
104-
}
105-
}
106-
return undefined;
107-
});
10891
setLatestEvents(_latestEvents);
92+
93+
const undefinedIndexes = _latestEvents.map(
94+
(value, index) => value === undefined ? index : undefined
95+
).filter(
96+
(index) => index !== undefined
97+
);
98+
99+
const backPaginationPromises = undefinedIndexes.map(
100+
(index) => {
101+
const room = rooms[index];
102+
const timeline = room.getLiveTimeline();
103+
return mx?.paginateEventTimeline(timeline, {
104+
backwards: true,
105+
limit: 10,
106+
});
107+
}
108+
);
109+
await Promise.all(backPaginationPromises);
110+
111+
const newLatestEventsPromises = rooms.map((room) => getLatestPreviewEvent(room));
112+
const _newLatestEvents = await Promise.all(newLatestEventsPromises);
113+
114+
setLatestEvents(_newLatestEvents);
109115
})();
110116
}
111117
}, [mx, rooms]);

0 commit comments

Comments
 (0)