Docs
Realtime Chat
Realtime Chat
Real-time chat component for collaborative applications
Installation
Folder structure
1import { cn } from '@/lib/utils' 2import type { ChatMessage } from '@/hooks/use-realtime-chat' 3 4interface ChatMessageItemProps { 5 message: ChatMessage 6 isOwnMessage: boolean 7 showHeader: boolean 8} 9 10export const ChatMessageItem = ({ message, isOwnMessage, showHeader }: ChatMessageItemProps) => { 11 return ( 12 <div className={`flex mt-2 ${isOwnMessage ? 'justify-end' : 'justify-start'}`}> 13 <div 14 className={cn('max-w-[75%] w-fit flex flex-col gap-1', { 15 'items-end': isOwnMessage, 16 })} 17 > 18 {showHeader && ( 19 <div 20 className={cn('flex items-center gap-2 text-xs px-3', { 21 'justify-end flex-row-reverse': isOwnMessage, 22 })} 23 > 24 <span className={'font-medium'}>{message.user.name}</span> 25 <span className="text-foreground/50 text-xs"> 26 {new Date(message.createdAt).toLocaleTimeString('en-US', { 27 hour: '2-digit', 28 minute: '2-digit', 29 hour12: true, 30 })} 31 </span> 32 </div> 33 )} 34 <div 35 className={cn( 36 'py-2 px-3 rounded-xl text-sm w-fit', 37 isOwnMessage ? 'bg-primary text-primary-foreground' : 'bg-muted text-foreground' 38 )} 39 > 40 {message.content} 41 </div> 42 </div> 43 </div> 44 ) 45}
Introduction
The Realtime Chat component provides a complete chat interface that enables users to exchange messages in real-time within a shared room.
Usage
Basic usage
import { RealtimeChat } from '@/components/realtime-chat' export default function ChatPage() { return <RealtimeChat roomName="my-chat-room" username="john_doe" /> }
With initial messages
import { RealtimeChat } from '@/components/realtime-chat' import { useMessagesQuery } from '@/hooks/use-messages-query' export default function ChatPage() { const { data: messages } = useMessagesQuery() return <RealtimeChat roomName="my-chat-room" username="john_doe" messages={messages} /> }
Storing messages
import { RealtimeChat } from '@/components/realtime-chat' import { useMessagesQuery } from '@/hooks/use-messages-query' import { storeMessages } from '@/lib/store-messages' export default function ChatPage() { const { data: messages } = useMessagesQuery() const handleMessage = (messages: ChatMessage[]) => { // Store messages in your database await storeMessages(messages) } return <RealtimeChat roomName="my-chat-room" username="john_doe" onMessage={handleMessage} /> }
Features
- Real-time message synchronization
- Message persistence support with
onMessage
andmessages
props - Customizable message appearance
- Automatic scroll-to-bottom on new messages
- Room-based isolation for scoped conversations
- Low-latency updates using Supabase Realtime
Props
Prop | Type | Description |
---|---|---|
roomName | string | Unique identifier for the shared chat room. |
username | string | Name of the current user; used to identify message senders. |
onMessage? | (messages: ChatMessage[]) => void | Optional callback to handle messages, useful for persistence. |
messages? | ChatMessage[] | Optional initial messages to display in the chat. |
ChatMessage type
interface ChatMessage { id: string content: string user: { name: string } createdAt: string }