124 lines
3.8 KiB
PHP
124 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Home;
|
|
|
|
use App\Models\Brand;
|
|
use App\Models\Category;
|
|
use App\Models\ChooseUs;
|
|
use App\Models\Customer;
|
|
use App\Models\Faq;
|
|
use App\Models\Perfume;
|
|
use App\Models\PerfumeFeature;
|
|
use App\Models\Testimonial;
|
|
use Illuminate\Contracts\View\View;
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Component;
|
|
use Livewire\WithPagination;
|
|
|
|
#[Layout('components.layouts.home', [
|
|
'title' => 'Beranda',
|
|
])]
|
|
class Index extends Component
|
|
{
|
|
use WithPagination;
|
|
|
|
public array $testimonials = [];
|
|
|
|
public array $bestSellingPerfumes = [];
|
|
|
|
public array $brands = [];
|
|
|
|
public array $perfumeFeatures = [];
|
|
|
|
public array $faqs = [];
|
|
|
|
public array $whyChooseUs = [];
|
|
|
|
public int $totalMembersCount = 0;
|
|
|
|
public string $formattedTotalMembersCount = '';
|
|
|
|
public array $latestMembers = [];
|
|
|
|
public function mount(): void
|
|
{
|
|
$this->testimonials = Testimonial::with(['user', 'user.customer'])
|
|
->show()
|
|
->latest()
|
|
->take(5)
|
|
->get()
|
|
->map(function (Testimonial $testimonial) {
|
|
$name = $testimonial->user->customer->name ?? 'User';
|
|
$testimonial->customer_name = $name;
|
|
$testimonial->avatar_url = 'https://ui-avatars.com/api/?name='.urlencode($name).'&background=random&color=fff';
|
|
|
|
return $testimonial;
|
|
})
|
|
->toArray();
|
|
|
|
$this->bestSellingPerfumes = Perfume::withSum(['items' => function ($query) {
|
|
$query->whereHas('order', function ($q) {
|
|
$q->paid();
|
|
});
|
|
}], 'quantity')
|
|
->orderByDesc('items_sum_quantity')
|
|
->take(5)
|
|
->get()
|
|
->map(function (Perfume $perfume) {
|
|
$perfume->image = $perfume->getFirstMediaUrl('image') ?: asset('assets/images/logo.png');
|
|
$perfume->concentration_label = $perfume->concentration->label();
|
|
$perfume->formatted_price = formatCurrencyNumber($perfume->sale_price, 'Rp');
|
|
$perfume->formatted_sold_count = formatCurrencyNumber($perfume->items_sum_quantity);
|
|
|
|
return $perfume;
|
|
})
|
|
->filter(fn (Perfume $perfume) => $perfume->items_sum_quantity > 0)
|
|
->toArray();
|
|
|
|
$this->brands = Brand::orderBy('sort_order')
|
|
->get()
|
|
->map(function (Brand $brand) {
|
|
$brand->image = $brand->getFirstMediaUrl('image') ?: asset('assets/images/dark-logo.png');
|
|
|
|
return $brand;
|
|
})
|
|
->toArray();
|
|
|
|
$this->whyChooseUs = ChooseUs::orderBy('sort_order')->get()->toArray();
|
|
|
|
$this->perfumeFeatures = PerfumeFeature::orderBy('sort_order')->get()->toArray();
|
|
|
|
$this->faqs = Faq::orderBy('sort_order')->get()->toArray();
|
|
|
|
$this->totalMembersCount = Customer::count();
|
|
$this->formattedTotalMembersCount = number_format($this->totalMembersCount);
|
|
|
|
$this->latestMembers = Customer::whereNotNull('user_id')
|
|
->inRandomOrder()
|
|
->take(3)
|
|
->get()
|
|
->map(function (Customer $member) {
|
|
$member->avatar_url = 'https://ui-avatars.com/api/?name='.urlencode($member->name).'&background=random&color=fff';
|
|
|
|
return $member;
|
|
})
|
|
->toArray();
|
|
}
|
|
|
|
public function render(): View
|
|
{
|
|
return view('livewire.home.index', [
|
|
'pageTitle' => 'Selamat Datang! ✨',
|
|
'categories' => Category::perfume()
|
|
->orderBy('sort_order')
|
|
->paginate(12)
|
|
->through(function (Category $category) {
|
|
$category->image = $category->getFirstMediaUrl('image')
|
|
?: asset('assets/images/logo.png');
|
|
|
|
return $category;
|
|
}),
|
|
]);
|
|
}
|
|
}
|