import React, { useState, useCallback } from 'react'; import { View,Text,Alert,StyleSheet,FlatList,Platform,TouchableOpacity} from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { getAuth } from 'firebase/auth'; import {collection,addDoc,query,orderBy,limit,getDocs} from 'firebase/firestore'; import * as Haptics from 'expo-haptics'; import Animated, {useAnimatedStyle,useSharedValue,withSequence,withTiming} from 'react-native-reanimated'; import { ArrowLeft } from 'lucide-react-native'; import { useRouter } from 'expo-router'; import { useCart, CartItem as CartItemType } from '@/context/cartContext'; import { db } from '@/firebase/config'; import CartItem from '@/components/CartItem'; import COLORS from '@/constants/colors'; export default function CartScreen() { const { cart, clearCart, updateQuantity } = useCart(); const totalAmount = cart.total; const [isProcessingOrder, setIsProcessingOrder] = useState(false); const auth = getAuth(); const router = useRouter(); const totalValue = useSharedValue(1); const buttonScale = useSharedValue(1); const totalAnimatedStyle = useAnimatedStyle(() => ({ transform: [{ scale: totalValue.value }], })); const handleConfirmOrder = useCallback(async () => { if (totalAmount <= 0) { Alert.alert('Panier vide', 'Veuillez ajouter des produits à votre panier'); return; } setIsProcessingOrder(true); buttonScale.value = withSequence( withTiming(0.95, { duration: 100 }), withTiming(1, { duration: 150 }) ); if (Platform.OS !== 'web') { Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); } try { const user = auth.currentUser; if (!user) { Alert.alert('Utilisateur non connecté', 'Veuillez vous connecter pour passer une commande.'); return; } const orderRef = collection(db, 'orders'); const q = query(orderRef, orderBy('createdAt', 'desc'), limit(1)); const orderSnapshot = await getDocs(q); let lastOrderId = 0; if (!orderSnapshot.empty) { const lastOrderDoc = orderSnapshot.docs[0].data(); lastOrderId = parseInt(lastOrderDoc.orderId.replace(/^0+/, '')) || 0; } const newOrderId = String(lastOrderId + 1).padStart(3, '0'); const orderData: any = { orderId: newOrderId, userId: user.uid, status: 'En attente', createdAt: new Date().toISOString(), totalAmount, }; cart.items.forEach((item, index) => { orderData[`item${index + 1}`] = { name: item.name, quantity: item.quantity, }; }); await addDoc(orderRef, orderData); Alert.alert('Commande confirmée', `Montant Total : ${totalAmount}DT`); clearCart(); } catch (error) { console.error('Erreur commande :', error); Alert.alert('Erreur', "Impossible d'enregistrer la commande."); } finally { setIsProcessingOrder(false); } }, [cart, totalAmount]); const renderItem = useCallback(({ item }: { item: CartItemType }) => ( { updateQuantity(id, newQty); totalValue.value = withSequence( withTiming(1.05, { duration: 100 }), withTiming(1, { duration: 100 }) ); }} /> ), []); const keyExtractor = useCallback((item: CartItemType) => item.id, []); return ( router.back()}> Mon Panier Votre panier est vide } /> Total : {totalAmount}DT Alert.alert( 'Confirmer la commande', 'Êtes-vous sûr de vouloir confirmer la commande?', [ { text: 'Annuler', style: 'cancel' }, { text: 'Confirmer', style: 'destructive', onPress: handleConfirmOrder }, ] ) } disabled={totalAmount <= 0} > Confirmer la commande Alert.alert( 'Vider le panier', 'Êtes-vous sûr de vouloir supprimer tous les articles du panier ?', [ { text: 'Annuler', style: 'cancel' }, { text: 'Confirmer', style: 'destructive', onPress: clearCart }, ] ) } disabled={cart.items.length === 0} > Vider le panier ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', }, header: { height: 60, justifyContent: 'center', alignItems: 'center', position: 'relative', backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: '#eee', marginTop: 5, }, backButton: { position: 'absolute', left: 20, top: '50%', transform: [{ translateY: -12 }], }, headerTitle: { fontSize: 20, fontWeight: '600', color: '#333', }, content: { flex: 1, padding: 5, }, footer: { paddingHorizontal: 20, paddingVertical: 10, backgroundColor: COLORS.background_user, borderTopWidth: 1, borderTopColor: COLORS.secondary, }, totalContainer: { flexDirection: 'row', justifyContent: 'center', alignItems: 'center', marginBottom: 10, }, totalLabel: { fontSize: 20, }, totalAmount: { fontSize: 20, color: COLORS.primary, }, ConfirmButton: { backgroundColor: '#B07B4F', borderRadius: 12, padding: 16, alignItems: 'center', }, ConfirmButtonText: { color: '#fff', fontSize: 16, fontWeight: '600', }, clearCartButton: { backgroundColor: '#D9534F', borderRadius: 12, padding: 16, alignItems: 'center', marginTop: 10, }, clearCartButtonText: { color: '#fff', fontSize: 16, fontWeight: '600', }, emptyContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', paddingVertical: 10, }, emptyText: { fontSize: 18, }, });