1+ import { createClient } from "actor-core/client" ;
2+ import { createReactActorCore } from "@actor-core/react" ;
3+ import { useState , useEffect } from "react" ;
4+ import type { App , Message } from "../actors/app" ;
5+
6+ const client = createClient < App > ( "http://localhost:6420" ) ;
7+ const { useActor, useActorEvent } = createReactActorCore ( client ) ;
8+
9+ export default function ChatRoom ( { roomId = "general" } ) {
10+ // Connect to specific chat room using tags
11+ const [ { actor } ] = useActor ( "chatRoom" , {
12+ tags : { roomId }
13+ } ) ;
14+
15+ const [ messages , setMessages ] = useState < Message [ ] > ( [ ] ) ;
16+ const [ input , setInput ] = useState ( "" ) ;
17+
18+ // Load initial state
19+ useEffect ( ( ) => {
20+ if ( actor ) {
21+ // Load chat history
22+ actor . getHistory ( ) . then ( setMessages ) ;
23+ }
24+ } , [ actor ] ) ;
25+
26+ // Listen for real-time updates from the server
27+ useActorEvent ( { actor, event : "newMessage" } , ( message ) => {
28+ setMessages ( prev => [ ...prev , message as Message ] ) ;
29+ } ) ;
30+
31+ const sendMessage = ( ) => {
32+ if ( actor && input . trim ( ) ) {
33+ actor . sendMessage ( "User" , input ) ;
34+ setInput ( "" ) ;
35+ }
36+ } ;
37+
38+ return (
39+ < div className = "chat-container" >
40+ < div className = "room-header" >
41+ < h3 > Chat Room: { roomId } </ h3 >
42+ </ div >
43+
44+ < div className = "messages" >
45+ { messages . length === 0 ? (
46+ < div className = "empty-message" > No messages yet. Start the conversation!</ div >
47+ ) : (
48+ messages . map ( ( msg , i ) => (
49+ < div key = { i } className = "message" >
50+ < b > { msg . sender } :</ b > { msg . text }
51+ < span className = "timestamp" >
52+ { new Date ( msg . timestamp ) . toLocaleTimeString ( ) }
53+ </ span >
54+ </ div >
55+ ) )
56+ ) }
57+ </ div >
58+
59+ < div className = "input-area" >
60+ < input
61+ value = { input }
62+ onChange = { e => setInput ( e . target . value ) }
63+ onKeyDown = { e => e . key === "Enter" && sendMessage ( ) }
64+ placeholder = "Type a message..."
65+ />
66+ < button onClick = { sendMessage } > Send</ button >
67+ </ div >
68+ </ div >
69+ ) ;
70+ }
0 commit comments