import React, { useState, useEffect } from 'react'; import { View, ScrollView } from 'react-native'; import { useTheme } from '~/features/theme/ThemeProvider'; import Text from '~/components/atoms/Text'; import Button from '~/components/atoms/Button'; import Input from '~/components/atoms/Input'; import BaseModal from '~/components/atoms/BaseModal'; import { useTranslation } from 'react-i18next'; interface SpeakerMapping { id: string; label: string; } interface SpeakerLabelModalProps { visible: boolean; onClose: () => void; onSubmit: (speakerMappings: SpeakerMapping[]) => void; speakers: string[]; initialMappings?: Record; } /** * Modal-Komponente zur Benennung von Sprechern im Transkript * * Ermöglicht die Zuweisung von Namen zu Sprechern, die im Transkript identifiziert wurden. */ const SpeakerLabelModal: React.FC = ({ visible, onClose, onSubmit, speakers, initialMappings = {}, }) => { const { isDark } = useTheme(); const { t } = useTranslation(); // State für die Sprecher-Mappings const [speakerMappings, setSpeakerMappings] = useState([]); const [hasInitialized, setHasInitialized] = useState(false); // Initialisiere die Sprecher-Mappings nur beim ersten Öffnen des Modals useEffect(() => { if (visible && !hasInitialized) { // Wenn keine Sprecher vorhanden sind, erstelle Standardsprecher if (speakers.length === 0) { // Erstelle zwei Standardsprecher, wenn keine vorhanden sind const defaultSpeakers = [ { id: 'speaker1', label: initialMappings['speaker1'] || t('memo.speaker_default', 'Sprecher {{number}}', { number: 1 }), }, { id: 'speaker2', label: initialMappings['speaker2'] || t('memo.speaker_default', 'Sprecher {{number}}', { number: 2 }), }, ]; setSpeakerMappings(defaultSpeakers); } else { const initializedMappings = speakers.map((speakerId) => ({ id: speakerId, label: initialMappings[speakerId] || t('memo.speaker_default', 'Sprecher {{number}}', { number: speakerId.replace('speaker', ''), }), })); setSpeakerMappings(initializedMappings); } setHasInitialized(true); } // Reset initialization flag when modal is closed if (!visible && hasInitialized) { setHasInitialized(false); } }, [visible, speakers, initialMappings, hasInitialized]); // Handler für die Änderung eines Sprecher-Labels const handleLabelChange = (speakerId: string, newLabel: string) => { setSpeakerMappings((prevMappings) => prevMappings.map((mapping) => mapping.id === speakerId ? { ...mapping, label: newLabel } : mapping ) ); }; // Handler für das Absenden des Formulars const handleSubmit = () => { onSubmit(speakerMappings); }; // Helper function to format speaker display label const getSpeakerLabel = (speakerId: string): string => { // Handle prefixed speaker IDs from additional recordings (e.g., rec0_speaker1) const prefixedMatch = speakerId.match(/^rec(\d+)_speaker(\d+)$/i); if (prefixedMatch) { const recordingIndex = parseInt(prefixedMatch[1], 10); const speakerNumber = prefixedMatch[2]; // Format as "Recording X - Speaker Y" return t( 'memo.recording_speaker', 'Aufnahme {{recordingNumber}} - Sprecher {{speakerNumber}}', { recordingNumber: recordingIndex + 1, speakerNumber: speakerNumber, } ); } // Handle regular speaker IDs const match = speakerId.match(/speaker(\d+)/i); if (match) { const number = match[1]; return t('memo.speaker_default', 'Sprecher {{number}}', { number }); } // Fallback return speakerId; }; // Render the content of the modal const renderContent = () => ( {t('memo.name_speakers_description', 'Ordne jedem Sprecher im Transkript einen Namen zu')} {speakerMappings.map((mapping) => ( {getSpeakerLabel(mapping.id)}: handleLabelChange(mapping.id, text)} placeholder={t('memo.speaker_name_placeholder', 'Namen eingeben', { id: mapping.id.replace('speaker', ''), })} /> ))} ); // Render the footer with action buttons const renderFooter = () => (