import React, { useState } from 'react'; import { IMaskInput } from 'react-imask'; import axios from 'axios'; export default function CompleteProfile({ regions, villes, submitUrl, logoutUrl, user }) { const CITY_TO_REGION = { 'Dakar': 'Dakar', 'Guédiawaye': 'Dakar', 'Pikine': 'Dakar', 'Rufisque': 'Dakar', 'Bargny': 'Dakar', 'Keur Massar': 'Dakar', 'Sébikotane': 'Dakar', 'Diamniadio': 'Dakar', 'Thiès': 'Thiès', 'Tivaouane': 'Thiès', 'Mbour': 'Thiès', 'Joal-Fadiouth': 'Thiès', 'Ngaparou': 'Thiès', 'Saly': 'Thiès', 'Popenguine': 'Thiès', 'Pout': 'Thiès', 'Saint-Louis': 'Saint-Louis', 'Richard-Toll': 'Saint-Louis', 'Dagana': 'Saint-Louis', 'Podor': 'Saint-Louis', 'Louga': 'Louga', 'Kébémer': 'Louga', 'Linguère': 'Louga', 'Diourbel': 'Diourbel', 'Mbacké': 'Diourbel', 'Bambey': 'Diourbel', 'Kaolack': 'Kaolack', 'Nioro du Rip': 'Kaolack', 'Guinguinéo': 'Kaolack', 'Fatick': 'Fatick', 'Foundiougne': 'Fatick', 'Gossas': 'Fatick', 'Kaffrine': 'Kaffrine', 'Birkilane': 'Kaffrine', 'Koungheul': 'Kaffrine', 'Malem Hodar': 'Kaffrine', 'Kolda': 'Kolda', 'Velingara': 'Kolda', 'Medina Yoro Foulah': 'Kolda', 'Sédhiou': 'Sédhiou', 'Bounkiling': 'Sédhiou', 'Goudomp': 'Sédhiou', 'Ziguinchor': 'Ziguinchor', 'Bignona': 'Ziguinchor', 'Oussouye': 'Ziguinchor', 'Tambacounda': 'Tambacounda', 'Bakel': 'Tambacounda', 'Goudiry': 'Tambacounda', 'Koumpentoum': 'Tambacounda', 'Kédougou': 'Kédougou', 'Salémata': 'Saraya', 'Saraya': 'Kédougou', 'Matam': 'Matam', 'Kanel': 'Matam', 'Ranérou': 'Matam' }; const [formData, setFormData] = useState({ telephone: user?.telephone || '', region: user?.region || '', ville: user?.ville || '', adresse: user?.adresse || '' }); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); const [serverError, setServerError] = useState(null); const validateField = (name, value) => { let error = ''; switch (name) { case 'telephone': const phoneValue = value.replace(/[\s-]/g, ''); const phoneRegex = /^\+221(7[05678]|30|33)\d{7}$/; if (!value || phoneValue === '+2217') { error = 'Le téléphone est requis'; } else if (!phoneRegex.test(phoneValue)) { error = 'Format invalide (ex: +221 77 123 45 67)'; } break; case 'ville': if (!value) error = 'La ville est requise'; break; case 'adresse': if (!value) error = "L'adresse est requise"; else if (value.length < 5) error = "L'adresse est trop courte"; break; default: break; } return error; }; const handleChange = (e) => { const { name, value } = e.target; let newFormData = { ...formData, [name]: value }; // Auto-assign region based on city selection if (name === 'ville') { const correspondingRegion = CITY_TO_REGION[value] || ''; newFormData = { ...newFormData, region: correspondingRegion }; } setFormData(newFormData); const error = validateField(name, value); setErrors(prev => ({ ...prev, [name]: error, ...(name === 'ville' ? { region: '' } : {}) })); }; const handleSubmit = async (e) => { e.preventDefault(); const newErrors = {}; Object.keys(formData).forEach(key => { if (key === 'region' && formData.ville) return; const error = validateField(key, formData[key]); if (error) newErrors[key] = error; }); if (Object.keys(newErrors).length > 0) { setErrors(newErrors); return; } setIsSubmitting(true); setServerError(null); try { const params = new FormData(); params.append('telephone', formData.telephone.replace(/[\s]/g, '')); params.append('region', formData.region); params.append('ville', formData.ville); params.append('adresse', formData.adresse); const response = await axios.post(submitUrl, params); if (response.data.reponse || response.data.success) { window.location.href = '/my-account/'; // Dashboard } else { setServerError(response.data.message || 'Une erreur est survenue.'); } } catch (error) { setServerError(error.response?.data?.message || 'Erreur de connexion au serveur.'); } finally { setIsSubmitting(false); } }; return (

Finalisons votre profil

Ces informations sont essentielles pour faciliter les restitutions d'objets.

{serverError && (
{serverError}
)}
Tous les champs sont obligatoires.
handleChange({ target: { name: 'telephone', value } })} placeholder="+221 7X XXX XX XX" className={`form-control form-control-lg ${errors.telephone ? 'is-invalid' : ''}`} style={{ borderRadius: '12px', fontSize: '1rem', border: '2px solid #eee' }} /> {errors.telephone &&
{errors.telephone}
}
{errors.ville &&
{errors.ville}
}
{errors.adresse &&
{errors.adresse}
}
Se déconnecter
); }