parfum/app/Livewire/Home/Outlet.php

63 lines
2.0 KiB
PHP

<?php
namespace App\Livewire\Home;
use App\Models\Outlet as OutletModel;
use Illuminate\Contracts\View\View;
use Livewire\Attributes\Layout;
use Livewire\Component;
#[Layout('components.layouts.home', [
'title' => 'Outlet',
])]
class Outlet extends Component
{
public string $search = '';
public ?OutletModel $selectedOutlet = null;
public function showDetail(OutletModel $outletModel): void
{
$this->selectedOutlet = $outletModel;
$this->selectedOutlet->load(['openingHours' => function ($query) {
$query->orderBy('day');
}]);
$this->selectedOutlet->openingHours->each(function ($hour) {
$hour->formatted_open_time = \Carbon\Carbon::parse($hour->open_time)->format('H:i');
$hour->formatted_close_time = \Carbon\Carbon::parse($hour->close_time)->format('H:i');
});
}
public function closeModal(): void
{
$this->selectedOutlet = null;
}
public function render(): View
{
$outlets = OutletModel::with(['facilities', 'openingHours'])
->operational()
->when($this->search, function ($query) {
$query->where(function ($query) {
$query->where('name', 'like', '%'.$this->search.'%')
->orWhere('address', 'like', '%'.$this->search.'%');
});
})
->latest()
->get()
->map(function ($outlet) {
$outlet->image = $outlet->getFirstMediaUrl('featured_image') ?: asset('assets/images/dark-logo.png');
$outlet->status_label = $outlet->status->label();
$outlet->status_color = $outlet->status->color();
return $outlet;
});
return view('livewire.home.outlets', [
'pageTitle' => 'Outlet Terdekat ✨',
'pageDesc' => 'Temukan outlet kami di sekitarmu dan rasakan langsung kemewahan aromanya! 🚗🏢',
'outlets' => $outlets,
]);
}
}