{{-- resources/views/storefront/partials/product-card.blade.php --}} @php // Safely handle product data if (empty($product) || !(is_object($product) || is_array($product))) { return; } $images = \App\Support\StorefrontPresenter::productImages($product); $image = $images[0] ?? null; // Safely get variant data $variants = data_get($product, 'variants', collect()); $defaultVariant = null; if ($variants instanceof \Illuminate\Support\Collection) { $defaultVariant = $variants->firstWhere('is_default', true) ?: $variants->first(); } elseif (is_array($variants)) { $defaultVariant = collect($variants)->firstWhere('is_default', true) ?: collect($variants)->first(); } $price = data_get($defaultVariant, 'price') ?? data_get($product, 'base_price') ?? data_get($product, 'discounted_price') ?? data_get($product, 'price') ?? 0; $comparePrice = data_get($defaultVariant, 'compare_price') ?? data_get($product, 'compare_price') ?? (data_get($product, 'discounted_price') !== null ? data_get($product, 'price') : 0); $variantLabel = data_get($defaultVariant, 'name') ?: (data_get($product, 'short_description') ?: (data_get($product, 'category.name') ?: '1 unit')); $hasDiscount = $comparePrice && (float) $comparePrice > (float) $price; $discountPercent = $hasDiscount ? (int) round((((float) $comparePrice - (float) $price) / (float) $comparePrice) * 100) : null; $savingAmount = $hasDiscount ? ((float) $comparePrice - (float) $price) : 0; $productUrl = route('storefront.products.show', ['product' => data_get($product, 'id')] + array_filter([ 'zone' => $selectedZone?->slug, 'service' => $selectedService ?? null, ])); // Safely get ratings $productRatingCount = (int) (data_get($product, 'reviews_count') ?? data_get($product, 'reviews.count') ?? 0); $productRatingAverage = (float) (data_get($product, 'reviews_avg_rating') ?? 0); $storeRatingCount = (int) (data_get($product, 'store.reviews_count') ?? 0); $storeRatingAverage = (float) (data_get($product, 'store.reviews_avg_rating') ?? 0); $ratingCount = $productRatingCount > 0 ? $productRatingCount : $storeRatingCount; $ratingAverage = $productRatingCount > 0 ? $productRatingAverage : $storeRatingAverage; $rating = $ratingAverage > 0 && $ratingCount > 0 ? number_format($ratingAverage, 1) : null; // Cart data $productId = data_get($product, 'id'); $variantId = data_get($defaultVariant, 'id'); $cartKey = $productId . ':' . ($variantId ?? 0); $cartEntry = data_get($cartLookup, $cartKey); $quantity = (int) data_get($cartEntry, 'quantity', 0); $cartItemId = data_get($cartEntry, 'cart_item_id'); $hasStock = data_get($product, 'in_stock', true) && (! data_get($product, 'track_inventory', false) || data_get($product, 'available_quantity', data_get($product, 'stock_quantity')) === null || (int) data_get($product, 'available_quantity', data_get($product, 'stock_quantity', 0)) > 0); $productName = data_get($product, 'name', 'Product'); $categoryName = data_get($product, 'category.name', data_get($product, 'category_name', '')); $storeName = data_get($product, 'store.name', data_get($product, 'restaurant_name', '')); $isActive = data_get($product, 'is_active', data_get($product, 'is_available', true)); $cardService = $selectedService ?? request('service', 'hyperlocal'); $isFoodCard = in_array($cardService, ['food', 'restaurant'], true); $isGroceryCard = in_array($cardService, ['grocery', 'hyperlocal'], true); // Check if product is valid $isValidProduct = $productId && $isActive; @endphp @if($isValidProduct)
{{-- Thumbnail --}}
@if($image) {{ $productName }} @else
{{ Str::upper(Str::substr($productName, 0, 1)) }}
@endif @if($discountPercent) {{ $discountPercent }}%OFF @endif
{{-- Product Info --}}
{{ Str::limit($productName, 30) }}
{{ $variantLabel }}
{{-- Rating --}} @if($rating)
{{ $rating }} ({{ $ratingCount }})
@endif
{{-- Footer --}} {{-- Discount Badge --}} @if($hasDiscount)
{{ $discountPercent }}% OFF @if($savingAmount > 0) Save {{ \App\Support\StorefrontPresenter::money($savingAmount) }} @endif
@endif {{-- Store name for food cards --}} @if($isFoodCard && $storeName)
{{ $storeName }}
@endif
@endif