Files
umra-app/app/(tabs)/home.tsx
Nurmuhammet Allanov 949748b49a Update HomeScreen and FeatureCard styles for improved localization and layout
- Changed badge text in HomeScreen to include localized time format.
- Enhanced description in HomeScreen's FeatureCard for clarity.
- Adjusted FeatureCard styles to use 'space-around' for better content distribution and set a max width for the description to improve readability.
2025-08-20 13:18:50 +05:00

164 lines
4.3 KiB
TypeScript

import { StyleSheet, SafeAreaView, ScrollView, I18nManager, Modal, Pressable } from 'react-native';
import { Text, View } from '@/components/Themed';
import FeatureCard from '@/components/FeatureCard';
import PrayerTimeCard from '@/components/PrayerTimeCard';
import ServicesGrid from '@/components/ServicesGrid';
import i18n from '@/i18n';
import * as Updates from 'expo-updates';
import AsyncStorage from '@react-native-async-storage/async-storage';
import Colors from '@/constants/Colors';
import { useState } from 'react';
export default function HomeScreen() {
const [modalVisible, setModalVisible] = useState(false);
const changeLanguage = async (lang: 'en' | 'tk' | 'ru') => {
if (!lang) return;
setModalVisible(false);
if (lang === i18n.locale.substring(0, 2)) return;
await AsyncStorage.setItem('user-language', lang);
i18n.locale = lang;
I18nManager.forceRTL(false); // Assuming LTR for all three languages
Updates.reloadAsync();
};
const languages = [
{ label: 'English', value: 'en' },
{ label: 'Türkmen', value: 'tk' },
{ label: 'Русский', value: 'ru' },
];
const currentLanguage = languages.find(l => l.value === i18n.locale.substring(0, 2))?.label;
return (
<SafeAreaView style={styles.container}>
<View style={styles.header}>
<Text style={styles.title}>{i18n.t('home')}</Text>
<Pressable onPress={() => setModalVisible(true)} style={pickerSelectStyles.inputIOS}>
<Text style={{ color: 'white' }}>{currentLanguage}</Text>
</Pressable>
</View>
<Modal
animationType="slide"
transparent={true}
visible={modalVisible}
onRequestClose={() => {
setModalVisible(!modalVisible);
}}>
<Pressable style={styles.modalOverlay} onPress={() => setModalVisible(false)}>
<View style={styles.modalView}>
{languages.map((lang) => (
<Pressable
key={lang.value}
style={styles.modalButton}
onPress={() => changeLanguage(lang.value as 'en' | 'tk' | 'ru')}>
<Text style={styles.modalButtonText}>{lang.label}</Text>
</Pressable>
))}
</View>
</Pressable>
</Modal>
<ScrollView>
<View style={styles.innerContainer}>
<FeatureCard
badgeText="Şu gün, 07:00"
title="Aýşe metjidi"
description="Oteldan ugraýar, 1-njy etazda garaşmaly"
image={require('@/assets/images/aisha.jpg')}
/>
<PrayerTimeCard />
<ServicesGrid />
</View>
</ScrollView>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
innerContainer: {
paddingHorizontal: 15,
},
header: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingHorizontal: 15,
},
title: {
fontSize: 22,
fontWeight: 'bold',
marginVertical: 15,
},
langSwitcher: {
flexDirection: 'row',
},
langText: {
color: '#fff',
paddingHorizontal: 5,
fontWeight: 'bold',
},
cardRow: {
flexDirection: 'row',
justifyContent: 'space-between',
},
modalOverlay: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'rgba(0,0,0,0.5)',
},
modalView: {
margin: 20,
backgroundColor: Colors.dark.secondary,
borderRadius: 20,
padding: 35,
alignItems: 'center',
shadowColor: '#000',
shadowOffset: {
width: 0,
height: 2,
},
shadowOpacity: 0.25,
shadowRadius: 4,
elevation: 5,
},
modalButton: {
padding: 10,
borderBottomWidth: 1,
borderBottomColor: '#333',
width: '100%',
},
modalButtonText: {
color: 'white',
textAlign: 'center',
},
});
const pickerSelectStyles = StyleSheet.create({
inputIOS: {
fontSize: 16,
paddingVertical: 12,
paddingHorizontal: 10,
borderWidth: 1,
borderColor: Colors.dark.secondary,
borderRadius: 4,
color: 'white',
paddingRight: 30, // to ensure the text is never behind the icon
},
inputAndroid: {
fontSize: 16,
paddingHorizontal: 10,
paddingVertical: 8,
borderWidth: 0.5,
borderColor: Colors.dark.secondary,
borderRadius: 8,
color: 'white',
paddingRight: 30, // to ensure the text is never behind the icon
},
});