1
resposta

Como permitir que a mesma pessoa abra o mesmo documento em mais de uma aba?

Como permitir que a mesma pessoa abra o mesmo documento em mais de uma aba? O professor quer impedir isso, mas no docs eu consigo abrir o mesmo documento em quantas abas eu quiser. Como fazer isso com o socket? O problema é que se a mesma pessoa entra no mesmo documento em mais de uma aba vai aparecer o nome dele mais de uma vez em pessoas conectadas naquele documento. Como resolver isso?

1 resposta

Olá Luidi! Como vai?

É um desafio interessante permitir que a mesma pessoa abra o mesmo documento em mais de uma aba sem duplicar o nome na lista de usuários conectados.

O que você pode fazer é modificar a lógica de conexão para permitir múltiplas conexões do mesmo usuário, mas ainda assim manter uma única entrada na lista de usuários conectados.

Aqui está uma abordagem que você pode considerar:

  1. Identificação Única do Usuário: ao invés de usar apenas o nome do usuário para identificar as conexões, você pode criar um identificador único para cada sessão de usuário. Isso pode ser feito utilizando o socket.id, que é único para cada conexão.

  2. Gerenciamento de Sessões: no backend, ao invés de adicionar o usuário diretamente à lista de usuários conectados, você pode criar uma estrutura que armazena as sessões por usuário. Por exemplo, um objeto onde a chave é o nome do usuário e o valor é uma lista de socket.id que representam as conexões abertas por esse usuário.

  3. Atualização da Lista de Usuários: ao atualizar a lista de usuários conectados, você pode simplesmente usar as chaves do objeto acima, garantindo que cada usuário apareça apenas uma vez, independentemente de quantas abas ele tenha aberto.

  4. Desconexão: ao desconectar, você remove o socket.id da lista de sessões do usuário. Se a lista de sessões desse usuário estiver vazia após a remoção, então você remove o usuário da lista de usuários conectados.

Aqui está um exemplo simplificado de como você poderia implementar isso:

const sessoesUsuarios = {};

function registrarEventosDocumento(socket, io) {
  socket.on("selecionar_documento", ({ nomeDocumento, nomeUsuario }, devolverTexto) => {
    if (!sessoesUsuarios[nomeUsuario]) {
      sessoesUsuarios[nomeUsuario] = [];
    }
    sessoesUsuarios[nomeUsuario].push(socket.id);

    socket.join(nomeDocumento);

    const usuariosConectados = Object.keys(sessoesUsuarios);
    io.to(nomeDocumento).emit("usuarios_no_documento", usuariosConectados);

    // Lógica para devolver o texto do documento
    devolverTexto("Texto do documento aqui");

    socket.on("disconnect", () => {
      const index = sessoesUsuarios[nomeUsuario].indexOf(socket.id);
      if (index !== -1) {
        sessoesUsuarios[nomeUsuario].splice(index, 1);
      }
      if (sessoesUsuarios[nomeUsuario].length === 0) {
        delete sessoesUsuarios[nomeUsuario];
      }

      const usuariosConectados = Object.keys(sessoesUsuarios);
      io.to(nomeDocumento).emit("usuarios_no_documento", usuariosConectados);
    });
  });
}

Espero que essa abordagem ajude!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.