Files
project_it207_client/app/(tabs)/account.tsx
2025-11-20 14:49:39 +07:00

215 lines
5.5 KiB
TypeScript

import React from "react";
import {
View,
Text,
TouchableOpacity,
StyleSheet,
Alert,
ScrollView,
Image,
} from "react-native";
import { useNavigation, useRouter } from "expo-router";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Ionicons } from "@expo/vector-icons";
import { useAuth } from "../../hooks/useAuth";
export default function AccountScreen() {
const router = useRouter();
const insets = useSafeAreaInsets();
const { user, logout } = useAuth();
const handleLogout = async () => {
Alert.alert("Đăng xuất", "Bạn có chắc muốn đăng xuất?", [
{
text: "Hủy",
style: "cancel",
},
{
text: "Đăng xuất",
style: "destructive",
onPress: async () => {
const success = await logout();
if (success) {
router.replace("/");
}
},
},
]);
};
const menuItems = [
{ id: "address", label: "Address", icon: "location" },
{ id: "payment", label: "Payment method", icon: "card" },
{ id: "voucher", label: "Voucher", icon: "ticket" },
{ id: "wishlist", label: "My Wishlist", icon: "heart" , screen: "wishlist"},
{ id: "rate", label: "Rate this app", icon: "star" },
];
const navigation = useNavigation();
return (
<View style={[styles.container, { paddingTop: insets.top }]}>
{/* Header with Settings Icon */}
<View style={styles.header}>
<Text style={styles.headerTitle}>My Profile</Text>
<TouchableOpacity style={styles.settingsBtn}>
<Ionicons name="settings" size={24} color="#333" />
</TouchableOpacity>
</View>
<ScrollView showsVerticalScrollIndicator={false} style={styles.scrollView}>
{/* User Profile Section */}
<View style={styles.profileSection}>
<View style={styles.profileContent}>
{/* Avatar */}
<View style={styles.avatarContainer}>
<View style={styles.avatar}>
<Ionicons name="person" size={32} color="#fff" />
</View>
</View>
{/* User Info */}
<View style={styles.userInfo}>
<Text style={styles.userName}>
{user?.email?.split("@")[0] || "User"}
</Text>
<Text style={styles.userEmail}>{user?.email || "email@example.com"}</Text>
</View>
</View>
</View>
{/* Menu Items */}
<View style={styles.menuContainer}>
{menuItems.map((item) => (
<TouchableOpacity
key={item.id}
style={styles.menuItem}
activeOpacity={0.7}
onPress={() => {
if (item.screen) {
navigation.navigate(item.screen);
}
}}
>
<View style={styles.menuItemContent}>
<View style={styles.menuItemLeft}>
<Ionicons name={item.icon} size={20} color="#9B9B9B" />
<Text style={styles.menuItemText}>{item.label}</Text>
</View>
<Ionicons name="chevron-forward" size={20} color="#D0D0D0" />
</View>
</TouchableOpacity>
))}
{/* Logout Button */}
<TouchableOpacity
style={[styles.menuItem, styles.logoutMenuItem]}
onPress={handleLogout}
activeOpacity={0.7}
>
<View style={styles.menuItemContent}>
<View style={styles.menuItemLeft}>
<Ionicons name="log-out" size={20} color="#9B9B9B" />
<Text style={[styles.menuItemText, styles.logoutText]}>
Log out
</Text>
</View>
<Ionicons name="chevron-forward" size={20} color="#D0D0D0" />
</View>
</TouchableOpacity>
</View>
</ScrollView>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
},
header: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
paddingHorizontal: 16,
paddingVertical: 12,
borderBottomWidth: 1,
borderBottomColor: "#f0f0f0",
},
headerTitle: {
fontSize: 18,
fontWeight: "700",
color: "#333",
},
settingsBtn: {
padding: 8,
},
scrollView: {
flex: 1,
},
profileSection: {
paddingHorizontal: 16,
paddingVertical: 24,
borderBottomWidth: 1,
borderBottomColor: "#f5f5f5",
},
profileContent: {
flexDirection: "row",
alignItems: "center",
},
avatarContainer: {
marginRight: 16,
},
avatar: {
width: 60,
height: 60,
borderRadius: 30,
backgroundColor: "#D4A574",
justifyContent: "center",
alignItems: "center",
},
userInfo: {
flex: 1,
},
userName: {
fontSize: 16,
fontWeight: "700",
color: "#333",
marginBottom: 4,
textTransform: "capitalize",
},
userEmail: {
fontSize: 13,
color: "#999",
},
menuContainer: {
paddingHorizontal: 16,
paddingVertical: 16,
},
menuItem: {
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: "#f5f5f5",
},
menuItemContent: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
},
menuItemLeft: {
flexDirection: "row",
alignItems: "center",
},
menuItemText: {
marginLeft: 16,
fontSize: 14,
fontWeight: "500",
color: "#333",
},
logoutMenuItem: {
marginTop: 8,
},
logoutText: {
color: "#E74C3C",
},
});