import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { cardService } from '../services/api'; import CardImageDisplay from '../components/CardImageDisplay'; import GlowingCard from '../components/GlowingCard'; interface Card { id: number; name: string; set_name: string; set_code: string; card_number: string; rarity: string; game: string; mana_cost?: string; cmc?: number; card_type: string; colors?: string[]; oracle_text?: string; power?: string; toughness?: string; current_price?: number; market_price?: number; verified: boolean; stock_image_url?: string; image_url?: string; artwork_crop_coords?: { x: number; y: number; width: number; height: number; }; } const Cards: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const [selectedGame, setSelectedGame] = useState(''); const [selectedRarity, setSelectedRarity] = useState(''); const [viewMode, setViewMode] = useState<'card' | 'table'>('card'); const { data: cards = [], isLoading, error } = useQuery({ queryKey: ['cards', selectedGame, searchTerm], queryFn: () => cardService.getAllCards({ game: selectedGame || undefined, search: searchTerm || undefined }), }); // Filter cards based on rarity (client-side for now) const filteredCards = cards.filter((card: Card) => { if (selectedRarity && card.rarity !== selectedRarity) { return false; } return true; }); const getGameBadgeColor = (game: string) => { switch (game) { case 'MTG': return 'bg-orange-100 text-orange-800'; case 'POKEMON': return 'bg-yellow-100 text-yellow-800'; case 'LORCANA': return 'bg-purple-100 text-purple-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getRarityBadgeColor = (rarity: string) => { switch (rarity.toLowerCase()) { case 'common': return 'bg-gray-100 text-gray-800'; case 'uncommon': return 'bg-green-100 text-green-800'; case 'rare': return 'bg-blue-100 text-blue-800'; case 'super rare': return 'bg-purple-100 text-purple-800'; case 'legendary': return 'bg-yellow-100 text-yellow-800'; case 'mythic': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getRarityColor = (rarity: string) => { switch (rarity.toLowerCase()) { case 'common': return '#6B7280'; case 'uncommon': return '#22C55E'; case 'rare': return '#3B82F6'; case 'super rare': return '#9333EA'; case 'legendary': return '#F59E0B'; case 'mythic': return '#EF4444'; default: return '#6B7280'; } }; return (

Cards Database

Browse and search all trading cards - {filteredCards.length} cards found

{/* View Toggle */}
{/* Search and Filter Bar */}
setSearchTerm(e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500" />
{/* Loading State */} {isLoading && (

Loading cards...

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

Error loading cards. Please try again.

)} {/* Cards Grid */} {!isLoading && !error && ( <> {filteredCards.length === 0 ? (
πŸƒ

No cards found

Try adjusting your search filters or add some cards to your collection

) : viewMode === 'card' ? ( /* Card View */
{filteredCards.map((card: Card) => ( {/* Card Image */}
{/* 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)} )}
))}
) : ( /* Table View */
{filteredCards.map((card: Card) => ( ))}
Card Type Cost P/T Rarity Price Actions
{card.name}
{card.set_name}
{card.game}
{card.card_type} {card.mana_cost || 'β€”'} {(card.power && card.toughness) ? `${card.power}/${card.toughness}` : 'β€”'} {card.rarity} {card.current_price ? `$${card.current_price.toFixed(2)}` : 'β€”'}
)} )}
); }; export default Cards;