import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { tcgApi } from '../services/tcgApi'; import CardSearch from '../components/cards/CardSearch'; import CardDatabaseBrowser from '../components/cards/CardDatabaseBrowser'; import CardManager from '../components/cards/CardManager'; import CardImageDisplay from '../components/CardImageDisplay'; import GlowingCard from '../components/GlowingCard'; import type { UserCard, CardFilters, Card } from '../types'; const Cards: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const [filters, setFilters] = useState({ game: '', rarity: '', status: 'all', search: '', }); const [viewMode, setViewMode] = useState<'card' | 'list'>('card'); const [showCardSearch, setShowCardSearch] = useState(false); const [showDatabaseBrowser, setShowDatabaseBrowser] = useState(false); const [editingCard, setEditingCard] = useState(null); const { data: userCards = [], isLoading, error } = useQuery({ queryKey: ['user-cards', { ...filters, search: searchTerm }], queryFn: () => tcgApi.cards.getUserCards({ ...filters, search: searchTerm }), }); // Filter cards based on current filters const filteredCards = userCards.filter((userCard: UserCard) => { const card = userCard.card; if (!card) return false; if (filters.rarity && card.rarity !== filters.rarity) return false; if (filters.game && card.game !== filters.game) return false; if (filters.status && filters.status !== 'all' && userCard.status !== filters.status) return false; return true; }); const getGameBadgeColor = (game: string) => { switch (game) { case 'MTG': return 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300'; case 'POKEMON': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300'; case 'LORCANA': return 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300'; case 'YUGIOH': return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300'; default: return 'bg-surface-100 text-surface-800 dark:bg-surface-700 dark:text-surface-300'; } }; const getRarityBadgeColor = (rarity: string) => { switch (rarity.toLowerCase()) { case 'common': return 'bg-surface-100 text-surface-800 dark:bg-surface-700 dark:text-surface-300'; case 'uncommon': return 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300'; case 'rare': return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300'; case 'super rare': return 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300'; case 'legendary': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300'; case 'mythic': return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300'; default: return 'bg-surface-100 text-surface-800 dark:bg-surface-700 dark:text-surface-300'; } }; const getStatusBadgeColor = (status: string) => { switch (status) { case 'owned': return 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300'; case 'wanted': return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300'; default: return 'bg-surface-100 text-surface-800 dark:bg-surface-700 dark:text-surface-300'; } }; const getConditionBadgeColor = (condition: string) => { switch (condition) { case 'mint': return 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-300'; case 'near_mint': return 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300'; case 'excellent': return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300'; case 'good': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300'; case 'light_played': return 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300'; case 'played': return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300'; case 'poor': return 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300'; default: return 'bg-surface-100 text-surface-800 dark:bg-surface-700 dark:text-surface-300'; } }; return (
{/* Header */}

My Cards

{filteredCards.length} cards in your collection

{/* Search and Filter Bar */}
{/* Search Bar */}
setSearchTerm(e.target.value)} placeholder="Search your cards..." className="w-full pl-10 pr-4 py-3 bg-surface-50 dark:bg-surface-700 border border-surface-300 dark:border-surface-600 rounded-xl text-surface-900 dark:text-white placeholder-surface-500 dark:placeholder-surface-400 focus:outline-none focus:ring-2 focus:ring-primary-500 transition-colors" />
{/* Filters and View Toggle */}
{/* View Toggle */}
{/* Loading State */} {isLoading && (

Loading your cards...

)} {/* Error State */} {error && (

Error loading cards. Please try again.

)} {/* Cards Display */} {!isLoading && !error && ( <> {filteredCards.length === 0 ? (

{userCards.length === 0 ? 'No cards yet' : 'No matching cards'}

{userCards.length === 0 ? 'Start building your collection by adding cards' : 'Try adjusting your search or filters' }

{userCards.length === 0 && (
)}
) : viewMode === 'card' ? ( /* Card View */
{filteredCards.map((userCard: UserCard) => { const card = userCard.card; if (!card) return null; return ( {/* Card Image */}
{/* Status Badge */}
{userCard.status === 'owned' ? '✅' : '❤️'}
{/* Quantity Badge */} {userCard.quantity > 1 && (
{userCard.quantity}x
)}
{/* Card Info */}
{/* Header */}

{card.name}

{card.set_name}

{card.game}
{/* Quick Stats */}
{card.card_type && (

{card.card_type}

)}
{card.mana_cost && ( Cost: {card.mana_cost} )} {(card.power && card.toughness) && ( {card.power}/{card.toughness} )}
{/* Footer */}
{card.rarity} {card.current_price && ( ${card.current_price.toFixed(2)} )}
{/* Condition Badge */} {userCard.condition && userCard.status === 'owned' && (
{userCard.condition.replace('_', ' ').toUpperCase()}
)} {/* Edit Button */}
); })}
) : ( /* List View */
{filteredCards.map((userCard: UserCard) => { const card = userCard.card; if (!card) return null; return (
{/* Card Image */}
{card.image_url ? ( {card.name} ) : ( )}
{/* Card Info */}

{card.name}

{card.set_name}

{card.game} {card.rarity} {userCard.status}
{/* Quantity and Price */}
{userCard.quantity}x
{card.current_price && (
${(card.current_price * userCard.quantity).toFixed(2)}
)}
{/* Edit Button */}
); })}
)} )} {/* Card Search Modal */} setShowCardSearch(false)} /> {/* Card Manager Modal */} {editingCard && ( setEditingCard(null)} cardId={editingCard} /> )} {/* Database Browser Modal */} setShowDatabaseBrowser(false)} onCardSelect={(card: Card) => { // Handle card selection from database browser console.log('Selected card from database:', card); setShowDatabaseBrowser(false); }} />
); }; export default Cards;