53 lines
1.4 KiB
TypeScript
Raw Normal View History

import { useEffect, useRef } from "react";
2022-06-17 10:48:15 +10:00
import { Message } from "./Message";
2023-08-03 13:23:17 +05:30
import type { ChatListProps } from "./types";
2022-06-17 10:48:15 +10:00
2023-08-03 13:23:17 +05:30
export default function ChatList(props: ChatListProps) {
const renderedMessages = props.messages.array.map((message) => (
<div
2022-06-17 10:48:15 +10:00
key={
2022-09-02 14:14:28 +10:00
message.nick +
message.payloadAsUtf8 +
message.timestamp.valueOf() +
message.sentTimestamp?.valueOf()
2022-06-17 10:48:15 +10:00
}
className="flex flex-col p-2 border-b border-gray-200"
2022-06-17 10:48:15 +10:00
>
<span className="text-sm text-gray-500">{message.nick}</span>
<span className="text-sm text-gray-500">
{formatDisplayDate(message)}
</span>
<p className="text-gray-700">{message.payloadAsUtf8}</p>
</div>
2022-06-17 10:48:15 +10:00
));
return (
<div className="overflow-y-auto h-full">
2022-06-17 10:48:15 +10:00
{renderedMessages}
<AlwaysScrollToBottom messages={props.messages.array} />
</div>
2022-06-17 10:48:15 +10:00
);
}
function formatDisplayDate(message: Message): string {
return message.timestamp.toLocaleString([], {
month: "short",
day: "numeric",
hour: "numeric",
minute: "2-digit",
hour12: false,
});
}
const AlwaysScrollToBottom = (props: { messages: Message[] }) => {
const elementRef = useRef<HTMLDivElement>(null);
2022-06-17 10:48:15 +10:00
useEffect(() => {
if (elementRef.current) {
elementRef.current.scrollIntoView();
}
2022-06-17 10:48:15 +10:00
}, [props.messages]);
return <div ref={elementRef} />;
};