@Golopolos

Проверка пользователя online/offline socket.io?

Доброго времени суток!
Нужно выводить онлайн или офлайн пользователь в режиме реального времени
Подскажите, что я делаю не так? В данный момент вижу только когда онлайн я, другой пользователь этого не видит. И когда я разрываю сессию, офлайн работает только после перезагрузки страницы

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>
  )
}
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
Eugene-Usachev
@Eugene-Usachev
Во-первых, эта система не масштабируется. Надо сохранять подписки для каждого пользователя, чтобы не отсылать всем пользователям событие онлайна каждого пользователя. Во-вторых, вы пишите только тому, кто открыл соединение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы