import React, { useState, useEffect } from 'react'; import { View, StyleSheet, Pressable, ActivityIndicator } from 'react-native'; import { useTranslation } from 'react-i18next'; import { useTheme } from '~/features/theme/ThemeProvider'; import { useRouter } from 'expo-router'; import Text from '~/components/atoms/Text'; import Icon from '~/components/atoms/Icon'; import { getAuthenticatedClient } from '~/features/auth/lib/supabaseClient'; import colors from '~/tailwind.config.js'; interface TranslationLinksProps { memoId: string; memoMetadata?: any; } interface TranslationInfo { memo_id: string; target_language: string; translated_at: string; translator_model?: string; } interface OriginalInfo { source_memo_id: string; source_language: string; target_language: string; translated_at: string; } // Sprach-Mapping für bessere Anzeige const LANGUAGE_NAMES: Record = { 'de': 'Deutsch', 'en': 'English', 'es': 'Español', 'fr': 'Français', 'it': 'Italiano', 'pt': 'Português', 'nl': 'Nederlands', 'pl': 'Polski', 'ru': 'Русский', 'ja': '日本語', 'ko': '한국어', 'zh': '中文', 'ar': 'العربية', 'hi': 'हिन्दी', 'tr': 'Türkçe', 'sv': 'Svenska', 'da': 'Dansk', 'no': 'Norsk', 'fi': 'Suomi', 'cs': 'Čeština', 'sk': 'Slovenčina', 'hu': 'Magyar', 'ro': 'Română', 'bg': 'Български', 'hr': 'Hrvatski', 'sr': 'Српски', 'sl': 'Slovenščina', 'et': 'Eesti', 'lv': 'Latviešu', 'lt': 'Lietuvių', 'mt': 'Malti', 'ga': 'Gaeilge', 'el': 'Ελληνικά', 'uk': 'Українська', 'bn': 'বাংলা', 'ur': 'اردو', 'fa': 'فارسی', 'vi': 'Tiếng Việt', 'id': 'Bahasa Indonesia' }; const LANGUAGE_FLAGS: Record = { 'de': '🇩🇪', 'en': '🇺🇸', 'es': '🇪🇸', 'fr': '🇫🇷', 'it': '🇮🇹', 'pt': '🇵🇹', 'nl': '🇳🇱', 'pl': '🇵🇱', 'ru': '🇷🇺', 'ja': '🇯🇵', 'ko': '🇰🇷', 'zh': '🇨🇳', 'ar': '🇸🇦', 'hi': '🇮🇳', 'tr': '🇹🇷', 'sv': '🇸🇪', 'da': '🇩🇰', 'no': '🇳🇴', 'fi': '🇫🇮', 'cs': '🇨🇿', 'sk': '🇸🇰', 'hu': '🇭🇺', 'ro': '🇷🇴', 'bg': '🇧🇬', 'hr': '🇭🇷', 'sr': '🇷🇸', 'sl': '🇸🇮', 'et': '🇪🇪', 'lv': '🇱🇻', 'lt': '🇱🇹', 'mt': '🇲🇹', 'ga': '🇮🇪', 'el': '🇬🇷', 'uk': '🇺🇦', 'bn': '🇧🇩', 'ur': '🇵🇰', 'fa': '🇮🇷', 'vi': '🇻🇳', 'id': '🇮🇩' }; /** * Komponente zur Anzeige von Übersetzungsverknüpfungen * Zeigt Links zum Original-Memo und zu verfügbaren Übersetzungen */ const TranslationLinks: React.FC = ({ memoId, memoMetadata }) => { const { isDark, themeVariant } = useTheme(); const { t } = useTranslation(); const router = useRouter(); const [originalMemoTitle, setOriginalMemoTitle] = useState(''); const [loadingOriginal, setLoadingOriginal] = useState(false); // Prüfe ob das aktuelle Memo eine Übersetzung ist const translationInfo: OriginalInfo | null = memoMetadata?.translation || null; const isTranslation = !!translationInfo; // Hole verfügbare Übersetzungen (wenn das aktuelle Memo das Original ist) const availableTranslations: TranslationInfo[] = memoMetadata?.translations || []; // Lade den Titel des Original-Memos useEffect(() => { const loadOriginalTitle = async () => { if (!isTranslation || !translationInfo?.source_memo_id) return; setLoadingOriginal(true); try { const supabase = await getAuthenticatedClient(); const { data: originalMemo, error } = await supabase .from('memos') .select('title') .eq('id', translationInfo.source_memo_id) .single(); if (!error && originalMemo) { setOriginalMemoTitle(originalMemo.title || t('memo.untitled', 'Ohne Titel')); } } catch (error) { console.debug('Error loading original memo title:', error); } finally { setLoadingOriginal(false); } }; loadOriginalTitle(); }, [isTranslation, translationInfo?.source_memo_id, t]); // Helper function to get language display name const getLanguageDisplay = (langCode: string) => { const flag = LANGUAGE_FLAGS[langCode] || '🌐'; const name = LANGUAGE_NAMES[langCode] || langCode; return `${flag} ${name}`; }; // Handler für Navigation zum Original const handleNavigateToOriginal = () => { if (translationInfo?.source_memo_id) { router.push(`/(protected)/(memo)/${translationInfo.source_memo_id}`); } }; // Handler für Navigation zu Übersetzung const handleNavigateToTranslation = (translationMemoId: string) => { router.push(`/(protected)/(memo)/${translationMemoId}`); }; // Primärfarbe für Links const primaryColor = isDark ? ((colors as any).theme?.extend?.colors?.dark)?.[themeVariant]?.primary || '#f8d62b' : ((colors as any).theme?.extend?.colors)?.[themeVariant]?.primary || '#f8d62b'; // Styles const styles = StyleSheet.create({ container: { backgroundColor: isDark ? 'rgba(255, 255, 255, 0.05)' : 'rgba(0, 0, 0, 0.05)', borderRadius: 12, padding: 16, marginBottom: 16, }, header: { flexDirection: 'row', alignItems: 'center', marginBottom: 12, }, headerText: { fontSize: 16, fontWeight: '600', color: isDark ? '#FFFFFF' : '#000000', }, linkContainer: { flexDirection: 'row', alignItems: 'center', paddingVertical: 8, paddingHorizontal: 12, backgroundColor: isDark ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.05)', borderRadius: 8, marginBottom: 8, }, linkText: { flex: 1, fontSize: 14, color: isDark ? '#FFFFFF' : '#000000', }, linkSubtext: { fontSize: 12, color: isDark ? 'rgba(255, 255, 255, 0.6)' : 'rgba(0, 0, 0, 0.6)', marginTop: 2, }, chevronIcon: { marginLeft: 8, }, divider: { height: 1, backgroundColor: isDark ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)', marginVertical: 8, }, }); // Wenn weder Original noch Übersetzungen vorhanden sind, nichts anzeigen if (!isTranslation && availableTranslations.length === 0) { return null; } return ( {/* Header */} {t('memo.translations', 'Übersetzungen')} {/* Link zum Original (wenn das aktuelle Memo eine Übersetzung ist) */} {isTranslation && translationInfo && ( {loadingOriginal ? ( ) : ( `${t('memo.original_memo', 'Original')}: ${LANGUAGE_FLAGS[translationInfo.source_language] || '🌐'} ${originalMemoTitle}` )} )} {/* Trennlinie wenn beide Bereiche vorhanden sind */} {isTranslation && availableTranslations.length > 0 && ( )} {/* Links zu verfügbaren Übersetzungen */} {availableTranslations.map((translation, index) => ( handleNavigateToTranslation(translation.memo_id)} > {t('memo.translation_to', 'Übersetzung in')} {LANGUAGE_FLAGS[translation.target_language] || '🌐'} {LANGUAGE_NAMES[translation.target_language] || translation.target_language} ))} ); }; export default TranslationLinks;