106 lines
2.8 KiB
PHP
106 lines
2.8 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\Admin;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use App\Models\SupportTicket;
|
||
|
|
use App\Models\ChatMessage;
|
||
|
|
use App\Events\NewChatMessage;
|
||
|
|
|
||
|
|
class AdminChatController extends Controller
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* Page 1: List all active user chats
|
||
|
|
*/
|
||
|
|
public function index()
|
||
|
|
{
|
||
|
|
$tickets = SupportTicket::with('user')
|
||
|
|
->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
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|