62 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-02-04 14:12:00 +11:00
import { memo, useEffect, useRef } from "react";
import {
Message as LiveMessage,
MessageText,
MessageList,
2022-02-04 14:12:00 +11:00
} from "@livechat/ui-kit";
import { Message } from "./Message";
interface Props {
messages: Message[];
}
memo(ChatList);
export default function ChatList(props: Props) {
const renderedMessages = props.messages.map((message) => (
<LiveMessage
key={
message.sentTimestamp
? message.sentTimestamp.valueOf()
2022-02-04 14:12:00 +11:00
: "" +
message.timestamp.valueOf() +
message.nick +
message.payloadAsUtf8
}
authorName={message.nick}
date={formatDisplayDate(message)}
>
<MessageText>{message.payloadAsUtf8}</MessageText>
</LiveMessage>
2021-05-17 16:19:50 +10:00
));
2021-04-27 14:55:30 +10:00
return (
<MessageList active containScrollInSubtree>
{renderedMessages}
<AlwaysScrollToBottom messages={props.messages} />
</MessageList>
2021-04-27 14:55:30 +10:00
);
}
function formatDisplayDate(message: Message): string {
return message.timestamp.toLocaleString([], {
2022-02-04 14:12:00 +11:00
month: "short",
day: "numeric",
hour: "numeric",
minute: "2-digit",
hour12: false,
});
}
2021-04-27 14:55:30 +10:00
const AlwaysScrollToBottom = (props: { messages: Message[] }) => {
2021-04-27 14:55:30 +10:00
const elementRef = useRef<HTMLDivElement>();
useEffect(() => {
// @ts-ignore
elementRef.current.scrollIntoView();
}, [props.messages]);
2021-04-27 14:55:30 +10:00
// @ts-ignore
return <div ref={elementRef} />;
};