import React, { useState } from 'react'; import { IMaskInput } from 'react-imask'; import axios from 'axios'; export default function LitigeForm({ objetId, userPrenom = '', userNom = '', userEmail = '', userTelephone = '', isLoggedIn: initialIsLoggedIn = false, csrfToken = '' }) { const [step, setStep] = useState(1); const [isLoggedIn, setIsLoggedIn] = useState(initialIsLoggedIn); const [showLoginModal, setShowLoginModal] = useState(false); const [formData, setFormData] = useState({ prenom: userPrenom, nom: userNom, email: userEmail, telephone: userTelephone, motif: '', description: '', consent: false }); const [loginData, setLoginData] = useState({ email: '', password: '' }); const [loginError, setLoginError] = useState(null); const [isLoggingIn, setIsLoggingIn] = useState(false); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); const [serverError, setServerError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const motifsChoices = [ { value: 'objet non conforme', label: 'L\'objet ne correspond pas à la description' }, { value: 'refus remise', label: 'Refus de me remettre l\'objet' }, { value: 'comportement suspect', label: 'Comportement suspect du trouvère' }, { value: 'erreur_restitution', label: 'L\'objet a été remis à une autre personne' }, { value: 'non presentation', label: 'La personne ne s\'est pas présentée au rendez-vous' }, { value: 'autre', label: 'Autre raison' } ]; const handleLogin = async (e) => { e.preventDefault(); setIsLoggingIn(true); setLoginError(null); try { const params = new URLSearchParams(); params.append('email', loginData.email); params.append('password', loginData.password); params.append('_csrf_token', csrfToken); const response = await axios.post('/login', params, { headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' } }); if (response.data.success) { const user = response.data.user; setFormData(prev => ({ ...prev, prenom: user.prenom || '', nom: user.nom || '', email: user.email || '', telephone: user.telephone || '' })); setIsLoggedIn(true); setShowLoginModal(false); } } catch (error) { setLoginError(error.response?.data?.error || 'Identifiants invalides.'); } finally { setIsLoggingIn(false); } }; const handleLoginChange = (e) => { const { name, value } = e.target; setLoginData(prev => ({ ...prev, [name]: value })); }; const validateStep = (currentStep) => { let newErrors = {}; if (currentStep === 1) { if (!formData.prenom) newErrors.prenom = 'Le prénom est requis'; if (!formData.nom) newErrors.nom = 'Le nom est requis'; if (!formData.email) newErrors.email = 'L\'email est requis'; else if (!/\S+@\S+\.\S+/.test(formData.email)) newErrors.email = 'Format d\'email invalide'; const phoneValue = formData.telephone.replace(/[\s-]/g, ''); const phoneRegex = /^\+221(7[05678]|30|33)\d{7}$/; if (!formData.telephone || phoneValue === '+2217') { newErrors.telephone = 'Le téléphone est requis'; } else if (!phoneRegex.test(phoneValue)) { newErrors.telephone = 'Format invalide (ex: +221 77 123 45 67)'; } } else if (currentStep === 2) { if (!formData.motif) newErrors.motif = 'Veuillez sélectionner un motif de litige'; if (!formData.description) newErrors.description = 'La description est requise'; else if (formData.description.length < 20) newErrors.description = 'Veuillez détailler davantage la situation (min. 20 caractères)'; } else if (currentStep === 3) { if (!formData.consent) newErrors.consent = 'Vous devez confirmer l\'exactitude des informations'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); if (errors[name]) { setErrors(prev => ({ ...prev, [name]: null })); } }; const nextStep = () => { if (validateStep(step)) { setStep(prev => prev + 1); window.scrollTo({ top: 0, behavior: 'smooth' }); } }; const prevStep = () => { setStep(prev => prev - 1); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const handleSubmit = async (e) => { e.preventDefault(); if (!validateStep(3)) return; setIsSubmitting(true); setServerError(null); const data = new FormData(); data.append('prenom', formData.prenom); data.append('nom', formData.nom); data.append('email', formData.email); data.append('telephone', formData.telephone.replace(/[\s]/g, '')); data.append('motif', formData.motif); data.append('description', formData.description); try { const response = await axios.post(`/api-litige/${objetId}`, data, { headers: { 'Content-Type': 'multipart/form-data' } }); if (response.data.success) { setSuccessMessage(response.data.message); setTimeout(() => { window.location.href = response.data.redirectUrl; }, 3000); } } catch (error) { setServerError(error.response?.data?.error || 'Une erreur est survenue lors de l\'ouverture du dossier.'); setIsSubmitting(false); } }; if (successMessage) { return (
Votre dossier de litige a été ouvert avec succès. Redirection...
Vous avez déjà un compte ?
pour pré-remplir vos informations et suivre plus facilement votre dossier.
{step === 1 ? 'Identifiez-vous pour que nous puissions traiter votre demande.' : step === 2 ? 'Expliquez quel est le problème avec cet objet.' : 'L\'administrateur gèlera temporairement le statut de l\'objet pendant l\'enquête.'}
{serverError && (