import React, { useEffect, useRef, useState } from 'react'; import { Check, ChevronDown } from 'lucide-react'; import { countryOptions, getCountryLabel, getCountryOption } from '../data/countries'; import CountryFlag from './CountryFlag'; import { useTranslation } from '../i18n/LanguageContext'; import { getTranslator } from '../i18n/translations'; const emptyStatus = { message: '', error: '' }; export default function ProfileTab({ session, profile, loading, error, onSave, onDelete, onSessionChange }) { const t = useTranslation(); const [formValues, setFormValues] = useState(profile); const [status, setStatus] = useState(emptyStatus); const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(false); const [isCountryOpen, setIsCountryOpen] = useState(false); const countryDropdownRef = useRef(null); const selectedCountry = getCountryOption(formValues.country); const hasCustomCountryValue = Boolean(formValues.country) && !selectedCountry; useEffect(() => { setFormValues(profile); }, [profile]); useEffect(() => { if (!isCountryOpen) return undefined; const handlePointerDown = (event) => { if (countryDropdownRef.current && !countryDropdownRef.current.contains(event.target)) { setIsCountryOpen(false); } }; const handleKeyDown = (event) => { if (event.key === 'Escape') { setIsCountryOpen(false); } }; document.addEventListener('mousedown', handlePointerDown); document.addEventListener('keydown', handleKeyDown); return () => { document.removeEventListener('mousedown', handlePointerDown); document.removeEventListener('keydown', handleKeyDown); }; }, [isCountryOpen]); const updateField = (field) => (event) => { const nextValue = field === 'testsVisible' ? event.target.checked : event.target.value; setFormValues((current) => ({ ...current, [field]: nextValue })); }; const handleCountrySelect = (countryCode) => { setFormValues((current) => ({ ...current, country: countryCode })); setIsCountryOpen(false); }; const handleSubmit = async (event) => { event.preventDefault(); setSaving(true); setStatus(emptyStatus); const result = await onSave(formValues); // Nach dem Speichern in der neu gewählten Sprache übersetzen const tNew = getTranslator(formValues.language); if (result?.ok) { if (result.session) { onSessionChange?.(result.session); } setStatus({ message: result.emailUpdateRequested ? tNew('profile.saved_email') : tNew('profile.saved'), error: '' }); } else { setStatus({ message: '', error: result?.error?.message || tNew('profile.error_save') }); } setSaving(false); }; const handleDelete = async () => { const confirmed = window.confirm(t('profile.delete_confirm')); if (!confirmed) return; setDeleting(true); setStatus(emptyStatus); const result = await onDelete?.(); if (result?.ok) { setStatus({ message: t('profile.deleted'), error: '' }); } else { setStatus({ message: '', error: result?.error?.message || t('profile.error_delete') }); } setDeleting(false); }; return (

{t('profile.title_label')}

{t('profile.title')}

{t('profile.description')}

{loading ? (
{t('profile.loading')}
) : (
{t('profile.rank')}
{t('profile.rank_placeholder')} # -

{t('profile.rank_hint')}

{t('profile.tests_visible_title')}

{t('profile.tests_visible_desc')}

{(error || status.error) && (
{status.error || error}
)} {status.message && (
{status.message}
)}
{t('profile.account_id')}: {session?.user?.id || '—'}
)}
); }