-
Notifications
You must be signed in to change notification settings - Fork 159
Expand file tree
/
Copy pathApp.tsx
More file actions
99 lines (88 loc) · 2.38 KB
/
App.tsx
File metadata and controls
99 lines (88 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { createRivetKit } from "@rivetkit/react";
import { useEffect, useState } from "react";
import type { Message, registry } from "../src/actors";
const { useActor } = createRivetKit<typeof registry>("http://localhost:5173/api/rivet");
export function App() {
const [roomId, setRoomId] = useState("general");
const [username, setUsername] = useState("User");
const [input, setInput] = useState("");
const [messages, setMessages] = useState<Message[]>([]);
const chatRoom = useActor({
name: "chatRoom",
key: [roomId],
});
useEffect(() => {
if (chatRoom.connection) {
chatRoom.connection.getHistory().then(setMessages);
}
}, [chatRoom.connection]);
chatRoom.useEvent("newMessage", (message: Message) => {
setMessages((prev) => [...prev, message]);
});
const sendMessage = async () => {
if (chatRoom.connection && input.trim()) {
await chatRoom.connection.sendMessage(username, input);
setInput("");
}
};
const handleKeyPress = (e: React.KeyboardEvent) => {
if (e.key === "Enter") {
sendMessage();
}
};
return (
<div className="chat-container">
<div className="room-header">
<h3>Chat Room: {roomId}</h3>
</div>
<div className="room-controls">
<label>Room:</label>
<input
type="text"
value={roomId}
onChange={(e) => setRoomId(e.target.value)}
placeholder="Enter room name"
/>
<label>Username:</label>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
placeholder="Enter your username"
/>
</div>
<div className="messages">
{messages.length === 0 ? (
<div className="empty-message">
No messages yet. Start the conversation!
</div>
) : (
messages.map((msg, i) => (
<div key={i} className="message">
<div className="message-sender">{msg.sender}</div>
<div className="message-text">{msg.text}</div>
<div className="message-timestamp">
{new Date(msg.timestamp).toLocaleTimeString()}
</div>
</div>
))
)}
</div>
<div className="input-area">
<input
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={handleKeyPress}
placeholder="Type a message..."
disabled={!chatRoom.connection}
/>
<button
onClick={sendMessage}
disabled={!chatRoom.connection || !input.trim()}
>
Send
</button>
</div>
</div>
);
}