diff --git a/app/Livewire/AlertBanner.php b/app/Livewire/AlertBanner.php index 773046081..a60f57555 100644 --- a/app/Livewire/AlertBanner.php +++ b/app/Livewire/AlertBanner.php @@ -4,11 +4,12 @@ namespace App\Livewire; use Closure; use Filament\Notifications\Concerns; +use Filament\Support\Components\ViewComponent; use Filament\Support\Concerns\EvaluatesClosures; +use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Str; -use Livewire\Wireable; -final class AlertBanner implements Wireable +final class AlertBanner extends ViewComponent implements Arrayable { use Concerns\HasBody; use Concerns\HasIcon; @@ -19,18 +20,35 @@ final class AlertBanner implements Wireable protected bool|Closure $closable = false; - public static function make(?string $id = null): AlertBanner + protected string $view = 'livewire.alerts.alert-banner'; + + protected string $viewIdentifier = 'notification'; + + public function __construct(string $id) { - $static = new self(); - $static->id($id ?? Str::orderedUuid()); + $this->id($id); + } + + public static function make(?string $id = null): static + { + $static = new self($id ?? Str::orderedUuid()); + $static->configure(); return $static; } + /** + * @return array + */ + public function getViewData(): array + { + return $this->viewData; + } + /** * @return array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool} */ - public function toLivewire(): array + public function toArray(): array { return [ 'id' => $this->getId(), @@ -42,15 +60,18 @@ final class AlertBanner implements Wireable ]; } - public static function fromLivewire(mixed $value): AlertBanner + /** + * @param array{id: string, title: ?string, body: ?string, status: ?string, icon: ?string, closeable: bool} $data + */ + public static function fromArray(array $data): AlertBanner { - $static = AlertBanner::make($value['id']); + $static = AlertBanner::make($data['id']); - $static->title($value['title']); - $static->body($value['body']); - $static->status($value['status']); - $static->icon($value['icon']); - $static->closable($value['closeable']); + $static->title($data['title']); + $static->body($data['body']); + $static->status($data['status']); + $static->icon($data['icon']); + $static->closable($data['closeable']); return $static; } @@ -69,7 +90,7 @@ final class AlertBanner implements Wireable public function send(): AlertBanner { - session()->push('alert-banners', $this->toLivewire()); + session()->push('alert-banners', $this->toArray()); return $this; } diff --git a/app/Livewire/AlertBannerContainer.php b/app/Livewire/AlertBannerContainer.php index d5d7bf60c..66dba002d 100644 --- a/app/Livewire/AlertBannerContainer.php +++ b/app/Livewire/AlertBannerContainer.php @@ -2,18 +2,18 @@ namespace App\Livewire; +use Filament\Notifications\Collection; use Illuminate\Contracts\View\View; use Livewire\Attributes\On; use Livewire\Component; class AlertBannerContainer extends Component { - /** @var array */ - public array $alertBanners; + public Collection $alertBanners; public function mount(): void { - $this->alertBanners = []; + $this->alertBanners = new Collection(); $this->pullFromSession(); } @@ -21,15 +21,16 @@ class AlertBannerContainer extends Component public function pullFromSession(): void { foreach (session()->pull('alert-banners', []) as $alertBanner) { - $alertBanner = AlertBanner::fromLivewire($alertBanner); - $this->alertBanners[$alertBanner->getId()] = $alertBanner; + $alertBanner = AlertBanner::fromArray($alertBanner); + $this->alertBanners->put($alertBanner->getId(), $alertBanner); } } public function remove(string $id): void { - $alertBanners = &$this->alertBanners; - unset($alertBanners[$id]); + if ($this->alertBanners->has($id)) { + $this->alertBanners->forget($id); + } } public function render(): View diff --git a/resources/views/livewire/alerts/alert-banner-container.blade.php b/resources/views/livewire/alerts/alert-banner-container.blade.php index 3d1f34d3f..6ebd6b62b 100644 --- a/resources/views/livewire/alerts/alert-banner-container.blade.php +++ b/resources/views/livewire/alerts/alert-banner-container.blade.php @@ -1,5 +1,5 @@
- @foreach (array_values($alertBanners) as $alertBanner) - @include('livewire.alerts.alert-banner', ['alertBanner' => $alertBanner]) + @foreach ($alertBanners as $alertBanner) + {{ $alertBanner }} @endforeach
diff --git a/resources/views/livewire/alerts/alert-banner.blade.php b/resources/views/livewire/alerts/alert-banner.blade.php index 68bae2706..136a7cf2b 100644 --- a/resources/views/livewire/alerts/alert-banner.blade.php +++ b/resources/views/livewire/alerts/alert-banner.blade.php @@ -1,14 +1,12 @@ -@props(['alertBanner']) - @php - $icon = $alertBanner->getIcon(); - $title = $alertBanner->getTitle(); - $body = $alertBanner->getBody(); + $icon = $getIcon(); + $title = $getTitle(); + $body = $getBody(); @endphp -
+
@if (filled($icon)) - + @endif
@@ -21,7 +19,7 @@ @endif
- @if ($alertBanner->isCloseable()) - + @if ($isCloseable()) + @endif