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