diff --git a/pages/collection/[identifier].js b/pages/collection/[identifier].js index cbb1d3f..e088526 100644 --- a/pages/collection/[identifier].js +++ b/pages/collection/[identifier].js @@ -4,6 +4,7 @@ import Link from 'next/link'; import UploadImageModal from '../../components/UploadImageModal'; import ShareModal from '../../components/ShareModal'; import CollaboratorFacepile from '../../components/CollaboratorFacepile'; +import CardItem from '../../components/CardItem'; import Layout from '../../components/Layout'; import { useAuth } from '../../lib/use-auth'; @@ -43,9 +44,14 @@ export default function CollectionView() { const [showSearchResults, setShowSearchResults] = useState(false); const [showUploadModal, setShowUploadModal] = useState(false); + // Card interaction states + const [selectedCards, setSelectedCards] = useState([]); + const [favoritedCards, setFavoritedCards] = useState(new Set()); + useEffect(() => { if (identifier && user) { fetchCollectionData(); + loadFavoritedCards(); } }, [identifier, user]); @@ -317,6 +323,83 @@ export default function CollectionView() { } }; + // Card interaction handlers + const handleToggleSelect = (card) => { + setSelectedCards(prev => { + const isSelected = prev.some(c => c.id === card.id); + if (isSelected) { + return prev.filter(c => c.id !== card.id); + } else { + return [...prev, card]; + } + }); + }; + + const handleToggleFavorite = async (card) => { + try { + const isFavorited = favoritedCards.has(card.id); + const method = isFavorited ? 'DELETE' : 'POST'; + + const response = await fetch('/api/favorites', { + method, + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` + }, + body: JSON.stringify({ + itemType: 'card', + itemId: card.id + }) + }); + + if (response.ok) { + setFavoritedCards(prev => { + const newSet = new Set(prev); + if (isFavorited) { + newSet.delete(card.id); + } else { + newSet.add(card.id); + } + return newSet; + }); + } + } catch (error) { + console.error('Error toggling favorite:', error); + } + }; + + const handleAddToCollection = (card) => { + // This would open a collection selection modal + console.log('Add to collection:', card); + }; + + const handleAddToDeck = (card) => { + // This would open a deck selection modal + console.log('Add to deck:', card); + }; + + // Load user's favorited cards + const loadFavoritedCards = async () => { + try { + const token = localStorage.getItem('auth_token'); + if (!token) return; + + const response = await fetch('/api/favorites?type=card', { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + if (response.ok) { + const data = await response.json(); + const favoriteIds = new Set(data.favorites.map(fav => parseInt(fav.item_id))); + setFavoritedCards(favoriteIds); + } + } catch (error) { + console.error('Error loading favorited cards:', error); + } + }; + const handleDownloadCSV = () => { if (cards.length === 0) { alert('No cards to download'); @@ -453,8 +536,8 @@ export default function CollectionView() { {/* Action buttons */}