A library for rendering chats with virtualization.
- Virtualization of messages by virtua library.
- Ability to build complex logic for scrolling to new/old messages.
- Tracking seen/unseen messages.
- Tracking messages in viewport.
- Scrolling to items by ids/indexes, offset, etc.
- Displaying suffixes and prefixes (i.e. history loaders, typing indicators).
- Items can be animated.
- Items can be stateful. You can keep them in the DOM thus preserving their state.
Install with your favorite package manager like npm
, yarn
or pnpm
:
npm install chat-viewer
Read documentation or play with this library in our Demo or CodeSandbox playground:
Long story short, here is a dead simple example of how to user this library:
import React from 'react';
import {ChatViewer, ChatViewerHandle, followMessagesBy} from 'chat-viewer';
interface Message {
id: string; // Note: id is a required property for a message object
role: 'user' | 'assistant';
content: string;
}
function Message(props: Message) {
return (
<div key={props.id}>
<strong>{props.role}</strong>
<p>{props.content}</p>
</div>
);
}
interface ChatProps {
messages: Message[];
}
function Chat({ messages }: ChatProps) {
const chatRef = useRef<ChatViewerHandle<Message>>(null);
const loadHistory = useCallback(() => {
// loading history logic
}, [/* .. */])
return (
<div style={{ width: '100%', height: '100%' }}>
<ChatViewer<Message>
ref={chatRef}
messages={messages}
renderMessage={
(message) => <Message {...message} />
}
onNewerMessages={
// This will scroll to new messages when you are at the bottom of the chat
// and incoming message is written by 'assistant' role
followMessagesBy((message) => message.role === 'assistant')
}
// When 100 offset from the top of the chat is reached, then loadHistory is triggered
historyEndOffset={100}
onHistoryEndReached={loadHistory}
/>
</div>
)
}
Please read our docs for the API here:
MIT © Wix.com