import React, { useState } from 'react'; import { ActivityIndicator, Image, Alert, Linking, Pressable, ScrollView, StyleSheet, Text, View, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { useRouter } from 'expo-router'; import { useQuery } from '@tanstack/react-query'; import { api, USE_MOCK } from '@/api'; import { AppBar } from '@/components/AppBar'; import { Avatar, Badge, Button, Card, SectionTitle } from '@/components/ui'; import { useAuth } from '@/auth/AuthContext'; import { LanguagePreference, useI18n } from '@/i18n'; import { colors, fontSize, radii, spacing } from '@/theme'; // Both stores check these open a real page before accepting a build. const PRIVACY_URL = 'https://casadoc.app/privacy'; const TERMS_URL = 'https://casadoc.app/terms'; export default function ProfileScreen() { const { user, signOut, deleteAccount } = useAuth(); const router = useRouter(); const { t, preference, setPreference } = useI18n(); const [signingOut, setSigningOut] = useState(false); const [deleting, setDeleting] = useState(false); const propsQuery = useQuery({ queryKey: ['properties'], queryFn: () => api.properties.list() }); const fullName = [user?.firstName, user?.lastName].filter(Boolean).join(' ') || user?.email || '—'; const initials = ((user?.firstName?.[0] ?? '') + (user?.lastName?.[0] ?? '')).toUpperCase() || 'U'; const languageOptions: { value: LanguagePreference; label: string; sub?: string }[] = [ { value: 'system', label: t('profile.languageSystem'), sub: t('profile.languageSystemSub') }, { value: 'en', label: 'English' }, { value: 'it', label: 'Italiano' }, ]; // Both stores require in-app deletion, with the consequences spelled out. function confirmDelete() { Alert.alert(t('profile.deleteConfirmTitle'), t('profile.deleteConfirmBody'), [ { text: t('common.cancel'), style: 'cancel' }, { text: t('profile.deleteConfirmCta'), style: 'destructive', onPress: async () => { setDeleting(true); try { await deleteAccount(); } catch (e: any) { Alert.alert(t('profile.deleteFailed'), e?.message ?? t('common.tryAgain')); } finally { setDeleting(false); } }, }, ]); } async function onSignOut() { setSigningOut(true); try { await signOut(); } finally { setSigningOut(false); } } return ( {user?.avatar ? ( ) : ( )} {fullName} {user?.email} {/* Language */} {languageOptions.map((opt, i) => { const selected = preference === opt.value; return ( {i > 0 ? : null} setPreference(opt.value)} accessibilityRole="radio" accessibilityState={{ selected }} > {opt.label} {opt.sub ? {opt.sub} : null} {selected ? : null} ); })} {/* Account */} router.push('/profile/edit')}> {t('profile.personalDetails')} {t('profile.personalDetailsSub')} router.push('/profile/password')}> {t('profile.security')} {t('profile.securitySub')} {/* Legal — store listings require these to be reachable. */} Linking.openURL(PRIVACY_URL)}> {t('profile.privacy')} Linking.openURL(TERMS_URL)}> {t('profile.terms')} {USE_MOCK ? {t('profile.demoMode')} : null} {t('profile.deleteAccount')} {t('profile.deleteAccountSub')} {deleting ? : null}