import React, { useState, useEffect } from "react"; import { TouchableOpacity, View, Text, Modal, FlatList, StyleSheet, Pressable, } from "react-native"; import { createNativeStackNavigator } from "@react-navigation/native-stack"; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; import { useNavigation } from "@react-navigation/native"; import { Ionicons } from "@expo/vector-icons"; import { useCart } from "../context/CartContext"; import { useNotifications } from "../context/NotificationContext"; import { useAuth } from "../auth/AuthContext"; import { useTheme } from "../context/ThemeContext"; import { logoutUser } from "../api/api"; import type { ClientNotification } from "../api/api"; import { fontSize, spacing, borderRadius } from "../theme"; import Toast from "../components/ui/Toast"; import type { ClientTabParamList, ClientStackParamList } from "./types"; import ProductsScreen from "../screens/client/ProductsScreen"; import CartScreen from "../screens/client/CartScreen"; import OrderTrackingScreen from "../screens/client/OrderTrackingScreen"; import OrderHistoryScreen from "../screens/client/OrderHistoryScreen"; import ProductDetailScreen from "../screens/client/ProductDetailScreen"; import CheckoutScreen from "../screens/client/CheckoutScreen"; import OrderDetailsScreen from "../screens/client/OrderDetailsScreen"; import ParrainageScreen from "../screens/client/ParrainageScreen"; import ProfileScreen from "../screens/client/ProfileScreen"; const Tab = createBottomTabNavigator(); const Stack = createNativeStackNavigator(); function formatNotifDate(dateStr: string): string { try { const diffMs = Date.now() - new Date(dateStr).getTime(); const diffMin = Math.floor(diffMs / 60000); if (diffMin < 1) return "A l'instant"; if (diffMin < 60) return `Il y a ${diffMin} min`; const diffH = Math.floor(diffMin / 60); if (diffH < 24) return `Il y a ${diffH}h`; const diffD = Math.floor(diffH / 24); if (diffD === 1) return "Hier"; return `Il y a ${diffD} jours`; } catch { return ""; } } function ClientTabs() { const { cartCount } = useCart(); const { notifications, unreadCount, markAllRead, toast, clearToast, navigateToOrder, clearNavigateToOrder, } = useNotifications(); const { logout } = useAuth(); const { colors, isDark, toggleTheme } = useTheme(); const navigation = useNavigation(); const [notifModalVisible, setNotifModalVisible] = useState(false); useEffect(() => { if (navigateToOrder) { setNotifModalVisible(false); navigation.navigate("Tracking"); clearNavigateToOrder(); } }, [navigateToOrder, navigation, clearNavigateToOrder]); const handleLogout = async () => { await logoutUser(); await logout(); }; const openNotifModal = async () => { setNotifModalVisible(true); if (unreadCount > 0) { await markAllRead(); } }; const renderNotifItem = ({ item }: { item: ClientNotification }) => { if (!item) return null; return ( {item.message || "Notification"} {item.created_at ? formatNotifDate(item.created_at) : ""} ); }; return ( <> ( {unreadCount > 0 && ( {unreadCount > 9 ? "9+" : unreadCount} )} ), tabBarStyle: { backgroundColor: colors.bgSecondary, borderTopColor: colors.border, borderTopWidth: 1, }, tabBarActiveTintColor: colors.accent, tabBarInactiveTintColor: colors.textMuted, tabBarLabelStyle: { fontSize: fontSize.xs }, }} > ( ), }} /> ( ), tabBarBadge: cartCount > 0 ? cartCount : undefined, tabBarBadgeStyle: { backgroundColor: colors.accent }, }} /> ( ), }} /> ( ), }} /> ( ), }} /> setNotifModalVisible(false)} > Notifications setNotifModalVisible(false)} > { if ( item?.command_id && item?.type && item?.created_at ) { return `${item.command_id}-${item.type}-${item.created_at}`; } return `notif-${index}`; }} renderItem={renderNotifItem} ListEmptyComponent={ Aucune notification } /> ); } export default function ClientNavigator() { const { colors } = useTheme(); return ( ); } const styles = StyleSheet.create({ notifItem: { padding: spacing.m, borderBottomWidth: 1, borderLeftWidth: 3, }, notifMessage: { fontSize: fontSize.sm, marginBottom: spacing.xs, }, notifDate: { fontSize: fontSize.xs, }, badge: { position: "absolute", top: -4, right: -4, backgroundColor: "#FF3B30", borderRadius: 10, minWidth: 18, height: 18, justifyContent: "center", alignItems: "center", }, badgeText: { color: "#fff", fontSize: 10, fontWeight: "bold", }, modalOverlay: { flex: 1, justifyContent: "flex-end", }, modalContent: { height: "70%", borderTopLeftRadius: borderRadius.lg, borderTopRightRadius: borderRadius.lg, }, modalHeader: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", padding: spacing.l, borderBottomWidth: 1, }, modalTitle: { fontSize: fontSize.lg, fontWeight: "bold", }, emptyText: { textAlign: "center", marginTop: spacing.xl, fontSize: fontSize.sm, }, });