import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Separator } from "@/components/ui/separator"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { AlertCircle, Save, User, Lock, LogOut, Trash2 } from "lucide-react"; import { apiService } from "@/api/base"; import { recipeService, Recipe } from "@/api/recipe"; // Types pour les données utilisateur interface User { id: string; email: string; username?: string; firstName?: string; lastName?: string; bio?: string; avatarUrl?: string; createdAt: string; } // Service utilisateur const userService = { getCurrentUser: async (): Promise => { return apiService.get('users/me'); }, updateProfile: async (data: Partial): Promise => { return apiService.put('users/me', data); }, changePassword: async (data: { currentPassword: string; newPassword: string }): Promise => { return apiService.post('users/change-password', data); }, deleteAccount: async (): Promise => { return apiService.delete('users/me'); }, logout: async (): Promise => { return apiService.post('auth/logout', {}); } }; export default function Profile() { const navigate = useNavigate(); const [user, setUser] = useState(null); const [userRecipes, setUserRecipes] = useState([]); const [favoriteRecipes, setFavoriteRecipes] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); // États pour le formulaire de profil const [profileForm, setProfileForm] = useState({ username: "", firstName: "", lastName: "", bio: "" }); // États pour le formulaire de mot de passe const [passwordForm, setPasswordForm] = useState({ currentPassword: "", newPassword: "", confirmPassword: "" }); useEffect(() => { const fetchUserData = async () => { try { setLoading(true); // Récupérer les données de l'utilisateur const userData = await userService.getCurrentUser(); setUser(userData); setProfileForm({ username: userData.username || "", firstName: userData.firstName || "", lastName: userData.lastName || "", bio: userData.bio || "" }); // Récupérer les recettes de l'utilisateur const recipes = await recipeService.getUserRecipes(); setUserRecipes(recipes); // Récupérer les recettes favorites const favorites = await recipeService.getFavoriteRecipes(); setFavoriteRecipes(favorites); } catch (err) { console.error("Erreur lors du chargement du profil:", err); setError("Impossible de charger les données du profil"); // Rediriger vers la page de connexion si non authentifié if (err instanceof Error && err.message.includes("401")) { localStorage.removeItem("token"); navigate("/auth/login"); } } finally { setLoading(false); } }; fetchUserData(); }, [navigate]); const handleProfileChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setProfileForm(prev => ({ ...prev, [name]: value })); }; const handlePasswordChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setPasswordForm(prev => ({ ...prev, [name]: value })); }; const handleProfileSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); setSuccess(""); try { setSaving(true); const updatedUser = await userService.updateProfile(profileForm); setUser(updatedUser); setSuccess("Profil mis à jour avec succès"); } catch (err) { console.error("Erreur lors de la mise à jour du profil:", err); setError("Impossible de mettre à jour le profil"); } finally { setSaving(false); } }; const handlePasswordSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); setSuccess(""); // Vérifier que les mots de passe correspondent if (passwordForm.newPassword !== passwordForm.confirmPassword) { setError("Les mots de passe ne correspondent pas"); return; } try { setSaving(true); await userService.changePassword({ currentPassword: passwordForm.currentPassword, newPassword: passwordForm.newPassword }); setSuccess("Mot de passe modifié avec succès"); setPasswordForm({ currentPassword: "", newPassword: "", confirmPassword: "" }); } catch (err) { console.error("Erreur lors du changement de mot de passe:", err); setError("Impossible de changer le mot de passe"); } finally { setSaving(false); } }; const handleLogout = async () => { try { await userService.logout(); } catch (err) { console.error("Erreur lors de la déconnexion:", err); } finally { localStorage.removeItem("token"); navigate("/auth/login"); } }; const handleDeleteAccount = async () => { if (!window.confirm("Êtes-vous sûr de vouloir supprimer votre compte ? Cette action est irréversible.")) { return; } try { await userService.deleteAccount(); localStorage.removeItem("token"); navigate("/auth/login"); } catch (err) { console.error("Erreur lors de la suppression du compte:", err); setError("Impossible de supprimer le compte"); } }; if (loading) { return (
); } if (!user) { return (

Erreur

Utilisateur non trouvé ou non connecté

); } return (

Profil

Gérez vos informations personnelles et vos préférences

{error && ( Erreur {error} )} {success && ( Succès {success} )}
Informations Vos informations de compte {user.firstName?.[0]}{user.lastName?.[0] || user.email[0].toUpperCase()}

{user.username || "Utilisateur"}

{user.email}

{(user.firstName || user.lastName) && (

{user.firstName} {user.lastName}

)}

Membre depuis

{new Date(user.createdAt).toLocaleDateString()}

{user.bio && (

Bio

{user.bio}

)}
Profil Sécurité Informations du profil Mettez à jour vos informations personnelles