Доброго времени суток!
Нужно выводить онлайн или офлайн пользователь в режиме реального времени
Подскажите, что я делаю не так? В данный момент вижу только когда онлайн я, другой пользователь этого не видит. И когда я разрываю сессию, офлайн работает только после перезагрузки страницы
backend
const users: [];
const SocketServer = (socket: any) => {
const id = socket.handshake.query.user;
if (!users[id]) users[id] = [];
users[id].push(socket.id);
socket.broadcast.emit("online", id);
socket.on("checkUserOnline", (user) => {
if (users[user]) {
socket.emit("online", user);
} else {
socket.emit("offline", user);
}
});
socket.on("disconnect", () => {
socket.broadcast.emit("offline", id);
delete users[id];
});
};
Frontend
'use client'
import { io } from 'socket.io-client'
import { useEffect, useRef, useState } from "react";
import { useUser } from '@/context/userContext';
type CheckOnlineHook = (id: number) => boolean;
const useCheckOnline: CheckOnlineHook = (id) => {
const {user} = useUser()
const ioRef = useRef(null)
const [online, setOnline] = useState(false);
ioRef.current = io(`${process.env.WSS_URL}`, { query: { user: id, }, rejectUnauthorized: false, reconnection: false, upgrade: false, transports: ["websocket"] });
useEffect(() => {
if (ioRef.current) {
ioRef.current.emit("checkUserOnline", id);
}
}, [ioRef.current, id]);
useEffect(() => {
if (ioRef.current) {
ioRef.current.on("online", (user_id) => {
user_id === id && !online && setOnline(true);
});
ioRef.current.on("offline", (user_id) => {
user_id === id && online && setOnline(false);
});
}
}, [ioRef.current, id, online]);
return online;
};
export default useCheckOnline;
export default function Test() {
const {user} = useUser()
const online = useCheckOnline(user?.id);
return (
<div>{online ? 'Da' : 'Net'}</div>
)
}