From ca92fc9089cce3f26a5403dfd5e1e4c23925f5b1 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 6 Jan 2026 20:27:17 +0700 Subject: [PATCH] feat: Implement member's "My Vouchers" page with new Livewire component, view, sidebar navigation, and route. --- app/Livewire/Member/MyVouchers.php | 74 +++++++++++++++ .../sections/ui/member/_sidebar.blade.php | 3 + .../livewire/member/my-vouchers.blade.php | 90 +++++++++++++++++++ routes/pages/member.php | 2 + 4 files changed, 169 insertions(+) create mode 100644 app/Livewire/Member/MyVouchers.php create mode 100644 resources/views/livewire/member/my-vouchers.blade.php diff --git a/app/Livewire/Member/MyVouchers.php b/app/Livewire/Member/MyVouchers.php new file mode 100644 index 0000000..7f3fc6e --- /dev/null +++ b/app/Livewire/Member/MyVouchers.php @@ -0,0 +1,74 @@ +myVouchers = auth()->user()->vouchers() + ->withPivot('quantity', 'created_at') + ->orderBy('user_voucher.created_at', 'desc') + ->get() + ->map(function ($voucher) { + // Status Logic + $now = now(); + $isActive = $voucher->start_date <= $now && ($voucher->end_date === null || $voucher->end_date >= $now); + $isExpired = $voucher->end_date && $voucher->end_date < $now; + $isUpcoming = $voucher->start_date > $now; + + $status = 'active'; + if ($isExpired) { + $status = 'expired'; + } elseif ($isUpcoming) { + $status = 'upcoming'; + } + + // Discount Display Logic + if ($voucher->type === VoucherType::PERCENTAGE) { + $discountDisplay = "Diskon {$voucher->discount_amount}%"; + if ($voucher->max_discount) { + $discountDisplay .= ' (Max Rp'.formatCurrencyNumber($voucher->max_discount).')'; + } + } else { + $discountDisplay = 'Potongan Rp'.formatCurrencyNumber($voucher->discount_amount); + } + + // Date Display Logic + $dateDisplay = formatDateLocalized($voucher->start_date); + if ($voucher->end_date) { + $dateDisplay .= ' - '.formatDateLocalized($voucher->end_date); + } else { + $dateDisplay .= ' - Tidak ada batas waktu'; + } + + $voucher->claimed_at_display = formatDateTimeLocalized($voucher->pivot->created_at); + $voucher->date_display = $dateDisplay; + $voucher->min_purchase_display = $voucher->min_purchase ? 'Min. Belanja: Rp'.formatCurrencyNumber($voucher->min_purchase) : null; + $voucher->discount_display = $discountDisplay; + $voucher->status = $status; + $voucher->quantity = $voucher->pivot->quantity; + + return $voucher; + }) + ->toArray(); + } + + public function render(): View + { + return view('livewire.member.my-vouchers', [ + 'pageTitle' => 'Voucher Saya', + 'pageDescription' => 'Daftar voucher yang telah Anda klaim dan dapat digunakan ketika belanja di toko.', + ]); + } +} diff --git a/resources/views/components/sections/ui/member/_sidebar.blade.php b/resources/views/components/sections/ui/member/_sidebar.blade.php index 5e30ccd..d2af4a4 100644 --- a/resources/views/components/sections/ui/member/_sidebar.blade.php +++ b/resources/views/components/sections/ui/member/_sidebar.blade.php @@ -13,6 +13,9 @@ class="bg-zinc-50 dark:bg-zinc-900 border-r rtl:border-r-0 rtl:border-l border-z Membership + + Voucher Saya Penukaran Poin diff --git a/resources/views/livewire/member/my-vouchers.blade.php b/resources/views/livewire/member/my-vouchers.blade.php new file mode 100644 index 0000000..ae32bad --- /dev/null +++ b/resources/views/livewire/member/my-vouchers.blade.php @@ -0,0 +1,90 @@ + + {{ $pageTitle }} + {{ $pageDescription }} + + @if (empty($myVouchers)) + +
+ + Belum Ada Voucher + + Anda belum memiliki voucher. Klaim voucher di halaman utama untuk mendapatkan diskon menarik! + + + Klaim Voucher Sekarang + +
+
+ @else +
+ @foreach ($myVouchers as $voucher) + + {{-- Badge Status --}} +
+ @if ($voucher['status'] === 'active') + Aktif + @elseif ($voucher['status'] === 'expired') + Kadaluarsa + @elseif ($voucher['status'] === 'upcoming') + Segera + @endif +
+ + {{-- Voucher Content --}} +
+ {{ $voucher['name'] }} + + {{-- Voucher Code --}} +
+ + {{ $voucher['code'] }} + + @if ($voucher['quantity'] > 1) + + {{ $voucher['quantity'] }}x + + @endif +
+ + {{-- Summary --}} + + {{ $voucher['summary'] }} + + + {{-- Discount Info --}} +
+ + + {{ $voucher['discount_display'] }} + +
+ + {{-- Min Purchase --}} + @if ($voucher['min_purchase_display']) +
+ + + {{ $voucher['min_purchase_display'] }} + +
+ @endif + + {{-- Valid Period --}} +
+ + + {{ $voucher['date_display'] }} + +
+
+ + {{-- Claimed Date --}} + + + Diklaim pada: {{ $voucher['claimed_at_display'] }} + +
+ @endforeach +
+ @endif +
diff --git a/routes/pages/member.php b/routes/pages/member.php index c3c86e8..2606f64 100644 --- a/routes/pages/member.php +++ b/routes/pages/member.php @@ -1,6 +1,7 @@ name('overview'); Route::get('memberships', Membership::class)->name('membership'); + Route::get('my-vouchers', MyVouchers::class)->name('my_vouchers'); Route::get('redeem-points', RedeemPoint::class)->name('redeem_point'); Route::get('referrals', Referral::class)->name('referral'); Route::get('settings', Account::class)->name('setting');