// src/app/checkout/page.tsx 'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { useCartActions } from '@/hooks/useCartSync';import { formatPrice } from '@/lib/woocommerce'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Separator } from '@/components/ui/separator'; import { Badge } from '@/components/ui/badge'; import { Checkbox } from '@/components/ui/checkbox'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { CreditCard, Lock, Truck, MapPin, Phone, Mail, User, ShoppingBag, AlertCircle, CheckCircle } from 'lucide-react'; import Image from 'next/image'; import Link from 'next/link'; interface CheckoutFormData { // Informations personnelles firstName: string; lastName: string; email: string; phone: string; // Adresse de livraison address: string; city: string; postalCode: string; country: string; // Options notes: string; createAccount: boolean; newsletterOptIn: boolean; // Paiement paymentMethod: 'card' | 'cash' | 'transfer'; } export default function CheckoutPage(): JSX.Element { const router = useRouter(); const { cart, clearCart } = useCart(); const [isLoading, setIsLoading] = useState(false); const [errors, setErrors] = useState>({}); const [currentStep, setCurrentStep] = useState(1); const [formData, setFormData] = useState({ firstName: '', lastName: '', email: '', phone: '', address: '', city: '', postalCode: '', country: 'MR', notes: '', createAccount: false, newsletterOptIn: false, paymentMethod: 'card', }); // Redirection si le panier est vide useEffect(() => { if (cart.items.length === 0) { router.push('/panier'); } }, [cart.items.length, router]); const subtotal = cart.total; const shipping = subtotal >= 50000 ? 0 : 5000; const tax = 0; // Pas de TVA en Mauritanie pour la démo const total = subtotal + shipping + tax; const handleInputChange = (field: keyof CheckoutFormData, value: string | boolean): void => { setFormData(prev => ({ ...prev, [field]: value })); // Effacer l'erreur si elle existe if (errors[field]) { setErrors(prev => ({ ...prev, [field]: '' })); } }; const validateForm = (): boolean => { const newErrors: Record = {}; // Validation des champs obligatoires if (!formData.firstName.trim()) newErrors.firstName = 'Le prénom est requis'; if (!formData.lastName.trim()) newErrors.lastName = 'Le nom est requis'; if (!formData.email.trim()) newErrors.email = 'L\'email est requis'; if (!formData.phone.trim()) newErrors.phone = 'Le téléphone est requis'; if (!formData.address.trim()) newErrors.address = 'L\'adresse est requise'; if (!formData.city.trim()) newErrors.city = 'La ville est requise'; // Validation de l'email const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (formData.email && !emailRegex.test(formData.email)) { newErrors.email = 'Format d\'email invalide'; } // Validation du téléphone mauritanien const phoneRegex = /^(\+222|222)?[0-9]{8}$/; if (formData.phone && !phoneRegex.test(formData.phone.replace(/\s/g, ''))) { newErrors.phone = 'Format de téléphone invalide (ex: +222 XX XX XX XX)'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent): Promise => { e.preventDefault(); if (!validateForm()) return; setIsLoading(true); try { // Simuler l'appel API await new Promise(resolve => setTimeout(resolve, 2000)); // Simuler le succès clearCart(); router.push('/checkout/success'); } catch (error) { console.error('Erreur lors de la commande:', error); // Gérer l'erreur } finally { setIsLoading(false); } }; if (cart.items.length === 0) { return null; // Le useEffect redirigera } return (
{/* Header */}

Finaliser votre commande

Complétez vos informations pour finaliser votre achat

{/* Formulaire */}
{/* Informations personnelles */} Informations personnelles
handleInputChange('firstName', e.target.value)} placeholder="Votre prénom" className={errors.firstName ? 'border-red-500' : ''} /> {errors.firstName && (

{errors.firstName}

)}
handleInputChange('lastName', e.target.value)} placeholder="Votre nom" className={errors.lastName ? 'border-red-500' : ''} /> {errors.lastName && (

{errors.lastName}

)}
handleInputChange('email', e.target.value)} placeholder="votre@email.com" className={errors.email ? 'border-red-500' : ''} /> {errors.email && (

{errors.email}

)}
handleInputChange('phone', e.target.value)} placeholder="+222 XX XX XX XX" className={errors.phone ? 'border-red-500' : ''} /> {errors.phone && (

{errors.phone}

)}
{/* Adresse de livraison */} Adresse de livraison
handleInputChange('address', e.target.value)} placeholder="Rue, quartier..." className={errors.address ? 'border-red-500' : ''} /> {errors.address && (

{errors.address}

)}
{errors.city && (

{errors.city}

)}
handleInputChange('postalCode', e.target.value)} placeholder="Code postal" />