import React, { useState } from 'react'; import { View, Pressable, ActivityIndicator, ScrollView, Platform } from 'react-native'; import DateTimePicker from '@react-native-community/datetimepicker'; import { useTranslation } from 'react-i18next'; import { useTheme } from '~/features/theme/ThemeProvider'; import BaseModal from '~/components/atoms/BaseModal'; import BaseLanguageSelector, { LanguageItem } from '~/components/molecules/BaseLanguageSelector'; import Text from '~/components/atoms/Text'; import Icon from '~/components/atoms/Icon'; import Button from '~/components/atoms/Button'; import { useRecordingLanguage } from '~/features/audioRecordingV2'; import { createClient } from '@supabase/supabase-js'; import colors from '~/tailwind.config.js'; interface ReprocessModalProps { isVisible: boolean; onClose: () => void; onReprocess: (language?: string, blueprint?: any, recordingDate?: Date) => Promise; currentLanguage: string; isProcessing?: boolean; memo: any; // The memo object to reprocess } const ReprocessModal: React.FC = ({ isVisible, onClose, onReprocess, currentLanguage, isProcessing = false, memo, }) => { const { t } = useTranslation(); const { isDark, themeVariant } = useTheme(); const { recordingLanguages, toggleRecordingLanguage, supportedAzureLanguages } = useRecordingLanguage(); const [modalMode, setModalMode] = useState< 'reprocess' | 'language' | 'blueprint' | 'date' | 'time' >('reprocess'); const [blueprints, setBlueprints] = useState([]); const [blueprintsLoading, setBlueprintsLoading] = useState(false); const [selectedBlueprintForReprocess, setSelectedBlueprintForReprocess] = useState(null); const [selectedLanguageForReprocess, setSelectedLanguageForReprocess] = useState('auto'); const [selectedDateTime, setSelectedDateTime] = useState(new Date()); const [showDatePicker, setShowDatePicker] = useState(false); const [showTimePicker, setShowTimePicker] = useState(false); const [hasCustomTime, setHasCustomTime] = useState(false); // Initialize values from memo when modal opens React.useEffect(() => { if (isVisible && memo) { // Set initial language from memo metadata const memoLanguage = memo.metadata?.language || 'auto'; setSelectedLanguageForReprocess(memoLanguage); // Set initial date/time from memo const recordingDate = memo.metadata?.recordingStartedAt ? new Date(memo.metadata.recordingStartedAt) : new Date(memo.created_at); setSelectedDateTime(recordingDate); // Check if memo has a custom time set const memoCreatedAt = new Date(memo.created_at); const timeDiff = Math.abs(recordingDate.getTime() - memoCreatedAt.getTime()); setHasCustomTime(timeDiff > 60000); // More than 1 minute difference // Reset blueprint selection setSelectedBlueprintForReprocess(null); setModalMode('reprocess'); } }, [isVisible, memo]); // Get theme colors const getThemeColors = () => { const themeColors = isDark ? colors.theme.extend.colors.dark[themeVariant] : colors.theme.extend.colors[themeVariant]; return { text: themeColors?.text || (isDark ? '#FFFFFF' : '#000000'), contentBackground: themeColors?.contentBackground || (isDark ? '#1E1E1E' : '#FFFFFF'), contentBackgroundHover: themeColors?.contentBackgroundHover || (isDark ? '#333333' : '#F5F5F5'), border: themeColors?.border || (isDark ? '#374151' : '#E5E7EB'), primary: themeColors?.primary || '#f8d62b', }; }; const themeColors = getThemeColors(); const handleReprocess = async () => { if (isProcessing) { return; } try { await onReprocess( selectedLanguageForReprocess, selectedBlueprintForReprocess, selectedDateTime ); // Only close modal if reprocess was successful handleModalClose(); } catch (error) { console.error('Reprocess failed:', error); // Error handling is done in the action handler and global interceptor // 402 errors are handled globally, other errors show alerts in memoActions.ts } }; const handleLanguageSelect = () => { setModalMode('language'); }; const handleBlueprintSelect = () => { setModalMode('blueprint'); loadBlueprints(); }; const handleDateSelect = () => { if (Platform.OS === 'ios') { setModalMode('date'); } else { setShowDatePicker(true); } }; const handleTimeSelect = () => { if (Platform.OS === 'ios') { setModalMode('time'); } else { setShowTimePicker(true); } }; const onDateChange = (event: any, selectedDate?: Date) => { if (Platform.OS === 'android') { setShowDatePicker(false); } if (selectedDate) { const newDateTime = new Date(selectedDateTime); newDateTime.setFullYear(selectedDate.getFullYear()); newDateTime.setMonth(selectedDate.getMonth()); newDateTime.setDate(selectedDate.getDate()); setSelectedDateTime(newDateTime); } }; const onTimeChange = (event: any, selectedTime?: Date) => { if (Platform.OS === 'android') { setShowTimePicker(false); } if (selectedTime) { const newDateTime = new Date(selectedDateTime); newDateTime.setHours(selectedTime.getHours()); newDateTime.setMinutes(selectedTime.getMinutes()); setSelectedDateTime(newDateTime); setHasCustomTime(true); } }; // Load blueprints const loadBlueprints = async () => { setBlueprintsLoading(true); try { const directSupabase = createClient( 'https://npgifbrwhftlbrbaglmi.supabase.co', 'sb_publishable_HlAZpB4BxXaMcfOCNx6VJA_-64NTxu4' ); const { data: blueprintData, error: blueprintError } = await directSupabase .from('blueprints') .select('*') .eq('is_public', true) .order('created_at', { ascending: false }); if (blueprintError) { console.error('Error loading blueprints:', blueprintError); setBlueprints([]); } else { setBlueprints(blueprintData || []); } } catch (error) { console.error('Error loading blueprints:', error); setBlueprints([]); } finally { setBlueprintsLoading(false); } }; const getSelectedLanguageDisplay = () => { if (selectedLanguageForReprocess === 'auto') { return t('upload.auto_detect', 'Automatisch erkennen'); } else { return ( supportedAzureLanguages[selectedLanguageForReprocess]?.nativeName || selectedLanguageForReprocess ); } }; const getSelectedBlueprintDisplay = () => { if (selectedBlueprintForReprocess) { const lang = currentLanguage.startsWith('de') ? 'de' : 'en'; return ( selectedBlueprintForReprocess.name?.[lang] || selectedBlueprintForReprocess.name?.en || selectedBlueprintForReprocess.name?.de || 'Blueprint' ); } return t('reprocess.no_blueprint_selected', 'Kein Blueprint ausgewählt'); }; const getSelectedDateDisplay = () => { return selectedDateTime.toLocaleDateString( currentLanguage.startsWith('de') ? 'de-DE' : 'en-US', { year: 'numeric', month: 'long', day: 'numeric', } ); }; const getSelectedTimeDisplay = () => { return selectedDateTime.toLocaleTimeString( currentLanguage.startsWith('de') ? 'de-DE' : 'en-US', { hour: '2-digit', minute: '2-digit', } ); }; const renderActionButton = ( iconName: string, title: string, subtitle: string, onPress: () => void, showChevron: boolean = true, isActive: boolean = false ) => ( {title} {subtitle} {showChevron && ( )} ); const getModalTitle = () => { switch (modalMode) { case 'language': return t('reprocess.select_language', 'Sprache auswählen'); case 'blueprint': return t('reprocess.select_blueprint', 'Blueprint auswählen'); case 'date': return t('reprocess.select_date', 'Datum auswählen'); case 'time': return t('reprocess.select_time', 'Uhrzeit auswählen'); default: return t('reprocess.title', 'Memo erneut verarbeiten'); } }; const renderModalContent = () => { switch (modalMode) { case 'language': // Convert languages to BaseLanguageSelector format const languageItems: Record = Object.entries( supportedAzureLanguages ).reduce( (acc, [code, lang]) => { acc[code] = { code, ...lang, }; return acc; }, {} as Record ); return ( { if (languages.length > 0) { setSelectedLanguageForReprocess(languages[0]); setModalMode('reprocess'); } }} mode="single" showAutoDetect={true} height={400} autoSelectOnSingle={false} /> ); case 'blueprint': return ( {blueprintsLoading ? ( {t('reprocess.loading_blueprints', 'Blueprints werden geladen...')} ) : blueprints.length === 0 ? ( {t('reprocess.no_blueprints_available', 'Keine Blueprints verfügbar')} ) : ( blueprints.map((blueprint) => { const isSelected = selectedBlueprintForReprocess?.id === blueprint.id; const lang = currentLanguage.startsWith('de') ? 'de' : 'en'; const displayName = blueprint.name?.[lang] || blueprint.name?.en || blueprint.name?.de || 'Blueprint'; const displayDescription = blueprint.description?.[lang] || blueprint.description?.en || blueprint.description?.de || ''; return ( { setSelectedBlueprintForReprocess(blueprint); setModalMode('reprocess'); }} > {displayName} {displayDescription ? ( {displayDescription} ) : null} {isSelected && ( )} ); }) )} ); case 'date': return ( {Platform.OS === 'ios' && (