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 (