Add a button to manually load older messages
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-12-03 20:18:11 +01:00
parent bcdfe87107
commit 48d9444dde
2 changed files with 48 additions and 26 deletions

View File

@@ -38,7 +38,7 @@ export class RoomEventsManager {
receiptsEventsMap: Map<string, Receipt[]>; receiptsEventsMap: Map<string, Receipt[]>;
get canLoadOlder(): boolean { get canLoadOlder(): boolean {
return !!this.endToken; return !!this.endToken && this.events.length > 0;
} }
constructor( constructor(

View File

@@ -55,16 +55,8 @@ export function RoomMessagesList(p: {
messagesEndRef.current?.scrollIntoView({ behavior: "instant" }); messagesEndRef.current?.scrollIntoView({ behavior: "instant" });
}, [lastEventId, messagesEndRef]); }, [lastEventId, messagesEndRef]);
// Watch scroll to detect when user reach the top to load older messages const loadOlderMessages = async () => {
const handleScroll = async () => { if (loadingOlder || !p.manager.canLoadOlder) return;
if (!listContainerRef.current || loadingOlder || !p.manager.canLoadOlder)
return;
const { scrollTop } = listContainerRef.current;
if (scrollTop !== 0) {
return;
}
setLoadingOlder(true); setLoadingOlder(true);
@@ -82,6 +74,19 @@ export function RoomMessagesList(p: {
} }
}; };
// Watch scroll to detect when user reach the top to load older messages
const handleScroll = async () => {
if (!listContainerRef.current) return;
const { scrollTop } = listContainerRef.current;
if (scrollTop !== 0) {
return;
}
loadOlderMessages();
};
return ( return (
<div <div
onScroll={handleScroll} onScroll={handleScroll}
@@ -94,22 +99,8 @@ export function RoomMessagesList(p: {
paddingLeft: "20px", paddingLeft: "20px",
}} }}
> >
{/* Empty conversation notice */}
{p.manager.messages.length === 0 && (
<div
style={{
height: "100%",
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
No message in this conversation yet!
</div>
)}
{/** Begining of conversation */} {/** Begining of conversation */}
{!p.manager.canLoadOlder && ( {!p.manager.canLoadOlder && p.manager.messages.length > 0 && (
<Typography <Typography
component={"div"} component={"div"}
variant="caption" variant="caption"
@@ -119,6 +110,22 @@ export function RoomMessagesList(p: {
</Typography> </Typography>
)} )}
{/** Load older messages button */}
{p.manager.canLoadOlder && !loadingOlder && (
<div
style={{
display: "inline-flex",
justifyContent: "center",
width: "100%",
padding: "20px",
}}
>
<Button onClick={loadOlderMessages} variant="outlined">
Load older messages
</Button>
</div>
)}
{/** Loading older messages spinner */} {/** Loading older messages spinner */}
{loadingOlder && ( {loadingOlder && (
<div <div
@@ -133,6 +140,21 @@ export function RoomMessagesList(p: {
</div> </div>
)} )}
{/* Empty conversation notice */}
{p.manager.messages.length === 0 && (
<div
style={{
height: "100%",
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
No message in this conversation yet!
</div>
)}
{/** Messages themselves */}
{p.manager.messages.map((m, idx) => ( {p.manager.messages.map((m, idx) => (
<RoomMessage <RoomMessage
key={m.event_id} key={m.event_id}