fox/app/Livewire/Chat.php

58 lines
1.3 KiB
PHP

<?php
namespace App\Livewire;
use App\Jobs\HandleUserMessage;
use App\Models\Message;
use App\Services\FoxAgent;
use Livewire\Attributes\On;
use Livewire\Attributes\Title;
use Livewire\Component;
#[Title('Fox')]
class Chat extends Component
{
public string $draft = '';
public bool $foxIsThinking = false;
public function send(): void
{
$content = trim($this->draft);
if ($content === '') {
return;
}
$this->draft = '';
$this->foxIsThinking = true;
// User-Nachricht synchron persistieren + broadcasten,
// dann Verarbeitung an Queue weiterreichen.
$userMessage = app(FoxAgent::class)->recordUserMessage($content);
HandleUserMessage::dispatch($userMessage);
$this->dispatch('message-sent');
}
#[On('echo:fox,.message.created')]
public function onBroadcastedMessage(): void
{
// Antwort kam via Reverb-WebSocket - "denkt..." ausblenden.
$this->foxIsThinking = false;
}
#[On('voice-transcribed')]
public function onVoiceTranscribed(string $text): void
{
$this->draft = $text;
$this->send();
}
public function render()
{
return view('livewire.chat', [
'messages' => Message::latest()->limit(80)->get()->reverse()->values(),
]);
}
}