"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 (

{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}
${parseFloat(product.price).toFixed(2)}
))}
)}
);
};