Files
avante-movil/src/screens/SettingsScreen.tsx
T

174 lines
5.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Pantalla de Configuración.
* Incluye: Configuración de usuario (idioma) y acceso a Configuración de fotos.
*/
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import React, { useCallback, useEffect, useState } from 'react';
import {
Alert,
ScrollView,
StyleSheet,
Switch,
Text,
TouchableOpacity,
View,
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { RootStackParamList } from '../navigation/types';
import { COLORS, PrimaryButton, SectionTitle } from '../ui/components';
import { useSession } from '../auth/session';
type Nav = NativeStackNavigationProp<RootStackParamList>;
export function SettingsScreen({ navigation }: NativeStackScreenProps<RootStackParamList, 'Settings'>) {
const { user } = useSession();
const [language, setLanguage] = useState<string>('en');
useEffect(() => {
// Cargar idioma guardado (en un futuro usar AsyncStorage)
// Por ahora, por defecto inglés
setLanguage('en');
}, []);
const handleLanguageChange = (lang: string) => {
setLanguage(lang);
// TODO: Guardar en AsyncStorage y aplicar cambio de idioma
Alert.alert('Idioma', `Idioma cambiado a ${lang === 'en' ? 'Inglés' : 'Español'}. Reinicia la app para aplicar.`);
};
return (
<ScrollView contentContainerStyle={styles.body}>
<SectionTitle>Configuración de usuario</SectionTitle>
<View style={styles.card}>
<View style={styles.row}>
<Text style={styles.label}>Idioma de la app</Text>
</View>
<View style={styles.languageSelector}>
<TouchableOpacity
style={[styles.langBtn, language === 'en' && styles.langBtnActive]}
onPress={() => handleLanguageChange('en')}
>
<Text style={[styles.langBtnText, language === 'en' && styles.langBtnTextActive]}>English</Text>
</TouchableOpacity>
<TouchableOpacity
style={[styles.langBtn, language === 'es' && styles.langBtnActive]}
onPress={() => handleLanguageChange('es')}
>
<Text style={[styles.langBtnText, language === 'es' && styles.langBtnTextActive]}>Español</Text>
</TouchableOpacity>
</View>
<Text style={styles.hint}>Por defecto: English</Text>
</View>
<View style={styles.divider} />
<SectionTitle>Configuración de fotos</SectionTitle>
<View style={styles.card}>
<TouchableOpacity
style={styles.settingsRow}
onPress={() => navigation.navigate('PhotoSettings')}
>
<View style={styles.settingsRowContent}>
<Text style={styles.settingsIcon}>📷</Text>
<Text style={styles.settingsLabel}>Configuración del pie de página</Text>
</View>
<Text style={styles.chevron}></Text>
</TouchableOpacity>
<Text style={styles.hint}>Personaliza logo, campos (proyecto, fecha, coordenadas) y campos personalizados</Text>
</View>
<View style={styles.divider} />
<SectionTitle>Cuenta</SectionTitle>
<View style={styles.card}>
<View style={styles.accountRow}>
<Text style={styles.accountLabel}>Usuario actual</Text>
<Text style={styles.accountValue}>{user?.name ?? 'Desconocido'}</Text>
</View>
<View style={styles.accountRow}>
<Text style={styles.accountLabel}>Email</Text>
<Text style={styles.accountValue}>{user?.email ?? ''}</Text>
</View>
</View>
<View style={styles.divider} />
<SectionTitle>Acerca de</SectionTitle>
<View style={styles.card}>
<View style={styles.accountRow}>
<Text style={styles.accountLabel}>Versión</Text>
<Text style={styles.accountValue}>1.0.0</Text>
</View>
<View style={styles.accountRow}>
<Text style={styles.accountLabel}>Build</Text>
<Text style={styles.accountValue}>Avante Móvil</Text>
</View>
</View>
</ScrollView>
);
}
const styles = StyleSheet.create({
body: { padding: 16, gap: 16 },
card: {
backgroundColor: '#fff',
borderRadius: 10,
padding: 16,
borderWidth: 1,
borderColor: COLORS.border,
},
row: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
label: { fontSize: 15, fontWeight: '600', color: '#111' },
hint: { fontSize: 12, color: COLORS.muted, marginTop: 4 },
languageSelector: {
flexDirection: 'row',
gap: 8,
marginTop: 8,
},
langBtn: {
flex: 1,
paddingVertical: 10,
paddingHorizontal: 16,
borderRadius: 8,
borderWidth: 1,
borderColor: COLORS.border,
backgroundColor: '#fff',
alignItems: 'center',
},
langBtnActive: {
backgroundColor: COLORS.primary,
borderColor: COLORS.primary,
},
langBtnText: { fontSize: 14, color: COLORS.muted },
langBtnTextActive: { color: '#fff', fontWeight: '600' },
divider: { height: 1, backgroundColor: COLORS.border, marginVertical: 8 },
settingsRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: 4,
},
settingsRowContent: {
flexDirection: 'row',
alignItems: 'center',
gap: 10,
},
settingsIcon: { fontSize: 20 },
settingsLabel: { fontSize: 15, fontWeight: '500', color: '#111' },
chevron: { fontSize: 20, color: COLORS.muted },
accountRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: 8,
borderBottomWidth: StyleSheet.hairlineWidth,
borderBottomColor: COLORS.border,
},
accountLabel: { fontSize: 14, color: COLORS.muted },
accountValue: { fontSize: 14, fontWeight: '600', color: '#111', textAlign: 'right', flex: 1, marginLeft: 16 },
});