import { ShoppingCart, Trash } from 'iconsax-react' import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" import { useGetCart, useUpdateCart } from '@/app/cart/hooks/useCartData' import { useRemoveFromCart } from '@/app/cart/hooks/useCartData' import { CartItemType } from '@/app/cart/types/Types' import { LocalCartItem } from '@/app/product/store/LocalCartStore' // Union type for all possible cart items type CartItem = CartItemType | EnrichedOfflineCartItem import { NumberFormat } from '@/config/func' import Image from 'next/image' import Link from 'next/link' import { Button } from '@/components/ui/button' import { useSharedStore } from '@/share/store/sharedStore' import { useLocalCart } from '@/app/product/hooks/useLocalCart' import { useOfflineCartProducts, EnrichedOfflineCartItem } from '@/share/hooks/useOfflineCartProducts' import { useEffect, useRef } from 'react' const Cart = () => { const { isLogin } = useSharedStore() const { data: cartData, isLoading } = useGetCart() const removeFromCartMutation = useRemoveFromCart() const updateCartMutation = useUpdateCart() // Local cart hooks for offline users const { localCartItems, removeFromLocalCart, getLocalCartItemsCount, clearLocalCart } = useLocalCart() // Track previous login state to detect login events const prevIsLoginRef = useRef(isLogin) // Get enriched product data for offline cart items const { enrichedCartItems, isLoading: isLoadingOfflineProducts } = useOfflineCartProducts(localCartItems) // Sync local cart to server when user logs in useEffect(() => { const prevIsLogin = prevIsLoginRef.current prevIsLoginRef.current = isLogin // Check if user just logged in and has local cart items if (!prevIsLogin && isLogin && localCartItems.length > 0) { // Add each local cart item to server cart const syncPromises = localCartItems.map(async (item) => { try { await updateCartMutation.mutateAsync({ productId: item.productId, variantId: item.variantId, quantity: item.quantity }) } catch (error) { console.error('Failed to sync cart item:', item, error) } }) // Clear local cart after sync attempt Promise.all(syncPromises).finally(() => { clearLocalCart() }) } }, [isLogin, localCartItems, updateCartMutation, clearLocalCart]) const handleRemoveItem = async (productId: number, variantId: string) => { if (isLogin) { await removeFromCartMutation.mutateAsync({ productId, variantId }) } else { removeFromLocalCart(productId, variantId) } } // Get cart data based on login status const cart = cartData?.results?.cart const onlineItems = cart?.items || [] const onlineItemsCount = cart?.items_count || 0 // Use appropriate data based on login status const items = isLogin ? onlineItems : enrichedCartItems const itemsCount = isLogin ? onlineItemsCount : getLocalCartItemsCount() const isItemsLoading = isLogin ? isLoading : isLoadingOfflineProducts return (
{itemsCount > 0 && (
{itemsCount}
)}
{/* Header */} { itemsCount > 0 && (
{itemsCount} کالا در سبد خرید شما ثبت شده
) } {/* Cart Items */}
{isItemsLoading ? (
در حال بارگذاری...
) : items.length > 0 ? ( items.slice(0, 3).map((item: CartItem, index: number) => ( handleRemoveItem( isLogin ? (item as CartItemType).product._id : (item as LocalCartItem).productId, isLogin ? (item as CartItemType).variant._id : (item as LocalCartItem).variantId )} /> )) ) : (
{!isLogin ? 'سبد خرید شما خالی است' : 'سبد خرید شما خالی است'}
{!isLogin && (
آیتم‌های اضافه شده به سبد خرید در مرورگر شما ذخیره می‌شوند
)}
)}
{/* View Cart Button */} {itemsCount > 0 && isLogin && ( )} {/* Login encouragement message for offline users */} {!isLogin && (
برای ذخیره سبد خرید و همگام‌سازی در همه دستگاه‌ها، وارد حساب کاربری شوید
)}
) } // Cart Item Card Component const CartItemCard = ({ item, isOnline, onRemove }: { item: CartItem, isOnline: boolean, onRemove: () => void }) => { // Handle both online and offline items with enriched data const productTitle = isOnline ? (item as CartItemType).product.title_fa : (item as EnrichedOfflineCartItem).product?.title_fa || 'در حال بارگذاری محصول...' const productImage = isOnline ? (item as CartItemType).product.imagesUrl.cover : (item as EnrichedOfflineCartItem).product?.imagesUrl?.cover || '/images/logo.png' const productCategory = isOnline ? ((item as CartItemType).product.category?._id || 'دسته‌بندی') : ((item as EnrichedOfflineCartItem).product?.category?._id || 'دسته‌بندی') const productPrice = isOnline ? (item as CartItemType).variant.price.selling_price : (item as EnrichedOfflineCartItem).variant?.price?.selling_price || 0 const quantity = isOnline ? (item as CartItemType).quantity : (item as LocalCartItem).quantity // Check if product data is still loading for offline items const isProductLoading = !isOnline && !(item as EnrichedOfflineCartItem).product const hasError = !isOnline && !isProductLoading && !(item as EnrichedOfflineCartItem).variant return (
{/* Product Image */}
{productTitle}
{/* Product Details */}
{productCategory}
{hasError ? 'خطا در بارگذاری محصول' : isProductLoading ? 'در حال بارگذاری محصول...' : productTitle}
{hasError ? ( `${quantity} عدد` ) : isProductLoading ? ( 'در حال بارگذاری...' ) : ( `${NumberFormat(productPrice)} تومان` )}
) } export default Cart