import { useEffect, useRef, useState } from 'react'; import { ActivityIndicator, Animated, Dimensions, Easing, KeyboardAvoidingView, Modal, Platform, Pressable, Text, TextInput, View, } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { useTranslation } from 'react-i18next'; import { useMailConnect } from '../../hooks/useMailConnect'; const SCREEN_HEIGHT = Dimensions.get('window').height; const SHEET_HEIGHT = SCREEN_HEIGHT * 0.5; type Props = { visible: boolean; email: string; onClose: () => void; onSuccess: () => void; }; /** * Sheet zum Aktualisieren des App-Passworts eines bereits verbundenen Postfachs. * Nutzt POST /api/mail/connect (upsert) — Backend ersetzt verschlüsseltes Passwort. */ export function EditMailAccountSheet({ visible, email, onClose, onSuccess }: Props) { const { t } = useTranslation(); const insets = useSafeAreaInsets(); const { connect, connecting, error: connectError } = useMailConnect(); const [password, setPassword] = useState(''); const [passwordVisible, setPasswordVisible] = useState(false); const [formError, setFormError] = useState(null); const translateY = useRef(new Animated.Value(SHEET_HEIGHT)).current; const backdropOpacity = useRef(new Animated.Value(0)).current; useEffect(() => { if (visible) { setPassword(''); setPasswordVisible(false); setFormError(null); translateY.setValue(SHEET_HEIGHT); backdropOpacity.setValue(0); Animated.parallel([ Animated.timing(translateY, { toValue: 0, duration: 280, easing: Easing.out(Easing.cubic), useNativeDriver: true, }), Animated.timing(backdropOpacity, { toValue: 1, duration: 220, useNativeDriver: true, }), ]).start(); } }, [visible, translateY, backdropOpacity]); async function handleSave() { if (!password.trim()) { setFormError(t('mail.form_fields_required')); return; } setFormError(null); const result = await connect({ email, password }); if (result.ok) { onClose(); onSuccess(); } else { setFormError(result.error ?? t('mail.connect_failed')); } } return ( {/* Drag-Handle */} {/* Header */} {t('common.cancel')} {t('mail.edit_account_title')} {t('mail.edit_account_subtitle', { email })} { setPassword(v); setFormError(null); }} placeholder={t('mail.app_password_placeholder')} placeholderTextColor="#a3a3a3" secureTextEntry={!passwordVisible} autoCapitalize="none" autoCorrect={false} style={{ flex: 1, paddingVertical: 14, fontSize: 15, fontFamily: 'Nunito_400Regular', color: '#0a0a0a', }} /> setPasswordVisible((p) => !p)} hitSlop={8}> {(formError ?? connectError) && ( {formError ?? connectError} )} ({ marginTop: 4, paddingVertical: 14, borderRadius: 12, backgroundColor: !password.trim() || connecting ? '#bfdbfe' : '#007AFF', alignItems: 'center', opacity: pressed ? 0.85 : 1, })} > {connecting ? ( ) : ( {t('mail.edit_account_save')} )} ); }