|
|
<x-app-layout> |
|
|
<x-slot name="header"> |
|
|
<div class="flex items-center justify-between"> |
|
|
<div> |
|
|
<h1 class="heading-2 mb-2">Shopping Cart</h1> |
|
|
<p class="text-muted">Review your items and proceed to checkout</p> |
|
|
</div> |
|
|
<div class="text-right"> |
|
|
@if (!empty($cart)) |
|
|
<div class="text-white"> |
|
|
<div class="text-2xl font-bold">{{ count($cart) }} {{ count($cart) === 1 ? 'Item' : 'Items' }}</div> |
|
|
<div class="text-muted">in your cart</div> |
|
|
</div> |
|
|
@endif |
|
|
</div> |
|
|
</div> |
|
|
</x-slot> |
|
|
|
|
|
<div class="py-12"> |
|
|
<div class="container-custom"> |
|
|
@if (session('success')) |
|
|
<div class="card mb-6 bg-green-900/30 border-green-500/30"> |
|
|
<div class="flex items-center"> |
|
|
<i class="fas fa-check-circle text-green-400 mr-3 text-xl"></i> |
|
|
<span class="text-green-300 font-medium">{{ session('success') }}</span> |
|
|
</div> |
|
|
</div> |
|
|
@endif |
|
|
|
|
|
@if (empty($cart)) |
|
|
<div class="text-center py-20"> |
|
|
<div class="card max-w-md mx-auto text-center"> |
|
|
<div class="w-24 h-24 bg-gradient-to-r from-gray-600 to-gray-800 rounded-full flex items-center justify-center mx-auto mb-8 opacity-50"> |
|
|
<i class="fas fa-shopping-cart text-4xl text-white"></i> |
|
|
</div> |
|
|
<h2 class="heading-2 mb-4">Your Cart is Empty</h2> |
|
|
<p class="text-muted mb-8">Looks like you haven't added any items to your cart yet. Start shopping to fill it up!</p> |
|
|
<a href="{{ route('categories') }}" class="btn-primary"> |
|
|
<i class="fas fa-store mr-2"></i>Continue Shopping |
|
|
</a> |
|
|
</div> |
|
|
</div> |
|
|
@else |
|
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8"> |
|
|
<!-- Cart Items Section --> |
|
|
<div class="lg:col-span-2 space-y-6"> |
|
|
<div class="card"> |
|
|
<h2 class="heading-3 mb-6"> |
|
|
<i class="fas fa-list mr-3 text-blue-400"></i>Cart Items |
|
|
</h2> |
|
|
|
|
|
@php $total = 0; @endphp |
|
|
@foreach ($cart as $item) |
|
|
@php $subtotal = $item['price'] * $item['quantity']; $total += $subtotal; @endphp |
|
|
|
|
|
<div class="flex items-center p-6 bg-black/20 rounded-xl border border-white/10 mb-4 hover:bg-black/30 transition-all duration-300"> |
|
|
<div class="flex-shrink-0"> |
|
|
<img src="{{ $item['image'] }}" alt="{{ $item['name'] }}" |
|
|
class="w-24 h-24 object-cover rounded-xl" |
|
|
style="width: 96px; height: 96px; max-width: 96px; max-height: 96px; object-fit: cover; display: block;"> |
|
|
</div> |
|
|
|
|
|
<div class="flex-1 ml-6"> |
|
|
<h3 class="text-xl font-semibold text-white mb-3"> |
|
|
{{ $item['name'] }} |
|
|
</h3> |
|
|
|
|
|
@if(isset($item['game']) && $item['game']) |
|
|
@php |
|
|
// Get custom game styling if it exists |
|
|
$customGame = \App\Models\CustomGame::where('name', $item['game'])->first(); |
|
|
|
|
|
if ($customGame) { |
|
|
// Extract color from gradient for custom games |
|
|
$gradientParts = explode(' ', $customGame->color_gradient); |
|
|
$primaryColor = str_replace(['from-', '-500'], '', $gradientParts[0] ?? 'purple'); |
|
|
|
|
|
// Map to badge classes |
|
|
$badgeClasses = [ |
|
|
'red' => 'bg-red-500/20 text-red-300 border-red-500/30', |
|
|
'pink' => 'bg-pink-500/20 text-pink-300 border-pink-500/30', |
|
|
'rose' => 'bg-rose-500/20 text-rose-300 border-rose-500/30', |
|
|
'purple' => 'bg-purple-500/20 text-purple-300 border-purple-500/30', |
|
|
'blue' => 'bg-blue-500/20 text-blue-300 border-blue-500/30', |
|
|
'green' => 'bg-green-500/20 text-green-300 border-green-500/30', |
|
|
'orange' => 'bg-orange-500/20 text-orange-300 border-orange-500/30', |
|
|
'yellow' => 'bg-yellow-500/20 text-yellow-300 border-yellow-500/30', |
|
|
'teal' => 'bg-teal-500/20 text-teal-300 border-teal-500/30', |
|
|
'cyan' => 'bg-cyan-500/20 text-cyan-300 border-cyan-500/30', |
|
|
'indigo' => 'bg-indigo-500/20 text-indigo-300 border-indigo-500/30', |
|
|
'violet' => 'bg-violet-500/20 text-violet-300 border-violet-500/30', |
|
|
'emerald' => 'bg-emerald-500/20 text-emerald-300 border-emerald-500/30' |
|
|
]; |
|
|
|
|
|
$badgeClass = $badgeClasses[$primaryColor] ?? 'bg-purple-500/20 text-purple-300 border-purple-500/30'; |
|
|
$gameIcon = $customGame->icon; |
|
|
} else { |
|
|
// Default styling for main games |
|
|
$gameIcons = [ |
|
|
'Genshin' => 'fas fa-star', |
|
|
'Starrail' => 'fas fa-rocket', |
|
|
'WutheringWave' => 'fas fa-wave-square', |
|
|
'ZenlessZoneZero' => 'fas fa-city', |
|
|
'Arknights' => 'fas fa-chess-knight', |
|
|
'AzurLane' => 'fas fa-ship' |
|
|
]; |
|
|
|
|
|
$gameColors = [ |
|
|
'Genshin' => 'bg-yellow-500/20 text-yellow-300 border-yellow-500/30', |
|
|
'Starrail' => 'bg-purple-500/20 text-purple-300 border-purple-500/30', |
|
|
'WutheringWave' => 'bg-cyan-500/20 text-cyan-300 border-cyan-500/30', |
|
|
'ZenlessZoneZero' => 'bg-red-500/20 text-red-300 border-red-500/30', |
|
|
'Arknights' => 'bg-indigo-500/20 text-indigo-300 border-indigo-500/30', |
|
|
'AzurLane' => 'bg-blue-500/20 text-blue-300 border-blue-500/30' |
|
|
]; |
|
|
|
|
|
$badgeClass = $gameColors[$item['game']] ?? 'bg-gray-500/20 text-gray-300 border-gray-500/30'; |
|
|
$gameIcon = $gameIcons[$item['game']] ?? 'fas fa-gamepad'; |
|
|
} |
|
|
@endphp |
|
|
|
|
|
<div class="mb-3"> |
|
|
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium border {{ $badgeClass }}"> |
|
|
<i class="{{ $gameIcon }} mr-2"></i>{{ $item['game'] }} |
|
|
</span> |
|
|
</div> |
|
|
@endif |
|
|
|
|
|
<div class="flex items-center space-x-6 text-sm text-muted"> |
|
|
<span> |
|
|
<i class="fas fa-box mr-2"></i>Quantity: {{ $item['quantity'] }} |
|
|
</span> |
|
|
<span> |
|
|
<i class="fas fa-tag mr-2"></i>Unit Price: ฿{{ number_format($item['price'], 2) }} |
|
|
</span> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="text-right"> |
|
|
<div class="text-2xl font-bold gradient-text mb-4"> |
|
|
฿{{ number_format($subtotal, 2) }} |
|
|
</div> |
|
|
<form action="{{ route('cart.remove', $item['id']) }}" method="POST" class="inline"> |
|
|
@csrf |
|
|
<button type="submit" class="btn-danger text-sm" |
|
|
onclick="return confirm('Are you sure you want to remove this item?')"> |
|
|
<i class="fas fa-trash mr-2"></i>Remove |
|
|
</button> |
|
|
</form> |
|
|
</div> |
|
|
</div> |
|
|
@endforeach |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<!-- Order Summary & Checkout Section --> |
|
|
<div class="space-y-6"> |
|
|
<!-- Order Summary --> |
|
|
<div class="card"> |
|
|
<h3 class="heading-3 mb-6"> |
|
|
<i class="fas fa-calculator mr-3 text-purple-400"></i>Order Summary |
|
|
</h3> |
|
|
|
|
|
<div class="space-y-4"> |
|
|
<div class="flex justify-between"> |
|
|
<span class="text-muted">Subtotal ({{ count($cart) }} items)</span> |
|
|
<span class="font-semibold text-white">฿{{ number_format($total, 2) }}</span> |
|
|
</div> |
|
|
<div class="flex justify-between"> |
|
|
<span class="text-muted">Shipping</span> |
|
|
<span class="font-semibold text-green-400">Free</span> |
|
|
</div> |
|
|
<div class="flex justify-between"> |
|
|
<span class="text-muted">Tax</span> |
|
|
<span class="font-semibold text-white">฿0.00</span> |
|
|
</div> |
|
|
<div class="border-t border-white/20 pt-4"> |
|
|
<div class="flex justify-between items-center"> |
|
|
<span class="text-xl font-semibold text-white">Total</span> |
|
|
<span class="text-3xl font-bold gradient-text">฿{{ number_format($total, 2) }}</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<!-- Checkout Form --> |
|
|
<div class="card"> |
|
|
<h3 class="heading-3 mb-6"> |
|
|
<i class="fas fa-credit-card mr-3 text-green-400"></i>Checkout Information |
|
|
</h3> |
|
|
|
|
|
<form action="{{ route('checkout.submit') }}" method="POST" enctype="multipart/form-data" class="space-y-6"> |
|
|
@csrf |
|
|
|
|
|
<div> |
|
|
<label class="block text-sm font-medium text-white mb-3"> |
|
|
<i class="fas fa-user mr-2"></i>Full Name |
|
|
</label> |
|
|
<input type="text" name="customer_name" required |
|
|
class="input-field" placeholder="Enter your full name"> |
|
|
</div> |
|
|
|
|
|
<div> |
|
|
<label class="block text-sm font-medium text-white mb-3"> |
|
|
<i class="fas fa-phone mr-2"></i>Phone Number |
|
|
</label> |
|
|
<input type="text" name="phone" required |
|
|
class="input-field" placeholder="Enter your phone number"> |
|
|
</div> |
|
|
|
|
|
<div> |
|
|
<label for="payment_slip" class="block text-sm font-medium text-white mb-3"> |
|
|
<i class="fas fa-receipt mr-2"></i>Payment Slip |
|
|
</label> |
|
|
<div id="upload-area" class="border-2 border-dashed border-white/20 rounded-xl p-8 text-center hover:border-purple-400/50 transition-colors"> |
|
|
<div id="upload-content"> |
|
|
<i class="fas fa-cloud-upload-alt text-4xl text-white/40 mb-4"></i> |
|
|
<div class="text-white/80 mb-2"> |
|
|
<label for="payment_slip" class="cursor-pointer text-purple-400 hover:text-purple-300 font-medium"> |
|
|
Upload payment slip |
|
|
</label> |
|
|
<span class="text-white/60"> or drag and drop</span> |
|
|
</div> |
|
|
<p class="text-xs text-white/50">PNG, JPG, GIF up to 10MB</p> |
|
|
</div> |
|
|
<div id="image-preview" class="hidden"> |
|
|
<img id="preview-img" src="" alt="Payment slip preview" |
|
|
class="max-w-full max-h-48 mx-auto rounded-lg mb-4" |
|
|
style="max-width: 300px; max-height: 200px; object-fit: contain;"> |
|
|
<div class="text-white/80 mb-2"> |
|
|
<span id="file-name" class="text-green-400 font-medium"></span> |
|
|
</div> |
|
|
<button type="button" id="remove-image" class="text-red-400 hover:text-red-300 text-sm"> |
|
|
<i class="fas fa-times mr-1"></i>Remove |
|
|
</button> |
|
|
</div> |
|
|
<input id="payment_slip" name="payment_slip" type="file" accept="image |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|