@php $partnerName = $partner->partner_name ?? ($conversation->student_name ?? 'User'); $partnerRole = $partner->partner_role ?? ($conversation->partner_type ?? 'student'); $partnerId = $partner->partner_id ?? ($conversation->partner_id ?? null); $partnerPhoto = $partner->student_photo ?? ($conversation->student_photo ?? null); $teacherName = $teacherInfo->name ?? null; // FIX: Dynamically resolve any non-admin, non-student sender names // from school_staff table. This handles teachers who sent messages // but are not registered in conversation participants. $senderNameMap = []; $otherSenderIds = $messages->where('sender_id', '!=', Auth::id()) ->where('sender_id', '!=', $partnerId) ->pluck('sender_id') ->unique() ->filter() ->values() ->all(); if (!empty($otherSenderIds)) { // ✅ FIX: fetch name + REAL designation (dynamic, never hardcoded) $staffRows = DB::table('school_staff') ->whereIn('id', $otherSenderIds) ->get(); foreach ($staffRows as $row) { $senderNameMap[$row->id] = $row->staff_name; $senderDesignationMap[$row->id] = strtoupper(trim($row->designation ?? '')); } foreach ($otherSenderIds as $sid) { if (!isset($senderNameMap[$sid])) $senderNameMap[$sid] = 'User'; } } @endphp @foreach($messages as $msg) @php $isAdmin = ($msg->sender_id == Auth::id()); if ($isAdmin) { $senderName = 'Admin'; $senderRole = 'admin'; $senderPhoto = null; $senderDesignation = ''; } elseif ($partnerId !== null && $msg->sender_id == $partnerId && $partnerRole == 'student') { // Student chat: sender ID matches student participant $senderName = $partnerName; $senderRole = 'student'; $senderPhoto = $partnerPhoto; $senderDesignation = ''; } elseif (($partnerRole == 'teacher' || $partnerRole == 'staff') && $partnerId !== null && $msg->sender_id == $partnerId) { // Teacher↔Admin chat: sender is the partner teacher himself $senderName = $partnerName; $senderRole = 'teacher'; $senderPhoto = null; $senderDesignation = 'TEACHER'; } elseif (isset($senderNameMap[$msg->sender_id])) { // ✅ FIX: any other staff sender (e.g. PRINCIPAL) resolved dynamically with REAL designation $senderName = $senderNameMap[$msg->sender_id]; $senderDesignation = $senderDesignationMap[$msg->sender_id] ?? 'TEACHER'; $senderRole = ($senderDesignation === 'PRINCIPAL') ? 'principal' : 'teacher'; $senderPhoto = null; } elseif ($teacherName) { // Fallback to pre-fetched teacher name $senderName = $teacherName; $senderRole = 'teacher'; $senderPhoto = null; $senderDesignation = 'TEACHER'; } else { $senderName = 'User'; $senderRole = 'unknown'; $senderPhoto = null; $senderDesignation = ''; } $senderInitial = substr($senderName, 0, 1); $isStudent = ($senderRole == 'student'); $isTeacher = ($senderRole == 'teacher'); $isPrincipalSender = ($senderRole == 'principal'); $roleLabel = $isStudent ? 'Student' : ($isPrincipalSender ? 'Principal' : 'Teacher'); $bubbleClass = $isAdmin ? 'rounded-tr-none bg-indigo-600 text-white shadow-md' : ($isStudent ? 'rounded-tl-none bg-emerald-50 border border-emerald-200 shadow-sm text-slate-700' : 'rounded-tl-none bg-amber-50 border border-amber-200 shadow-sm text-slate-700'); $avatarClass = $isStudent ? 'bg-emerald-100 text-emerald-600 border-emerald-200' : 'bg-amber-100 text-amber-600 border-amber-200'; $roleLabelClass = $isStudent ? 'text-emerald-600' : 'text-amber-600'; $timeClass = $isAdmin ? 'text-indigo-200' : 'text-slate-400'; @endphp
@if(!$isAdmin)
@if($senderPhoto) @else {{ $senderInitial }} @endif
{{ $roleLabel }}
@endif
@if(!$isAdmin)
{{ $senderName }}
@endif
@if(Str::startsWith($msg->message, 'http')) @if(Str::contains($msg->message, ['jpg', 'jpeg', 'png', 'gif', 'webp'])) @else Download Attachment @endif @else {{ $msg->message }} @endif {{ \Carbon\Carbon::parse($msg->created_at)->format('h:i A') }}
@endforeach