From 4110f4d063d616b021b2b70ccc86b1fae8ed8803 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 3 Dec 2025 09:11:02 +0100 Subject: [PATCH] Can load older messages in conversations --- .../src/utils/RoomEventsManager.ts | 4 ++ .../src/widgets/messages/RoomMessagesList.tsx | 52 +++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/matrixgw_frontend/src/utils/RoomEventsManager.ts b/matrixgw_frontend/src/utils/RoomEventsManager.ts index d324ec5..4ac527d 100644 --- a/matrixgw_frontend/src/utils/RoomEventsManager.ts +++ b/matrixgw_frontend/src/utils/RoomEventsManager.ts @@ -36,6 +36,10 @@ export class RoomEventsManager { typingUsers: string[]; receiptsEventsMap: Map; + get canLoadOlder(): boolean { + return !!this.endToken; + } + constructor( room: Room, initialMessages: MatrixEventsList, diff --git a/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx b/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx index f0c0aff..4553ab6 100644 --- a/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx +++ b/matrixgw_frontend/src/widgets/messages/RoomMessagesList.tsx @@ -7,6 +7,7 @@ import { Button, ButtonGroup, Chip, + CircularProgress, Dialog, DialogActions, DialogContent, @@ -40,6 +41,10 @@ export function RoomMessagesList(p: { users: UsersMap; manager: RoomEventsManager; }): React.ReactElement { + const snackbar = useSnackbar(); + + const [loadingOlder, setLoadingOlder] = React.useState(false); + const listContainerRef = React.createRef(); const messagesEndRef = React.createRef(); @@ -50,8 +55,9 @@ export function RoomMessagesList(p: { }, [p.manager.messages.at(-1)?.event_id]); // Watch scroll to detect when user reach the top to load older messages - const handleScroll = () => { - if (!listContainerRef.current) return; + const handleScroll = async () => { + if (!listContainerRef.current || loadingOlder || !p.manager.canLoadOlder) + return; const { scrollTop } = listContainerRef.current; @@ -59,9 +65,20 @@ export function RoomMessagesList(p: { return; } - console.log("reached top"); - // TODO : load old messages - // TODO : block when user reached begining of conversation + setLoadingOlder(true); + + try { + const older = await MatrixApiEvent.GetRoomEvents( + p.room, + p.manager.endToken + ); + p.manager.processNewEvents(older); + } catch (e) { + console.error("Failed to load older messages!", e); + snackbar(`Failed to load older messages for conversation! ${e}`); + } finally { + setLoadingOlder(false); + } }; return ( @@ -90,6 +107,31 @@ export function RoomMessagesList(p: { )} + {/** Begining of conversation */} + {!p.manager.canLoadOlder && ( + + Begining of conversation + + )} + + {/** Loading older messages spinner */} + {loadingOlder && ( +
+ +
+ )} + {p.manager.messages.map((m, idx) => (