"use client"; import { useState, useMemo, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { ArrowRight, Calculator as CalcIcon, ChevronLeft, ShieldCheck, CheckCircle2, Clock, FlaskConical, Stethoscope, Info, CalendarDays, Dog, Gamepad2, X, Plus, Minus, Bell, Sparkles, ChevronRight, ChevronDown, Activity, Heart, Zap, Flame, Star, Users, ShoppingBag } from "lucide-react"; const ICON_MAP: Record = { Sparkles, Activity, ShieldCheck, Heart, Zap, Flame, Star, Users }; import { toPersian, cn } from "../lib/utils"; import { Product, PRODUCTS } from "../lib/data/products"; import { productService } from "../lib/services/productService"; import { SCIENTIFIC_TERMS } from "../lib/data/scientificTerms"; import { useSettingsStore } from "../lib/store/settingsStore"; import { create } from "zustand"; import { useCartStore } from "../lib/store/cartStore"; import { usePetStore } from "../lib/store/usePetStore"; import { toast } from "sonner"; interface CalculatorState { petType: "young" | "adult"; weight: number; setPetType: (type: "young" | "adult") => void; setWeight: (weight: number) => void; } const useCalculatorStore = create((set) => ({ petType: "young", weight: 10, setPetType: (petType) => set({ petType }), setWeight: (weight) => set({ weight }), })); import Tooltip from "./Tooltip"; import SafeImage from "./SafeImage"; import { useRouter } from 'next/navigation'; export default function ProductPage({ productSlug }: { productSlug: string }) { const router = useRouter(); const [product, setProduct] = useState(null); const [isLoading, setIsLoading] = useState(true); const [activeTab, setActiveTab] = useState<"specs" | "feeding" | "notes">("specs"); const [showRefillModal, setShowRefillModal] = useState(false); const [itemQuantity, setItemQuantity] = useState(1); const [allProducts, setAllProducts] = useState([]); useEffect(() => { productService.getProducts() .then((products) => { setAllProducts(products); const found = products.find(p => p.slug === productSlug || p.id === productSlug); setProduct(found || null); }) .catch(err => console.error("Error fetching products in ProductPage:", err)) .finally(() => setIsLoading(false)); }, [productSlug]); const { pets, getActivePet } = usePetStore(); const activePet = getActivePet(); const { petType, weight, setPetType, setWeight } = useCalculatorStore(); const { addItem } = useCartStore(); const scientificTerms = useSettingsStore(state => state.scientificTerms); const termKeys = useMemo(() => { return Array.from(new Set([ ...Object.keys(scientificTerms), ...Object.keys(SCIENTIFIC_TERMS) ])); }, [scientificTerms]); // Re-hydrate product to ensure methods like calculateDosage exist const fullProduct = useMemo(() => { if (!product) return null; const apiProduct = allProducts.find(p => p.id === product.id) || product; if (!apiProduct) return null; const staticProduct = PRODUCTS.find(p => p.id === apiProduct.id || p.artNo === apiProduct.artNo); if (staticProduct) { return { ...apiProduct, calculateDosage: staticProduct.calculateDosage }; } if (typeof apiProduct.calculateDosage !== 'function') { return { ...apiProduct, calculateDosage: (w: number, y: boolean) => { return { quantity: 1, unit: apiProduct.unit || "قرص", description: "مصرف روزانه بر اساس دستور پزشک" }; } }; } return apiProduct; }, [product, allProducts]); useEffect(() => { if (activePet) { setWeight(activePet.weight); setPetType(activePet.age <= 1 ? "young" : "adult"); } }, [activePet, setWeight, setPetType]); const calculation = useMemo(() => { if (!fullProduct || typeof fullProduct.calculateDosage !== 'function') return null; const result = fullProduct.calculateDosage(weight, petType === "young"); const duration = Math.floor(fullProduct.packageSize / result.quantity); return { dailyDose: result.quantity, duration: duration || 0, unit: result.unit, description: result.description }; }, [fullProduct, petType, weight]); // Suggest quantity inside useEffect to avoid render-phase state update useEffect(() => { const duration = calculation?.duration ?? 0; const suggestedQty = (duration < 30 && duration > 0) ? 2 : 1; setItemQuantity(suggestedQty); }, [calculation?.duration]); if (isLoading) return
Loading...
; if (!product || !fullProduct || !calculation) return
محصول یافت نشد
; return (
{/* Mobile Header with Back Button */}
کانینا ایران
{/* Breadcrumbs */}
{/* Main Content Area */}
استاندارد صنعتی آلمان
{product.specialBadge && (
{product.specialBadge}
)}

{product.name}

{pets.length > 0 ? ( product.optimisticTemplate?.replace("[PetName]", activePet?.name || "").replace("[OnSet]", product.onSetOfAction || "به زودی") ) : ( product.scientificTagline )}

{fullProduct.shortDescription && (

{fullProduct.shortDescription}

)}
{/* Key Benefits Section */} {fullProduct.keyBenefits?.length > 0 && (

چرا {fullProduct.name}؟

{fullProduct.keyBenefits.map((benefit, i) => { const Icon = ICON_MAP[benefit.icon] || CheckCircle2; return (

{benefit.title}

{benefit.description}

); })}
)}
موجود در انبار
گرید دارویی اختصاصی
{/* Ingredients Section */}

ترکیبات و آنالیز علمی

{/* Ingredients Cards */}

مواد تشکیل‌دهنده برتر

{product.main_ingredients.map((ing, idx) => { const termKey = termKeys.find(key => ing.includes(key)); return (
{termKey ? ( router.push(`/wiki?term=${id}`)}> {ing} ) : ing}
); })}
{/* Analysis Cards Grid */} {Object.keys(product.analysis).length > 0 && (
تخمین اتمام بسته (هوش مصنوعی)
{Object.entries(product.analysis).map(([key, value]) => (
{key}
{toPersian(value)}
))}
)}
{/* Feeding Section */}

توصیه غذایی و نحوه مصرف

{product.feedingAdvice}

{/* Specialist Note */} {product.specialist && (
{product.specialist.name}
مورد تأیید دامپزشکان

{product.specialist.name}

{product.specialist.title}

"{product.specialist.message}"

)} {/* Specialized Landing Banner */}
toast.info("بزودی: صفحه فرود تخصصی این محصول در حال آماده‌سازی است")} >

مشاهده بررسی تخصصی و نتایج درمانی

گزارش‌های علمی، ویدیوهای آموزشی و تجربیات واقعی دیگر صاحبان پت در لندینگ‌پیج اختصاصی این محصول.

ورود به آزمایشگاه علمی
{/* FAQ Section */} {product.faqs?.length > 0 && (

پاسخ به ابهامات شما

{product.faqs.map((faq, i) => (
{faq.question}
{faq.answer}
))}
)}
{/* Sticky Sidebar */}
{toPersian(product.price)}
{/* Refill Auto-Calculator */}
هوش مصنوعی تکرار خرید
{toPersian(calculation.duration)} روز
تخمین اتمام برای {toPersian(weight)} کیلوگرم
{toPersian(calculation.dailyDose)}
دوز روزانه ({calculation.unit === 'g' ? 'گرم' : calculation.unit})
{/* Manual Calculator (Mini) */}
وزن پت (کیلوگرم) {toPersian(weight)}
setWeight(parseInt(e.target.value))} className="w-full h-1.5 bg-medical-gray-200 rounded-lg appearance-none cursor-pointer accent-canina-blue" />
{/* Quantity Selector - 40% Width */}
{toPersian(itemQuantity)}
{/* Add to Cart Button - 60% Width */}
ضمانت اصالت محصول (Made in Germany)
آماده ارسال (تحویل حداکثر ۴۸ ساعت)
{/* expected results box */} {product.expectedResults?.length > 0 && (

تغییرات قابل انتظار

{product.expectedResults.map((res, i) => { const Icon = ICON_MAP[res.icon] || Sparkles; return (
{res.text}
); })}
)}
{/* Smart Cross-sell: Recommended Combinations */} {product.relatedProducts && product.relatedProducts.length > 0 && (
فرمولاسیون ترکیبی هم‌افزا (Synergy Blend)

اثربخشی دوبرابر با ترکیب هوشمند

{product.relatedProducts.map(relId => { const relProduct = allProducts.find(p => p.id === relId); if (!relProduct) return null; return ( router.push(`/shop/${relProduct.id}`)} >

{relProduct.name}

{relProduct.description}

{relProduct.price}
مشاهده محصول مکمل
); })}
)}
{/* Refill Automation Popup */} {showRefillModal && (
setShowRefillModal(false)} className="absolute inset-0 bg-medical-gray-900/60 backdrop-blur-md" />

سیستم یادآوری هوشمند

بر اساس وزن {toPersian(weight)} کیلوگرمی {activePet ? `برای ${activePet.name}` : 'سگ شما'}، این بسته {toPersian(product.packageSize)} تایی دقیقاً {toPersian(calculation.duration)} روز دیگر تمام می‌شود.

آیا مایلید سیستم ۵ روز قبل از اتمام، به شما پیامک یادآوری ارسال کند؟
)}
); }