diff --git a/app/Events/UserStoppedTyping.php b/app/Events/UserStoppedTyping.php new file mode 100644 index 00000000..b1728f90 --- /dev/null +++ b/app/Events/UserStoppedTyping.php @@ -0,0 +1,28 @@ +conversationId = $conversationId; + $this->user = $user; + } + + public function broadcastOn() + { + return new PrivateChannel('chat.' . $this->conversationId); + } + + public function broadcastAs() + { + return 'UserStoppedTyping'; + } +} diff --git a/app/Events/UserTyping.php b/app/Events/UserTyping.php new file mode 100644 index 00000000..8cde18f6 --- /dev/null +++ b/app/Events/UserTyping.php @@ -0,0 +1,28 @@ +conversationId = $conversationId; + $this->user = $user; + } + + public function broadcastOn() + { + return new PrivateChannel('chat.' . $this->conversationId); + } + + public function broadcastAs() + { + return 'UserTyping'; + } +} diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index 578812f0..5025a63f 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -13,17 +13,26 @@ class ChatController extends Controller public function send(Request $request) { + $request->validate([ + 'conversation_id' => 'required|exists:conversations,id', + 'message' => 'required|string' + ]); + $message = Message::create([ 'conversation_id' => $request->conversation_id, 'user_id' => auth()->id(), 'message' => $request->message ]); + // cargar usuario para que venga en el JSON $message->load('user'); + // enviar a los demás usuarios por websocket broadcast(new ChatMessageSent($message))->toOthers(); - return response()->json($message); + return response()->json([ + 'message' => $message + ]); } public function start(User $user) @@ -53,14 +62,14 @@ class ChatController extends Controller } public function show($id) -{ - $conversation = Conversation::with([ - 'messages' => function ($query) { - $query->orderBy('created_at', 'asc'); - }, - 'messages.user' - ])->findOrFail($id); + { + $conversation = Conversation::with([ + 'messages' => function ($query) { + $query->orderBy('created_at', 'asc'); + }, + 'messages.user' + ])->findOrFail($id); - return view('chat.show', compact('conversation')); -} + return view('chat.show', compact('conversation')); + } } diff --git a/public/assets/css/style.css b/public/assets/css/style.css index af16332e..18cf8834 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -316,3 +316,20 @@ button:hover { color: white; } +.typing-indicator::after { + content: "..."; + animation: dots 1.5s infinite; +} + +@keyframes dots { + 0% {content: ".";} + 33% {content: "..";} + 66% {content: "...";} +} + +#typingIndicator{ + font-size:12px; + color:#6c757d; + min-height:18px; + padding-left:5px; +} diff --git a/resources/views/chat/show.blade.php b/resources/views/chat/show.blade.php index bd405a00..ba4a9ed7 100644 --- a/resources/views/chat/show.blade.php +++ b/resources/views/chat/show.blade.php @@ -19,22 +19,25 @@