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:
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.
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.
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.
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 ✓.