diff --git a/app/Livewire/Messages.php b/app/Livewire/Messages.php index 0add638..f98d9db 100644 --- a/app/Livewire/Messages.php +++ b/app/Livewire/Messages.php @@ -4,6 +4,7 @@ use App\Models\User; use Illuminate\View\View; +use Livewire\Attributes\On; use Livewire\Component; use Livewire\WithFileUploads; @@ -11,12 +12,12 @@ class Messages extends Component { use WithFileUploads; - public $loggedInUser; - public $currentUserRole; - public $search = ''; - public $selectedUser; - public $message; + public mixed $loggedInUser; + public string $currentUserRole; + public string $search = ''; + public User $selectedUser; public $messages; + public int $unreadMessages; public array $attachments = []; public function mount(): void @@ -29,28 +30,25 @@ public function mount(): void } } + #[On('messagesSent')] + public function messagesSent(): void + { + $this->messages = $this->loggedInUser->messages()->where('receiver_id', $this->selectedUser->id)->orWhere('sender_id', $this->selectedUser->id)->orderBy('created_at', 'asc')->get(); + } + public function openChat($id): void { $this->selectedUser = User::find($id); $this->messages = $this->loggedInUser->messages()->where('receiver_id', $id)->orWhere('sender_id', $id)->orderBy('created_at', 'asc')->get(); $this->dispatch('chatOpened'); + $this->messages->where('receiver_id', $this->loggedInUser->id)->whereNull('read_at')->each->update(['read_at' => now()]); } - //sendMessage - public function sendMessage(): void + public function unreadMessages(User $user): int { - if (empty($this->message)) { - return; - } - - $this->loggedInUser->messages()->create([ - 'receiver_id' => $this->selectedUser->id, - 'content' => $this->message - ]); - - $this->message = ''; - $this->messages = $this->loggedInUser->messages()->where('receiver_id', $this->selectedUser->id)->orWhere('sender_id', $this->selectedUser->id)->sortBy('created_at', 'asc')->get(); + //Get the number of unread messages for the authenticated user from the selected user + return $this->loggedInUser->receivedMessages()->where('sender_id', $user->id)->whereNull('read_at')->count(); } public function render(): View diff --git a/app/Livewire/SendMessageInput.php b/app/Livewire/SendMessageInput.php index a94c9f8..dab3329 100644 --- a/app/Livewire/SendMessageInput.php +++ b/app/Livewire/SendMessageInput.php @@ -36,6 +36,7 @@ public function removeAttachment($name): void public function sendMessage(): void { + sleep(4); if (empty($this->newMessage) && empty($this->attachments)) { return; } @@ -62,6 +63,8 @@ public function sendMessage(): void $this->attachments = []; $this->newMessage = ''; + $this->reset('attachments', 'newMessage'); + $this->dispatch('messagesSent'); } diff --git a/app/Models/Message.php b/app/Models/Message.php index 9aabcd5..4fd6f26 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -20,6 +20,11 @@ class Message extends Model protected array $dates = ['read_at', 'created_at', 'updated_at']; + public function getTimeAttribute(): string + { + return $this->created_at->diffForHumans(); + } + public function sender(): BelongsTo { return $this->belongsTo(User::class, 'sender_id'); diff --git a/app/Models/User.php b/app/Models/User.php index e734646..18e0a49 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -34,9 +34,25 @@ public function messages(): HasMany return $this->hasMany(Message::class, 'sender_id'); } - public function getLastMessageAttribute(): ?Message + public function receivedMessages(): HasMany { - return $this->messages()->orderBy('created_at', 'desc')->first(); + return $this->hasMany(Message::class, 'receiver_id'); + } + + public function allMessages(): HasMany + { + // get messages sent and received by the user + return $this->messages()->union($this->receivedMessages()); + } + + public function getLastMessageAttribute(): Message|HasMany|null + { + return $this->allMessages()->orderBy('created_at', 'desc')->first(); + } + + public function getHasUnreadMessagesAttribute(): bool + { + return $this->receivedMessages()->whereNull('read_at')->exists(); } public function referrals(): HasMany diff --git a/resources/css/app.css b/resources/css/app.css index 91b7ae8..289e03f 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -40,6 +40,10 @@ input:-webkit-autofill { @apply absolute top-1 right-1 h-[6px] w-[6px] bg-blue-500 text-white text-[9px] font-bold rounded-full flex items-center justify-center ring ring-white; } +.custom-message-badge{ + @apply absolute bottom-1 right-0 h-[15px] w-[15px] bg-amber-500 text-white text-[9px] font-bold rounded-full flex items-center justify-center ring ring-white; +} + .sent-message{ @apply rounded-t-2xl rounded-bl-2xl bg-blue-500 text-white p-1 px-4; } diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 584f1ae..651f121 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -35,8 +35,9 @@
+@script + +@endscript diff --git a/resources/views/messages.blade.php b/resources/views/messages.blade.php index daa19a8..39ef017 100644 --- a/resources/views/messages.blade.php +++ b/resources/views/messages.blade.php @@ -9,7 +9,7 @@- {{ $user->lastMessage ? $user->lastMessage->content : 'No message yet' }} + {{ $user->lastMessage ? substr($user->lastMessage->content, 0, 20)." ..." : 'No message yet' }}