This commit is contained in:
Lamp 2023-11-22 05:36:06 +00:00
parent 1e79ea9e91
commit 61420ddd4e
2 changed files with 26 additions and 18 deletions
app/src
server

@ -50,12 +50,24 @@ function Chat({user, updateUser, theme, setTheme}) {
useEffect(() => { useEffect(() => {
document.getElementById("favicon").href = SERVER_BASE_URL+`/favicon.svg?num=${unread}`; document.getElementById("favicon").href = SERVER_BASE_URL+`/favicon.svg?num=${unread}`;
}, [unread]); }, [unread]);
useEffect(() => { useEffect(() => {
document.addEventListener("visibilitychange", () => { var fn = () => {
if (document.visibilityState === "visible") setUnread(0); if (document.visibilityState === "visible") setUnread(0);
}); };
document.addEventListener("visibilitychange", fn);
return () => document.removeEventListener("visibilitychange", fn);
}, []); }, []);
var loadMessages = useCallback(function loadMessages() {
fetch(SERVER_BASE_URL+"/messages?secret="+user.secret).then(res => res.json()).then(messages => {
console.debug("messages", messages);
setMessages(messages);
});
}, [setMessages, user.secret]);
useEffect(loadMessages, []);
useEffect(() => { useEffect(() => {
var socket = io(SERVER_BASE_URL, { var socket = io(SERVER_BASE_URL, {
transports: ["websocket", "polling"] transports: ["websocket", "polling"]
@ -65,15 +77,16 @@ function Chat({user, updateUser, theme, setTheme}) {
socket.on("connect", () => { socket.on("connect", () => {
console.debug("socket connect, id: " + socket.id); console.debug("socket connect, id: " + socket.id);
socket.emit("user", user); socket.emit("user", user);
loadMessages();
}); });
socket.on("disconnect", () => console.debug("socket disconnect")); socket.on("disconnect", () => console.debug("socket disconnect"));
{let emit = socket.emit; socket.emit = function() { /*{let emit = socket.emit; socket.emit = function() {
emit.apply(socket, arguments); emit.apply(socket, arguments);
console.debug("send", ...arguments); console.debug("send", ...arguments);
}} }}
socket.onAny((eventName, ...args) => { socket.onAny((eventName, ...args) => {
console.debug("receive", eventName, ...args) console.debug("receive", eventName, ...args)
}); });*/
socket.on("message", message => { socket.on("message", message => {
setMessages(messages => [...messages, message]); setMessages(messages => [...messages, message]);
if (document.visibilityState === "hidden") setUnread(unread => ++unread); if (document.visibilityState === "hidden") setUnread(unread => ++unread);
@ -86,11 +99,12 @@ function Chat({user, updateUser, theme, setTheme}) {
setMice(mice => ({...mice, [socketid]: {x, y}})); setMice(mice => ({...mice, [socketid]: {x, y}}));
}); });
return () => socket.close(); return () => socket.close();
// eslint-disable-next-line react-hooks/exhaustive-deps }, []); // eslint-disable-line react-hooks/exhaustive-deps
}, []);
useEffect(() => { useEffect(() => {
socket?.emit("user", user); socket?.emit("user", user);
}, [socket, user]); }, [socket, user]);
useEffect(() => { useEffect(() => {
var socketids = users.map(user => user.socketid); var socketids = users.map(user => user.socketid);
setMice(mice => { setMice(mice => {
@ -98,14 +112,9 @@ function Chat({user, updateUser, theme, setTheme}) {
return mice; return mice;
}); });
}, [users]); }, [users]);
useEffect(() => {
fetch(SERVER_BASE_URL+"/messages?secret="+user.secret).then(res => res.json()).then(messages => {
console.debug("messages", messages);
setMessages(messages);
});
}, [setMessages, user.secret]);
var sendMessage = useCallback(message => socket.emit("message", message), [socket]); var sendMessage = useCallback(message => socket.emit("message", message), [socket]);
return ( return (
<div className="Chat flex flex-col"> <div className="Chat flex flex-col">

@ -50,13 +50,12 @@ app.get("/messages", (req, res, next) => {
if (afterDate) query.timestamp.$gt = afterDate; if (afterDate) query.timestamp.$gt = afterDate;
} }
messages.find(query || {}).project({"file.data": 0, "user.ip": 0, "user.secret": 0}).sort({timestamp: -1}).limit(100).toArray().then(messages => { messages.find(query || {}).project({"file.data": 0, "user.ip": 0}).sort({timestamp: -1}).limit(100).toArray().then(messages => {
if (req.query.secret) { for (let message of messages) {
for (let message of messages) { if (req.query.secret && message.user && message.user.secret === req.query.secret) {
if (message.user && message.user.secret === req.query.secret) { message.user.you = true;
message.user.you = true;
}
} }
delete message.user?.secret;
} }
res.send(messages.reverse()); res.send(messages.reverse());
}).catch(e => next(e)); }).catch(e => next(e));