pusher ve livewire kullanarak bir mesajlaşma uygulaması yaptım. her şey çok güzel çalışıyorken chat arayüzünü biraz görselleştirince kod hata vermeye başladı. şöyleki; birden fazla kişi bir chat üzerinden konuşma yapabiliyor ve mesajlar anlık herkese düşüyor. chat arayüzünü değiştirmeden önce kodlarım şöyleydi ve gayet düzgün çalışıyordu.
message.blade.php ->livewire blade dosyası
<div>
@foreach($messages as $message)
<div class="msg-group">
<div class="myMsg messages">
<div class="message">
<strong>{{ $message->text }}</strong>
</div>
</div>
</div>
@endforeach
<form wire:submit.prevent="sendMessage" class="send-message-form mt-4">
<div class="input-group">
<input wire:model.defer="message" type="text" class="form-control" placeholder="Yazmaya başlayın.." autofocus>
<div class="input-group-prepend">
<button type="submit" class="input-group-text">
<x-feathericon-send />
</button>
</div>
</div>
</form>
</div>
Bu kod ile de diğer kullanıcılara eventı başarılı bir şekilde dinletip istediğim olayı yaptırabiliyorum.
Echo.private('taskMessage.' + @this.taskID)
.listen('TaskMessageEvent', (e) => {
console.log('dinliyor')
@this.getMessages()
});
Message.php -> livewire dosyası
public function sendMessage()
{
if ($this->message != null) {
$messageData = [
'taskID' => $this->task->id,
'authorID' => auth()->user()->id,
'text' => $this->message,
];
TaskMessage::create($messageData);
$this->reset('message');
event(new TaskMessageEvent($this->task->id));
}
}
public function getMessages()
{
$this->messages = $this->task->messages;
}
public function render()
{
return view('task.livewire.message');
}
buraya kadar her şey çok güzel çalışıyor. fakat ben ben mesajları grupladığımda başlıyor sorun. aşağıya da güncellenmiş hallerini yazıyorum.
public function sendMessage()
{
if ($this->message != null) {
$lastMessage = $this->task->messages->last();
$messageData = [
'taskID' => $this->task->id,
'authorID' => auth()->user()->id,
'text' => $this->message,
];
if (!isset($lastMessage)) {
$messageData['groupID'] = 1;
} elseif($lastMessage->authorID == $this->authID) {
$messageData['groupID'] = $lastMessage->groupID;
} else {
$messageData['groupID'] = $lastMessage->groupID + 1;
}
TaskMessage::create($messageData);
$this->reset('message');
event(new TaskMessageEvent($this->task->id));
}
}
public function getMessages()
{
$this->messages = Task::find($this->taskID)->messages->sortBy('created_at')->groupBy([function ($query) {
return Carbon::parse($query->created_at)->format('Y-m-d');
}, 'groupID']);
}
@foreach($messages as $date => $grouped)
@foreach($grouped as $key=>$values)
@foreach($values->groupBy(function ($item) {return \Carbon\Carbon::make($item->created_at)->format('H:i');}) as $time=>$msgs)
<div class="msg-group">
<div class="{{ $msgs->first()->authorID == $authID ? 'myMsg' : 'otherMsg' }} messages">
@foreach($msgs as $message)
<div class="message {{ $loop->last ? 'last' : '' }}">
<strong>{{ $message->text }}</strong>
</div>
@if($loop->last)
<small>{{ $message->author->name . ' | ' . $message->created_at->format('H:i') }}</small>
@endif
@endforeach
</div>
</div>
@endforeach
@endforeach
@endforeach
sorunun enteresan kısmı tüm kullanıcılarda aynı kod çalışıyor fakat hata sadece mesajı yazan kullanıcıda görünüyor.
Hata Ekranı: https://prnt.sc/1xlt3re
yani aynı fonksiyon mesajı dinleyen kişide collection, mesajı yazan kişide array döndürüyor sanki.