Skip to content

Commit

Permalink
Added online status to users and typing status on the socket Io
Browse files Browse the repository at this point in the history
  • Loading branch information
Raccoon254 committed May 30, 2024
1 parent 8a81dcc commit b88083d
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 14 deletions.
1 change: 0 additions & 1 deletion app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ public function receivedMessages(): HasMany

public function allMessages(): HasMany
{
// get messages sent and received by the user
return $this->messages()->union($this->receivedMessages());
}

Expand Down
2 changes: 1 addition & 1 deletion resources/views/livewire/profile-image-uploader.blade.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div class="avatar relative">
<div class="w-28 rounded-full border border-{{ $color }} ring-1 ring-offset-blue-500 ring-blue-200 ring-inset ring-offset-[6px]">
<div class="w-28 rounded-full border border-blue-500 ring-1 ring-offset-blue-500 ring-blue-200 ring-inset ring-offset-[6px]">
<img src="{{ $profilePhoto ? $profilePhoto->temporaryUrl() : auth()->user()->profile_photo }}" alt="{{ auth()->user()->name }}" class="w-28 h-28 p-2 rounded-full">
<div class="absolute top-0 left-0 w-28 h-28 rotate-[270deg] rounded-full overflow-visible">
<svg class="w-full h-full">
Expand Down
3 changes: 1 addition & 2 deletions resources/views/livewire/send-message-input.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class="absolute top-0 right-1 -mt-2 -mr-3 bg-amber-500 text-white center rounded
</div>
<div class="relative flex gap-2 items-center">
<label class="w-full">
<input id="messageInput" wire:model.live="newMessage" wire:keydown.enter="sendMessage"
<input id="messageInput" wire:model.live="newMessage"
class="message-input"
autocomplete="off"
type="text" placeholder="Type your message...">
Expand Down Expand Up @@ -70,7 +70,6 @@ class="btn right-3 btn-primary ring-1 ring-offset-2 border rounded-md btn-square
socket.on('receiveMessage', (message) => {
console.log('New message received:', message);
//Emit refresh messages event
Livewire.dispatch('messagesSent');
Livewire.dispatch('received-message');
});
Expand Down
55 changes: 45 additions & 10 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,61 @@ const io = new Server(server, {
}
});

// Store connected users and their socket IDs
const connectedUsers = new Map();

io.on('connection', (socket) => {
console.log('A user connected');

socket.on('userConnected', (user) => {
console.log(user['name'] + ' connected');
//TODO! Set online status
console.log(`${user.name} connected`);
connectedUsers.set(socket.id, user);
// Emit the list of connected users to all clients
io.emit('connectedUsers', Array.from(connectedUsers.values()));
});

socket.on('userDisconnected', (user) => {
console.log(user['name'] + ' disconnected');
//TODO! Set offline status
console.log(`${user.name} disconnected`);
connectedUsers.delete(socket.id);
// Emit the list of connected users to all clients
io.emit('connectedUsers', Array.from(connectedUsers.values()));
});

socket.on('typing', (data) => {
//TODO! Data format must have the current user and the user that is being typed to
//TODO! Set typing status
console.log(data['from'] + ' is typing to ' + data['to']);
const { from, to } = data;
const recipient = Array.from(connectedUsers.values()).find(user => user.id === to);
if (recipient) {
const recipientSocketId = Array.from(connectedUsers.entries()).find(([_, user]) => user.id === to)[0];
io.to(recipientSocketId).emit('typing', from);
}
});

socket.on('stopTyping', (data) => {
const { from, to } = data;
const recipient = Array.from(connectedUsers.values()).find(user => user.id === to);
if (recipient) {
const recipientSocketId = Array.from(connectedUsers.entries()).find(([_, user]) => user.id === to)[0];
io.to(recipientSocketId).emit('stopTyping', from);
}
});

socket.on('sendMessage', (data) => {
const { from, to, message } = data;
const recipient = Array.from(connectedUsers.values()).find(user => user.id === to);
if (recipient) {
const recipientSocketId = Array.from(connectedUsers.entries()).find(([_, user]) => user.id === to)[0];
io.to(recipientSocketId).emit('receiveMessage', { from, message });
}
});

socket.on('sendMessage', (message) => {
console.log(message);
io.emit('receiveMessage', message);
socket.on('disconnect', () => {
console.log('A user disconnected');
const user = connectedUsers.get(socket.id);
if (user) {
connectedUsers.delete(socket.id);
// Emit the list of connected users to all clients
io.emit('connectedUsers', Array.from(connectedUsers.values()));
}
});
});

Expand Down

0 comments on commit b88083d

Please sign in to comment.