taskKey = $taskKey; // } // // public function load() // { // $task = Cache::store('redis')->get($this->taskKey); // if (!$task) return; // // $status = $task['status'] ?? null; // // // nur wenn sich der Status geändert hat → neues Toast // if ($status !== $this->lastStatus) { // $this->lastStatus = $status; // // $this->dispatch('notify', [ // 'id' => $this->taskKey, // 'title' => strtoupper($task['type']).' · '.$task['payload']['domain'], // 'text' => $task['message'] ?? '', // 'type' => match($status) { // 'done' => 'success', // 'failed' => 'error', // 'running'=> 'info', // default => 'info', // }, // 'duration' => in_array($status, ['done','failed']) ? 6000 : 0, // 'close' => true, // ]); // } // } // public function render() // { // return <<<'BLADE' //
// BLADE; // } // public ?string $taskKey = null; // wird über Prop ODER Query ?task=… gesetzt // public ?array $task = null; // public ?string $last = null; // letzter Status, um doppelte Events zu vermeiden // public bool $final = false; // done/failed => Poll stoppen (Frontend kann darauf reagieren) // // public function mount(?string $taskKey = null): void // { // // TaskKey aus Prop oder aus URL-Query (?task=issue-cert:domain) // $this->taskKey = $taskKey ?: request('task'); // } // // public function load(): void // { // if (!$this->taskKey) return; // // $this->task = Cache::store('redis')->get($this->taskKey); // if (!$this->task) return; // // $status = $this->task['status'] ?? 'queued'; // if ($status !== $this->last) { // $this->last = $status; // //// $status = $this->task['status'] ?? 'queued'; // queued|running|done|failed // // $this->dispatch('notify', [ // 'id' => $this->taskKey, // gleiche ID => Toast wird ersetzt // 'state' => $status, // 'queued' | 'running' | 'done' | 'failed' // 'badge' => strtoupper($this->task['type'] ?? 'task'),// z.B. CERTBOT // 'domain' => $this->task['payload']['domain'] ?? '', // erscheint rechts neben Badge // 'message' => $this->task['message'] ?? '', // Text unten // 'position' => 'bottom-center', // optional: top-right|… (Standard: bottom-right) // 'duration' => in_array($status, ['done','failed']) ? 6000 : 0, // 0 = offen lassen // 'close' => true, // X-Button anzeigen // ]); // } // // if (in_array($status, ['done','failed'])) { // $this->final = true; // } // } // // public function render() // { // return view('livewire.system.task-toast'); // } // public ?string $taskKey = null; // public ?array $task = null; // public ?string $last = null; // letzter gesehener Status // // public function mount(?string $taskKey = null): void // { // $this->taskKey = $taskKey ?: request('task'); // } // // public function load(): void // { // if (!$this->taskKey) return; // // $this->task = Cache::store('redis')->get($this->taskKey); // if (!$this->task) return; // // $status = $this->task['status'] ?? 'queued'; // queued|running|done|failed // if ($status !== $this->last) { // $this->last = $status; // // $this->dispatch('notify', [ // 'id' => $this->taskKey, // gleiche ID => Toast wird ersetzt // 'state' => $status, // 'queued' | 'running' | 'done' | 'failed' // 'badge' => strtoupper($this->task['type'] ?? 'task'),// z.B. CERTBOT // 'domain' => $this->task['payload']['domain'] ?? '', // erscheint rechts neben Badge // 'message' => $this->task['message'] ?? '', // Text unten // 'position' => 'bottom-center', // z.B. bottom-center // 'duration' => in_array($status, ['done','failed']) ? 6000 : 0, // 'close' => true, // ]); // } // } public ?string $taskKey = null; public ?array $task = null; public ?string $lastHash = null; // <— statt $last public function mount(?string $taskKey = null): void { $this->taskKey = $taskKey ?: request('task'); } public function load(): void { if (!$this->taskKey) return; $this->task = \Cache::store('redis')->get($this->taskKey); if (!$this->task) return; $status = $this->task['status'] ?? 'queued'; $message = $this->task['message'] ?? ''; $hash = sha1($status.'|'.$message); // <— Fingerprint if ($hash !== $this->lastHash) { $this->lastHash = $hash; $this->dispatch('notify', [ 'id' => $this->taskKey, 'state' => $status, // queued|running|done|failed 'badge' => strtoupper($this->task['type'] ?? 'task'), // z.B. CERTBOT 'domain' => $this->task['payload']['domain'] ?? '', 'message' => $message, 'position' => 'bottom-center', 'duration' => in_array($status, ['done','failed']) ? 6000 : 0, 'close' => true, ]); } } public function render() { // Minimaler Marker reicht, damit wire:poll arbeitet return view('livewire.system.task-toast'); } }