1ba4ca893a
三個根本原因: 1. updateEchoToken() 呼叫 disconnect/connect 會中斷已訂閱的 presence channel,改為只更新 auth header(不重連)。 同時將 setAuth() 的呼叫順序改為先 updateEchoToken() 再 startRealtime(),確保訂閱時使用最新 token。 2. BookingPresenceChannel::join() 未對 schedule null 做防守, 載入後若 schedule 不存在會 500,導致 auth 靜默失敗。 3. WebSocket 重連後 presence channel 不會自動恢復, 在 BookingChat 加入 reconnected 事件處理,重連後重訂閱。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
34 lines
794 B
PHP
34 lines
794 B
PHP
<?php
|
|
|
|
namespace App\Broadcasting;
|
|
|
|
use App\Models\Booking;
|
|
use App\Models\User;
|
|
|
|
class BookingPresenceChannel
|
|
{
|
|
public function join(User $user, Booking $booking): array|false
|
|
{
|
|
if ($booking->status->value !== 'confirmed') {
|
|
return false;
|
|
}
|
|
|
|
$booking->loadMissing('schedule');
|
|
|
|
$isMember = $user->role === 'member' && $booking->member_id === $user->id;
|
|
$isProvider = $user->role === 'provider'
|
|
&& $booking->schedule !== null
|
|
&& $booking->schedule->provider_id === $user->id;
|
|
|
|
if (!$isMember && !$isProvider) {
|
|
return false;
|
|
}
|
|
|
|
return [
|
|
'user_id' => $user->id,
|
|
'user_type' => $user->role,
|
|
'name' => $user->name,
|
|
];
|
|
}
|
|
}
|