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

174 lines
5.8 KiB
TypeScript
Raw Normal View History

/**
* 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 },
});