"use client"; /* eslint-disable @next/next/no-img-element */ import { motion, PanInfo, useMotionValue, useTransform } from "framer-motion"; import { Badge } from "./ui/badge"; import { Heart, Star, X } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { Button } from "./ui/button"; import { Card, CardContent } from "./ui/card"; interface ShoppingProduct { id: string | number; title: string; price: string; originalPrice?: string; currency: string; image: string; link: string; source: string; rating?: string | null; reviewCount?: string | null; delivery: string; } interface CardRotateProps { children: React.ReactNode; onSendToBack: () => void; onSwipe?: (direction: 'left' | 'right') => void; } function CardRotate({ children, onSendToBack, onSwipe }: CardRotateProps) { const x = useMotionValue(0); const y = useMotionValue(0); // Reduced rotation values for more subtle effect const rotateX = useTransform(y, [-100, 100], [15, -15]); const rotateY = useTransform(x, [-100, 100], [-15, 15]); function handleDragEnd(_: any, info: PanInfo) { const threshold = 100; if (Math.abs(info.offset.x) > threshold) { onSendToBack(); if (onSwipe) { onSwipe(info.offset.x > 0 ? 'right' : 'left'); } } else { x.set(0); y.set(0); } } return ( {children} ); } const ProductCard = ({ product }: { product: ShoppingProduct }) => { const formattedPrice = parseFloat(product.price).toFixed(2); const formattedOriginalPrice = product.originalPrice ? parseFloat(product.originalPrice).toFixed(2) : null; const discount = formattedOriginalPrice ? Math.round(((parseFloat(formattedOriginalPrice) - parseFloat(formattedPrice)) / parseFloat(formattedOriginalPrice)) * 100) : null; return (
{product.title} {discount && discount > 0 && ( {discount}% OFF )}

{product.title}

${formattedPrice} {formattedOriginalPrice && ( ${formattedOriginalPrice} )}
{product.rating && ( <> {product.rating} {product.reviewCount && `(${product.reviewCount})`} )}
{product.source}
); }; export const SwipeableProductStack = ({ products }: { products: ShoppingProduct[] }) => { const [cards, setCards] = useState(products); const [savedProducts, setSavedProducts] = useState([]); const sendToBack = (id: string | number, direction?: 'left' | 'right') => { setCards((prev) => { const newCards = [...prev]; const index = newCards.findIndex((card) => card.id === id); const [card] = newCards.splice(index, 1); if (direction === 'right') { setSavedProducts(prev => [...prev, card]); toast.success('Product saved!'); } newCards.unshift(card); return newCards; }); }; return (
{cards.map((product, index) => ( sendToBack(product.id)} onSwipe={(direction) => sendToBack(product.id, direction)} > ))}
{savedProducts.length > 0 && (

Saved Products ({savedProducts.length})

{savedProducts.map((product) => ( {product.title}
{product.title}
${parseFloat(product.price).toFixed(2)}
))}
)}
); };