"use client"; import { useState, useEffect, useMemo } from "react"; import { Product } from "../lib/data/products"; import { usePetStore } from "../lib/store/usePetStore"; import { productService } from "../lib/services/productService"; import { motion } from "motion/react"; import { Eye, ShoppingCart, Heart, AlertCircle, Sparkles, Dog, Cat } from "lucide-react"; import SafeImage from "./SafeImage"; import { ProductCardSkeleton } from "./Skeleton"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useSettingsStore } from "../lib/store/settingsStore"; import { useCartStore } from "../lib/store/cartStore"; import { toast } from "sonner"; import { isSuitableForDog, isSuitableForCat, isSuitableForBoth, isSpeciesCompatible, matchesMedicalSymptom } from "../lib/petCompatibility"; function ProductCard({ product, priority = false }: { product: Product; priority?: boolean }) { const router = useRouter(); const { getText, isInitialized } = useSettingsStore(); const { getActivePet } = usePetStore(); const activePet = getActivePet(); const { addItem } = useCartStore(); const nameFa = product.nameFa || product.name; const nameEn = product.nameEn || ""; const forDog = isSuitableForDog(product.suitableFor); const forCat = isSuitableForCat(product.suitableFor); const forBoth = isSuitableForBoth(product.suitableFor) || (forDog && forCat); const compatibility = useMemo(() => { if (!activePet) return null; const petType = activePet.type || 'سگ'; const sameSpecies = isSpeciesCompatible(product.suitableFor, petType); const matchedSymptom = matchesMedicalSymptom(activePet.medicalConditions, product.symptoms, product.benefits); if (!sameSpecies) return { type: "alert", text: `مخصوص ${product.suitableFor || 'پت'}` }; if (matchedSymptom) return { type: "success", text: `توصیه شده برای ${matchedSymptom} ${activePet.name || 'پت شما'}` }; return { type: "neutral", text: `مناسب برای ${activePet.name || 'پت شما'}` }; }, [product, activePet]); const isCatalogOnly = isInitialized ? getText('CATALOG_ONLY_MODE', 'false') === 'true' : false; const showPreorderBtn = isCatalogOnly && (isInitialized ? getText('CATALOG_PREORDER_BTN', 'false') === 'true' : false); const allowCart = !isCatalogOnly && (isInitialized ? getText('allow_cart_purchase', 'true') === 'true' : true); const showPrices = !isCatalogOnly || (isInitialized ? getText('show_product_prices', 'true') === 'true' : true); return ( router.push(`/shop/${product.slug || product.id}`)} className="group bg-white/90 backdrop-blur-md rounded-2xl sm:rounded-3xl border border-medical-gray-200/80 overflow-hidden hover:shadow-xl hover:shadow-canina-blue/10 hover:border-canina-blue/30 transition-all duration-300 flex flex-col cursor-pointer relative" > {/* Category Badge */} {product.category} {/* Compatibility Tag */} {compatibility && ( {compatibility.type === "alert" ? ( forBoth ? ( ) : forCat ? ( ) : forDog ? ( ) : ( ) ) : compatibility.type === "success" ? ( ) : ( )} {compatibility.text} )} {/* Image Container */} {/* Species Badges (Dog / Cat) */} {forDog && ( )} {forCat && ( )} {/* Hover Actions for desktop */} { e.stopPropagation(); router.push(`/shop/${product.slug || product.id}`); }} className="w-10 h-10 rounded-full bg-white text-canina-blue flex items-center justify-center hover:scale-110 transition-transform shadow-lg cursor-pointer" title="مشاهده جزئیات" > {allowCart && (product.packageSize !== undefined && product.packageSize !== null ? Number(product.packageSize) : 100) > 0 && ( { e.stopPropagation(); addItem(product, 1); toast.success(`${nameFa} به سبد خرید اضافه شد.`); }} className="w-10 h-10 rounded-full bg-canina-blue text-white flex items-center justify-center hover:scale-110 transition-transform shadow-lg border border-white/20 cursor-pointer" title="افزودن به سبد خرید" > )} {/* Content */} {/* Dual-language Name */} {nameFa} {nameEn && ( {nameEn} )} {/* Short description */} {product.shortDescription || (product.description ? product.description.replace(/<[^>]*>/g, '') : '')} {/* Footer: Price + CTA */} {showPrices ? (typeof product.price === 'string' || typeof product.price === 'number' ? String(product.price) : 'تماس بگیرید') : 'تماس بگیرید'} {showPreorderBtn ? ( ثبت پیشخرید ) : ( {getText("product_view_details", "مشاهده جزئیات")} )} ); } export default function FeaturedProducts() { const router = useRouter(); const getText = useSettingsStore((state) => state.getText); const [products, setProducts] = useState([]); const [isLoading, setIsLoading] = useState(true); useEffect(() => { productService.getFeaturedProducts() .then(setProducts) .catch(() => toast.error("خطا در دریافت لیست محصولات از سرور.")) .finally(() => setIsLoading(false)); }, []); return ( {getText("featured_badge", "بیشترین انتخاب توسط دامپزشکان")} {getText("featured_title_line1", "محصولات برگزیده و راهکارهای")}{" "} {getText("featured_title_line2", "درمان تخصصی")} router.push("/shop")} className="inline-flex items-center gap-1 sm:gap-2 text-canina-blue font-black text-xs sm:text-sm hover:translate-x-1 transition-all group font-vazir shrink-0" > {getText("featured_view_all", "مشاهده تمامی محصولات")} ← {isLoading ? ( Array.from({ length: 4 }).map((_, i) => ) ) : products.length > 0 ? ( products.map((p, i) => ) ) : ( {getText("featured_no_products_title", "هیچ محصولی یافت نشد")} {getText("featured_no_products_desc", "در حال حاضر هیچ محصول برجستهای برای نمایش وجود ندارد.")} )} ); }
{product.shortDescription || (product.description ? product.description.replace(/<[^>]*>/g, '') : '')}
{getText("featured_no_products_desc", "در حال حاضر هیچ محصول برجستهای برای نمایش وجود ندارد.")}