import React, { useState } from 'react'; import { use3DTilt } from '../hooks/use3DTilt'; interface CardImageDisplayProps { card: { id: string; name: string; game: string; stock_image_url?: string; image_url?: string; rarity: string; }; userImages?: string[]; size?: 'small' | 'medium' | 'large'; showUserPhotos?: boolean; className?: string; } const CardImageDisplay: React.FC = ({ card, userImages = [], size = 'medium', showUserPhotos: initialShowUserPhotos = false, className = '' }) => { const [imageError, setImageError] = useState(false); const [currentUserImageIndex, setCurrentUserImageIndex] = useState(0); const [showUserPhotos, setShowUserPhotos] = useState(initialShowUserPhotos); // 3D Tilt effect (no scaling - main container handles expansion) const { ref: tiltRef, tiltStyles } = use3DTilt({ maxTilt: size === 'large' ? 15 : 10, scale: 1.0, // No image scaling - main container expands speed: 400, easing: 'cubic-bezier(0.23, 1, 0.320, 1)' }); // Determine which image to show const getDisplayImage = () => { if (showUserPhotos && userImages.length > 0) { return userImages[currentUserImageIndex]; } return card.stock_image_url || card.image_url; }; // Determine if card should have foil effects const isFoilCard = () => { const foilRarities = ['super rare', 'legendary', 'mythic']; return foilRarities.includes(card.rarity.toLowerCase()); }; // Get rarity border class const getRarityBorderClass = () => { const rarity = card.rarity.toLowerCase().replace(/\s+/g, ''); return `rarity-border-${rarity}`; }; // Size classes const sizeClasses = { small: 'w-16 h-22', medium: 'w-24 h-32', large: 'w-48 h-64' }; // Placeholder based on game const getPlaceholder = () => { const gameColors = { MTG: 'from-orange-400 to-red-500', POKEMON: 'from-yellow-400 to-red-500', LORCANA: 'from-purple-400 to-pink-500' }; const gradientClass = gameColors[card.game as keyof typeof gameColors] || 'from-gray-400 to-gray-600'; const rarityBorderClass = getRarityBorderClass(); const foilClass = isFoilCard() ? 'foil-rainbow' : ''; return (
🃏
{card.name.split(' ').slice(0, 2).join(' ')}
{card.game}
); }; const displayImage = getDisplayImage(); if (!displayImage || imageError) { return getPlaceholder(); } const rarityBorderClass = getRarityBorderClass(); const foilClass = isFoilCard() ? 'foil-card' : ''; const legendaryHoloClass = card.rarity.toLowerCase() === 'legendary' || card.rarity.toLowerCase() === 'mythic' ? 'holographic' : ''; return (
{card.name} setImageError(true)} />
{/* User photo indicator */} {showUserPhotos && userImages.length > 0 && (
📸 {currentUserImageIndex + 1}/{userImages.length}
)} {/* Stock/User toggle */} {userImages.length > 0 && (
)} {/* User photo navigation */} {showUserPhotos && userImages.length > 1 && (
)} {/* Image type indicator */}
{showUserPhotos ? ( 👤 ) : ( )}
); }; export default CardImageDisplay;