58 lines
1.3 KiB
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(),
|
|
]);
|
|
}
|
|
}
|