'use client'; import { useState, useEffect, useMemo, useCallback } from 'react'; import { createClientTokenManager } from '@/services/auth'; import { ApiClient } from '@/api-client/ApiClient'; import { Button, Group, Modal, Stack, Text } from '@mantine/core'; import { CollectionSelector } from './CollectionSelector'; interface Collection { id: string; name: string; description?: string; cardCount: number; authorId: string; } interface AddToCollectionModalProps { cardId: string; isOpen: boolean; onClose: () => void; onSuccess?: () => void; } export function AddToCollectionModal({ cardId, isOpen, onClose, onSuccess, }: AddToCollectionModalProps) { const [selectedCollectionIds, setSelectedCollectionIds] = useState( [], ); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const [card, setCard] = useState(null); const [loading, setLoading] = useState(false); // Create API client instance const apiClient = new ApiClient( process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000', createClientTokenManager(), ); // Get existing collections for this card const existingCollections = useMemo(() => { if (!card) return []; return card.collections || []; }, [card]); const fetchCard = useCallback(async () => { // Create API client instance const apiClient = new ApiClient( process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000', createClientTokenManager(), ); try { setLoading(true); setError(''); const response = await apiClient.getUrlCardView(cardId); setCard(response); } catch (error: any) { console.error('Error fetching card:', error); setError(error.message || 'Failed to load card details'); } finally { setLoading(false); } }, [cardId]); useEffect(() => { if (isOpen) { fetchCard(); } }, [isOpen, cardId, fetchCard]); const handleSubmit = async () => { if (selectedCollectionIds.length === 0) { setError('Please select at least one collection'); return; } setSubmitting(true); setError(''); try { // Create API client instance const apiClient = new ApiClient( process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000', createClientTokenManager(), ); // Add card to all selected collections in a single request await apiClient.addCardToCollection({ cardId, collectionIds: selectedCollectionIds, }); // Success onSuccess?.(); onClose(); setSelectedCollectionIds([]); } catch (error: any) { console.error('Error adding card to collections:', error); setError(error.message || 'Failed to add card to collections'); } finally { setSubmitting(false); } }; const handleClose = () => { if (!submitting) { onClose(); setSelectedCollectionIds([]); setError(''); } }; if (!isOpen) return null; return ( {loading ? ( Loading card details... ) : error ? ( {error} ) : ( <> {error && ( {error} )} )} ); }