Compare commits
2 Commits
9a93e74c34
...
2fb9766be6
Author | SHA1 | Date | |
---|---|---|---|
2fb9766be6 | |||
4a81376fcc |
@ -3,10 +3,10 @@ import io from "socket.io-client";
|
|||||||
import ScrollableFeed from 'react-scrollable-feed';
|
import ScrollableFeed from 'react-scrollable-feed';
|
||||||
import {escape} from "html-escaper";
|
import {escape} from "html-escaper";
|
||||||
|
|
||||||
|
|
||||||
function Chat({user}) {
|
function Chat({user}) {
|
||||||
|
|
||||||
var [messages, setMessages] = useState([]);
|
var [messages, setMessages] = useState([]);
|
||||||
|
var [users, setUsers] = useState([]);
|
||||||
var [socket, setSocket] = useState();
|
var [socket, setSocket] = useState();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -18,15 +18,12 @@ function Chat({user}) {
|
|||||||
console.debug("message", message);
|
console.debug("message", message);
|
||||||
setMessages(messages => [...messages, message]);
|
setMessages(messages => [...messages, message]);
|
||||||
});
|
});
|
||||||
|
socket.on("users", setUsers);
|
||||||
return () => socket.close();
|
return () => socket.close();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
function sendMessage(content) {
|
function sendMessage(content) {
|
||||||
var message = {
|
var message = {content};
|
||||||
content,
|
|
||||||
author: user.name,
|
|
||||||
color: user.color
|
|
||||||
};
|
|
||||||
socket.emit("message", message);
|
socket.emit("message", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,6 +31,7 @@ function Chat({user}) {
|
|||||||
<div className="Chat h-full flex flex-col">
|
<div className="Chat h-full flex flex-col">
|
||||||
<MessageList messages={messages} />
|
<MessageList messages={messages} />
|
||||||
<ChatInput sendMessage={sendMessage} />
|
<ChatInput sendMessage={sendMessage} />
|
||||||
|
<UserList users={users} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -81,6 +79,13 @@ function ChatInput({sendMessage}) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function UserList({users}) {
|
||||||
|
return <div className="Users fixed top-0 right-5 text-right max-w-xs">
|
||||||
|
<b>{users.length}</b> online: {users.map(user => <span style={{color: user.color}} className="mr-1">{user.name}</span>)}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export default Chat;
|
export default Chat;
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import {useState} from "react";
|
|||||||
export default function InitPage({setUser}) {
|
export default function InitPage({setUser}) {
|
||||||
|
|
||||||
var [name, setName] = useState(null);
|
var [name, setName] = useState(null);
|
||||||
var [color, setColor] = useState(null);
|
var [color, setColor] = useState(random_color());
|
||||||
|
|
||||||
function onSubmit(event) {
|
function onSubmit(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@ -26,4 +26,11 @@ export default function InitPage({setUser}) {
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
function random_color() {
|
||||||
|
var letters = '0123456789ABCDEF'.split('');
|
||||||
|
var color = '#';
|
||||||
|
for (let i = 0; i < 6; i++) color += letters[Math.floor(Math.random() * 16)];
|
||||||
|
return color;
|
||||||
}
|
}
|
@ -18,12 +18,20 @@ dbclient.connect().then(async () => {
|
|||||||
io.on("connection", async socket => {
|
io.on("connection", async socket => {
|
||||||
console.log("connection from", socket.handshake?.address);
|
console.log("connection from", socket.handshake?.address);
|
||||||
socket.once("user", async user => {
|
socket.once("user", async user => {
|
||||||
socket.user = user;
|
user.name = user.name?.trim();
|
||||||
|
if (!user.name) user.name = "no name";
|
||||||
|
socket.data.user = user;
|
||||||
newMessage({color: "#00FF00", content:`${user.name} connected`});
|
newMessage({color: "#00FF00", content:`${user.name} connected`});
|
||||||
|
broadcastUsers();
|
||||||
socket.on("disconnect", () => {
|
socket.on("disconnect", () => {
|
||||||
newMessage({color: "#FF0000", content: `${socket.user.name} disconnected`});
|
newMessage({color: "#FF0000", content: `${socket.data.user.name} disconnected`});
|
||||||
|
broadcastUsers();
|
||||||
});
|
});
|
||||||
socket.on("message", newMessage);
|
socket.on("message", message => newMessage({
|
||||||
|
content: message.content,
|
||||||
|
author: socket.data.user.name,
|
||||||
|
color: socket.data.user.color
|
||||||
|
}));
|
||||||
var history = await col.find().sort({timestamp: -1}).limit(100).toArray();
|
var history = await col.find().sort({timestamp: -1}).limit(100).toArray();
|
||||||
history = history.reverse();
|
history = history.reverse();
|
||||||
socket.emit("messages", history);
|
socket.emit("messages", history);
|
||||||
@ -39,4 +47,9 @@ dbclient.connect().then(async () => {
|
|||||||
io.emit("message", message);
|
io.emit("message", message);
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function broadcastUsers() {
|
||||||
|
var users = await io.fetchSockets().then(sockets => sockets.map(socket => socket.data.user));
|
||||||
|
io.emit("users", users);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user