174 lines
5.8 KiB
TypeScript
174 lines
5.8 KiB
TypeScript
/**
|
||
* 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 },
|
||
}); |