import React, { useState } from 'react'; import { View, Text, TextInput, ScrollView, Pressable, ActivityIndicator, KeyboardAvoidingView, Platform, } from 'react-native'; import { Icon } from '../ui/Icon'; import { Card } from '../ui/Card'; import { Button } from '../ui/Button'; import { useAIStore } from '../../store/aiStore'; import { GeneratedCard, GenerationOptions } from '../../utils/supabaseAIService'; import { AudioRecorder } from './AudioRecorder'; import { ImageCardCreator } from './ImageCardCreator'; interface SmartCardCreatorProps { deckId: string; onCardsCreated?: (cards: GeneratedCard[]) => void; } export const SmartCardCreator: React.FC = ({ deckId, onCardsCreated }) => { const { isGenerating, generatedCards, error, generateCardsFromText, clearGeneratedCards, saveGeneratedCards, } = useAIStore(); const [inputMode, setInputMode] = useState<'text' | 'voice' | 'image'>('text'); const [textInput, setTextInput] = useState(''); const [options, setOptions] = useState({ cardTypes: ['flashcard', 'quiz'], difficulty: 'medium', count: 5, language: 'de', }); const [selectedCards, setSelectedCards] = useState>(new Set()); const handleGenerateFromText = async () => { if (!textInput.trim()) return; try { const cards = await generateCardsFromText(textInput, options); if (onCardsCreated) { onCardsCreated(cards); } } catch (error) { console.error('Error generating cards:', error); } }; const handleSaveSelectedCards = async () => { const cardsToSave = generatedCards.filter((_, index) => selectedCards.has(index)); if (cardsToSave.length === 0) return; try { await saveGeneratedCards(deckId, cardsToSave); clearGeneratedCards(); setSelectedCards(new Set()); if (onCardsCreated) { onCardsCreated(cardsToSave); } } catch (error) { console.error('Error saving cards:', error); } }; const toggleCardSelection = (index: number) => { const newSelection = new Set(selectedCards); if (newSelection.has(index)) { newSelection.delete(index); } else { newSelection.add(index); } setSelectedCards(newSelection); }; const selectAllCards = () => { if (selectedCards.size === generatedCards.length) { setSelectedCards(new Set()); } else { setSelectedCards(new Set(generatedCards.map((_, i) => i))); } }; const renderGeneratedCard = (card: GeneratedCard, index: number) => { const isSelected = selectedCards.has(index); return ( toggleCardSelection(index)} className="mb-3" style={({ pressed }) => pressed && { opacity: 0.7 }}> {card.type.toUpperCase()} {Math.round(card.metadata.confidence * 100)}% Konfidenz {card.type === 'flashcard' && card.content && 'front' in card.content && ( <> {card.content.front} {card.content.back} )} {card.type === 'quiz' && card.content && 'question' in card.content && ( <> {card.content.question} {card.content.options.map((option: string, i: number) => ( {i + 1}. {option} ))} )} {card.type === 'text' && card.content && 'text' in card.content && ( {card.content.text} )} ); }; return ( {/* Input Mode Selector */} {[ { key: 'text', label: 'Text', icon: 'text' }, { key: 'voice', label: 'Sprache', icon: 'mic' }, { key: 'image', label: 'Bild', icon: 'image' }, ].map((mode) => ( setInputMode(mode.key as any)} className={`flex-1 flex-row items-center justify-center rounded-lg border p-3 ${ inputMode === mode.key ? 'border-blue-500 bg-blue-50' : 'border-gray-200 bg-white' }`} style={({ pressed }) => pressed && { opacity: 0.7 }}> {mode.label} ))} {/* Input Area */} {inputMode === 'text' && ( Gib deinen Lerninhalt ein )} {inputMode === 'voice' && ( { setTextInput(text); setInputMode('text'); }} /> )} {inputMode === 'image' && ( { // Add to generated cards if (onCardsCreated) { onCardsCreated(cards); } }} /> )} {/* Generation Options */} {inputMode === 'text' && ( Optionen {/* Card Types */} Kartentypen {(['flashcard', 'quiz', 'text'] as const).map((type) => ( { const types = options.cardTypes || []; if (types.includes(type)) { setOptions({ ...options, cardTypes: types.filter((t) => t !== type), }); } else { setOptions({ ...options, cardTypes: [...types, type], }); } }} className={`mb-2 mr-2 rounded-full border px-3 py-1 ${ options.cardTypes?.includes(type) ? 'border-blue-500 bg-blue-50' : 'border-gray-300 bg-white' }`} style={({ pressed }) => pressed && { opacity: 0.7 }}> {type === 'flashcard' ? 'Karteikarte' : type === 'quiz' ? 'Quiz' : 'Text'} ))} {/* Difficulty */} Schwierigkeit {(['easy', 'medium', 'hard'] as const).map((level) => ( setOptions({ ...options, difficulty: level })} className={`flex-1 rounded-lg border p-2 ${ options.difficulty === level ? 'border-blue-500 bg-blue-50' : 'border-gray-300 bg-white' }`} style={({ pressed }) => pressed && { opacity: 0.7 }}> {level === 'easy' ? 'Einfach' : level === 'medium' ? 'Mittel' : 'Schwer'} ))} {/* Count */} Anzahl Karten: {options.count} setOptions({ ...options, count: Math.max(1, (options.count || 5) - 1) }) } className="rounded-lg bg-gray-200 p-2" style={({ pressed }) => pressed && { opacity: 0.7 }}> {options.count} setOptions({ ...options, count: Math.min(20, (options.count || 5) + 1) }) } className="rounded-lg bg-gray-200 p-2" style={({ pressed }) => pressed && { opacity: 0.7 }}> )} {/* Generate Button */} {inputMode === 'text' && textInput.trim() && ( )} {/* Error Display */} {error && ( {error} )} {/* Generated Cards */} {generatedCards.length > 0 && ( Generierte Karten ({selectedCards.size}/{generatedCards.length}) pressed && { opacity: 0.7 }}> {selectedCards.size === generatedCards.length ? 'Keine auswählen' : 'Alle auswählen'} {generatedCards.map((card, index) => renderGeneratedCard(card, index))} {selectedCards.size > 0 && ( )} )} ); };