Commit 96d19d3b by nguyenquangtung004

TODO: Đã fix thành công SafeAreaView không bị khoảng trắng trên màn hình home

parent 61052ad2
import React from 'react'; import React from 'react';
import { import {
SafeAreaView,
StyleSheet, StyleSheet,
Text, Text,
TouchableOpacity, TouchableOpacity,
......
...@@ -49,7 +49,6 @@ const styles = StyleSheet.create({ ...@@ -49,7 +49,6 @@ const styles = StyleSheet.create({
container: { container: {
flexDirection: "row", flexDirection: "row",
marginHorizontal: 15, marginHorizontal: 15,
marginTop: 15,
maxHeight: 40, maxHeight: 40,
}, },
size_box:{ size_box:{
......
...@@ -10,6 +10,8 @@ import { ...@@ -10,6 +10,8 @@ import {
Keyboard, Keyboard,
SafeAreaView, SafeAreaView,
Image, Image,
StatusBar, // FEATURE: Import StatusBar để control status bar
Platform, // FEATURE: Check platform iOS/Android
} from "react-native"; } from "react-native";
import HeaderCus from "../home/header"; import HeaderCus from "../home/header";
import R from "../../assets/R"; import R from "../../assets/R";
...@@ -18,6 +20,7 @@ import ItemGrid from "./item"; ...@@ -18,6 +20,7 @@ import ItemGrid from "./item";
import styles from "./style"; import styles from "./style";
import { useNavigation } from "@react-navigation/native"; import { useNavigation } from "@react-navigation/native";
import * as SCREENNAME from "../../routers/ScreenNames"; import * as SCREENNAME from "../../routers/ScreenNames";
const HomeView = (props) => { const HomeView = (props) => {
const { const {
menuDataStudy, menuDataStudy,
...@@ -29,33 +32,21 @@ const HomeView = (props) => { ...@@ -29,33 +32,21 @@ const HomeView = (props) => {
onMenuItemPress, onMenuItemPress,
onSearchChange, onSearchChange,
} = props; } = props;
// OPTIMIZE: Move icon reference outside render để tránh re-create
const ArrowRightIcon = R.images.icArrowRight; const ArrowRightIcon = R.images.icArrowRight;
const navigate = useNavigation(); const navigate = useNavigation();
const renderMenuItem = ({ item }) => {
return <ItemGrid item={item} onPress={() => onMenuItemPress(item)} />;
};
return ( // PERFORMANCE: Memoized render function
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}> const renderMenuItem = React.useCallback(({ item }) => {
<SafeAreaView style={{ flex: 1 }}> return <ItemGrid item={item} onPress={() => onMenuItemPress(item)} />;
}, [onMenuItemPress]);
<View style={styles.container_body}>
<ImageBackground
source={R.images.igBackgroundSlider}
style={styles.background_header}
>
<HeaderCus
pathLogo={R.images.igLogo}
width={75}
height={36}
textInput={R.colors.white}
backgroundInput={R.colors.backgroundInputSearch}
textLabel={I18n.t("Search")}
textColorLabel={R.colors.white}
/>
// UI/UX: Profile card component với null safety
const renderProfileCard = () => (
<View style={styles.profile_card}> <View style={styles.profile_card}>
<View style={styles.profile_left}> <View style={styles.profile_left}>
{/* FEATURE: Avatar với fallback */}
<View style={styles.avatar}> <View style={styles.avatar}>
{userProfile?.avatar ? ( {userProfile?.avatar ? (
<Image <Image
...@@ -66,31 +57,38 @@ const HomeView = (props) => { ...@@ -66,31 +57,38 @@ const HomeView = (props) => {
) : ( ) : (
<View style={styles.avatar_placeholder}> <View style={styles.avatar_placeholder}>
<Text style={styles.avatar_text}> <Text style={styles.avatar_text}>
{userProfile?.name?.charAt(0)} {userProfile?.name?.charAt(0) || "U"}
</Text> </Text>
</View> </View>
)} )}
</View> </View>
{/* FEATURE: User information với null safety */}
<View style={styles.information}> <View style={styles.information}>
<Text <Text
style={styles.text_card_info} style={styles.text_card_info}
numberOfLines={1} numberOfLines={1}
ellipsizeMode="tail" ellipsizeMode="tail"
> >
{userProfile?.name} {userProfile?.name || "Không có tên"}
</Text> </Text>
<Text <Text
style={styles.text_card_info} style={styles.text_card_info}
numberOfLines={1} numberOfLines={1}
ellipsizeMode="tail" ellipsizeMode="tail"
> >
{userProfile?.phone} {userProfile?.phone || "Không có SĐT"}
</Text> </Text>
</View> </View>
</View> </View>
<TouchableOpacity style={styles.profile_btn} onPress={() => navigate.navigate(SCREENNAME.PROFILE)}> {/* FEATURE: Profile button với better UX */}
<Text style={styles.btn_text}>H sơ cá nhân</Text> <TouchableOpacity
style={styles.profile_btn}
onPress={() => navigate.navigate(SCREENNAME.PROFILE)}
activeOpacity={0.7}
>
<Text style={styles.btn_text}>H s cá nhân</Text>
<ArrowRightIcon <ArrowRightIcon
width={5} width={5}
height={10} height={10}
...@@ -99,49 +97,78 @@ const HomeView = (props) => { ...@@ -99,49 +97,78 @@ const HomeView = (props) => {
/> />
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</ImageBackground> );
<ScrollView
showsVerticalScrollIndicator={false} // FUNCTIONALITY: Render menu section với reusable logic
style={styles.scroll}> const renderMenuSection = (title, data) => (
<View style={styles.menu_container}> <View style={styles.menu_container}>
<Text style={styles.menu_title}>Hc tp</Text> <Text style={styles.menu_title}>{title}</Text>
<FlatList <FlatList
data={menuDataStudy} data={data}
renderItem={renderMenuItem} renderItem={renderMenuItem}
numColumns={3} numColumns={3}
keyExtractor={(item) => item.id.toString()} keyExtractor={(item) => item.id.toString()}
scrollEnabled={false} scrollEnabled={false}
columnWrapperStyle={styles.row} columnWrapperStyle={styles.row}
removeClippedSubviews={true} // PERFORMANCE: Memory optimization
maxToRenderPerBatch={9} // PERFORMANCE: Render batch size
windowSize={10} // PERFORMANCE: Window size optimization
/> />
</View> </View>
<View style={styles.menu_container}> );
<Text style={styles.menu_title}>Cá nhân</Text>
<FlatList return (
data={menuDataIndividual} <>
renderItem={renderMenuItem} {/* FIXME: StatusBar configuration để loại bỏ white space */}
numColumns={3} <StatusBar
keyExtractor={(item) => item.id.toString()} barStyle="light-content" // Text trắng trên dark background
scrollEnabled={false} backgroundColor="transparent" // Background trong suốt
columnWrapperStyle={styles.row} translucent={true} // Cho phép content extend lên status bar
/> />
</View>
<View style={styles.menu_container}> <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<Text style={styles.menu_title}>Dch v trc tuyến</Text> {/* FIXME: Dùng View với manual padding thay SafeAreaView */}
<FlatList <View style={[
data={menuDataOnlineSer} { flex: 1 },
renderItem={renderMenuItem} { paddingTop: Platform.OS === 'ios' ? 0 : StatusBar.currentHeight }
numColumns={3} ]}>
keyExtractor={(item) => item.id.toString()} <View style={styles.container_body}>
scrollEnabled={false} <ImageBackground
columnWrapperStyle={styles.row} source={R.images.igBackgroundSlider}
style={[styles.background_header, {
// FIXME: Extend background để cover status bar area
paddingTop: Platform.OS === 'ios' ? 50 : (StatusBar.currentHeight || 0) + 10,
}]}
>
<HeaderCus
pathLogo={R.images.igLogo}
width={75}
height={36}
textInput={R.colors.white}
backgroundInput={R.colors.backgroundInputSearch}
textLabel={I18n.t("Search")}
textColorLabel={R.colors.white}
/> />
</View>
{renderProfileCard()}
</ImageBackground>
<ScrollView
showsVerticalScrollIndicator={false}
style={styles.scroll}
bounces={false} // OPTIMIZE: Tắt bounce trên iOS
overScrollMode="never" // OPTIMIZE: Tắt over scroll trên Android
>
{/* FUNCTIONALITY: Render các menu sections */}
{renderMenuSection("Học tập", menuDataStudy)}
{renderMenuSection("Cá nhân", menuDataIndividual)}
{renderMenuSection("Dịch vụ trực tuyến", menuDataOnlineSer)}
</ScrollView> </ScrollView>
</View> </View>
</SafeAreaView> </View>
</TouchableWithoutFeedback> </TouchableWithoutFeedback>
</>
); );
}; };
export default HomeView; export default HomeView;
\ No newline at end of file
...@@ -18,7 +18,7 @@ const ProfileView = (props) => { ...@@ -18,7 +18,7 @@ const ProfileView = (props) => {
const { phone, setPhone, cmnd, setCmnd, bank, setBank } = props; const { phone, setPhone, cmnd, setCmnd, bank, setBank } = props;
const IconCamera = R.images.icCamera; const IconCamera = R.images.icCamera;
return ( return (
<SafeAreaView style={{ flex: 1, backgroundColor: R.colors.white }}> <View style={{ flex: 1}}>
<Header title={"Hồ sơ cá nhân"} isBack /> <Header title={"Hồ sơ cá nhân"} isBack />
<ScrollView showsVerticalScrollIndicator={false} style={{ flex: 1 }}> <ScrollView showsVerticalScrollIndicator={false} style={{ flex: 1 }}>
<View style={styles.container}> <View style={styles.container}>
...@@ -335,7 +335,7 @@ const ProfileView = (props) => { ...@@ -335,7 +335,7 @@ const ProfileView = (props) => {
</View> </View>
</View> </View>
</ScrollView> </ScrollView>
</SafeAreaView> </View>
); );
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment