js-waku/examples/web-chat/src/ChatList.tsx
Franck Royer d307342f7e
Simplify message handling to avoid re-rendering
Only retrieve historical messages when starting the app.

This allows avoid re-rendering issues. This is an example dApp. No need
to waste time on React optimisation.
2021-07-29 17:23:03 +10:00

62 lines
1.4 KiB
TypeScript

import { memo, useEffect, useRef } from 'react';
import {
Message as LiveMessage,
MessageText,
MessageList,
} 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()
: '' +
message.timestamp.valueOf() +
message.nick +
message.payloadAsUtf8
}
authorName={message.nick}
date={formatDisplayDate(message)}
>
<MessageText>{message.payloadAsUtf8}</MessageText>
</LiveMessage>
));
return (
<MessageList active containScrollInSubtree>
{renderedMessages}
<AlwaysScrollToBottom messages={props.messages} />
</MessageList>
);
}
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>();
useEffect(() => {
// @ts-ignore
elementRef.current.scrollIntoView();
}, [props.messages]);
// @ts-ignore
return <div ref={elementRef} />;
};