withCount([ 'messages as unread_count' => function ($q) { $q->where('sender_type', \App\Models\User::class) ->where('read_by_admin', false); } ]) ->orderBy('updated_at', 'desc') ->get(); return view('admin.chat_support', compact('tickets')); } /** * Page 2: Open chat window for a specific user */ public function openChat($ticketId) { $ticket = SupportTicket::with('user')->findOrFail($ticketId); // ✅ MARK USER MESSAGES AS READ FOR ADMIN ChatMessage::where('ticket_id', $ticketId) ->where('sender_type', \App\Models\User::class) ->where('read_by_admin', false) ->update(['read_by_admin' => true]); $messages = ChatMessage::where('ticket_id', $ticketId) ->orderBy('created_at', 'asc') ->with('sender') ->get(); return view('admin.chat_window', compact('ticket', 'messages')); } /** * Admin sends a message to the user */ public function sendMessage(Request $request, $ticketId) { $request->validate([ 'message' => 'nullable|string', 'file' => 'nullable|file|max:20480', // 20 MB ]); $ticket = SupportTicket::findOrFail($ticketId); $admin = auth('admin')->user(); $data = [ 'ticket_id' => $ticketId, 'sender_id' => $admin->id, 'sender_type' => \App\Models\Admin::class, 'message' => $request->message, 'read_by_admin' => true, 'read_by_user' => false, ]; // File Upload if ($request->hasFile('file')) { $path = $request->file('file')->store('chat', 'public'); $data['file_path'] = $path; $data['file_type'] = $request->file('file')->getMimeType(); } // Save message $message = ChatMessage::create($data); $message->load('sender'); \Log::info("DEBUG: ChatController sendMessage called", [ 'ticket_id' => $ticketId, 'payload' => $request->all() ]); // Broadcast real-time broadcast(new NewChatMessage($message)); \Log::info("DEBUG: ChatController sendMessage called 79", [ 'ticket_id' => $ticketId, 'payload' => $request->all() ]); return response()->json([ 'success' => true, 'message' => $message ]); } }