import React, { useState, useEffect } from 'react'; import { View, ScrollView, ActivityIndicator, Alert } from 'react-native'; import { useTheme } from '~/features/theme/ThemeProvider'; import { getTheme } from '~/features/theme/constants'; import { useTranslation } from 'react-i18next'; import BaseModal from '~/components/atoms/BaseModal'; import Text from '~/components/atoms/Text'; import PromptPreview from '~/components/molecules/PromptPreview'; import LoadingOverlay from '~/components/atoms/LoadingOverlay'; import { getAuthenticatedClient } from '~/features/auth/lib/supabaseClient'; import { creditService } from '~/features/credits/creditService'; import ManaIcon from '~/features/subscription/ManaIcon'; interface Prompt { id: string; memory_title: Record; description: Record; prompt_text: Record; created_at: string; updated_at: string; is_public?: boolean; } interface CreateMemoryModalProps { visible: boolean; onClose: () => void; memoId: string; onMemoryCreated: () => void; } /** * Modal zum Erstellen einer neuen Memory durch Auswahl eines Prompts */ const CreateMemoryModal: React.FC = ({ visible, onClose, memoId, onMemoryCreated }) => { const { isDark, themeVariant, colorScheme } = useTheme(); const theme = getTheme(colorScheme, themeVariant); const { t } = useTranslation(); const [prompts, setPrompts] = useState([]); const [selectedPromptId, setSelectedPromptId] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isCreating, setIsCreating] = useState(false); // Prompts laden wenn Modal geöffnet wird useEffect(() => { if (visible) { loadPrompts(); } }, [visible]); const loadPrompts = async () => { try { setIsLoading(true); const supabase = await getAuthenticatedClient(); const { data, error } = await supabase .from('prompts') .select('*') .eq('is_public', true) .order('memory_title->de', { ascending: true }); if (error) { console.error('Fehler beim Laden der Prompts:', error); Alert.alert(t('memo.error', 'Fehler'), t('memo.prompts_load_error', 'Prompts konnten nicht geladen werden.')); return; } setPrompts(data || []); } catch (error) { console.error('Fehler beim Laden der Prompts:', error); Alert.alert(t('memo.error', 'Fehler'), t('memo.unexpected_error', 'Ein unerwarteter Fehler ist aufgetreten.')); } finally { setIsLoading(false); } }; const handleCreateMemory = async () => { if (!selectedPromptId) { Alert.alert(t('memo.note', 'Hinweis'), t('memo.please_select_prompt', 'Bitte wählen Sie einen Prompt aus.')); return; } try { setIsCreating(true); // Call the Supabase Edge Function directly const supabase = await getAuthenticatedClient(); const { data, error } = await supabase.functions.invoke('create-memory', { body: { memo_id: memoId, prompt_id: selectedPromptId } }); if (error) { console.error('Edge Function error:', error); throw new Error(error.message || t('memo.memory_creation_error', 'Unbekannter Fehler bei der Memory-Erstellung')); } if (data?.success && data?.memory_id) { // Notify credit system about consumption if provided if (data.creditsConsumed) { creditService.triggerCreditUpdate(data.creditsConsumed); } // Close modal and notify parent onClose(); onMemoryCreated(); } else { throw new Error(data?.error || t('memo.memory_creation_error', 'Unbekannter Fehler bei der Memory-Erstellung')); } } catch (error) { console.error('Fehler bei der Memory-Erstellung:', error); // Don't check for insufficient credits - let the global interceptor handle 402 errors Alert.alert(t('memo.error', 'Fehler'), t('memo.memory_creation_error', 'Bei der Erstellung der Memory ist ein Fehler aufgetreten.')); } finally { setIsCreating(false); } }; // Zeige alle Prompts in einer Liste (keine Kategorien) const allPrompts = prompts; return ( {isLoading ? ( {t('memo.prompts_loading', 'Prompts werden geladen...')} ) : ( <> {allPrompts.map((prompt) => ( setSelectedPromptId(prompt.id)} isSelected={selectedPromptId === prompt.id} disableContextMenu={true} /> ))} {prompts.length === 0 && !isLoading && ( {t('memo.no_prompts_available', 'Keine Prompts verfügbar')} )} {/* Mana Cost Display */} {selectedPromptId && ( {creditService.getOperationCostSync('CREATE_MEMORY')} Mana )} )} {/* Central Loading Overlay */} ); }; export default CreateMemoryModal;