'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Button, Card, Input, Select, Loading, TagInput } from '@zen/core/shared/components'; import { useToast } from '@zen/core/toast'; const UserEditPage = ({ userId }) => { const router = useRouter(); const toast = useToast(); const [userData, setUserData] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [formData, setFormData] = useState({ name: '', email_verified: 'false', }); const [errors, setErrors] = useState({}); const [allRoles, setAllRoles] = useState([]); const [selectedRoleIds, setSelectedRoleIds] = useState([]); const [initialRoleIds, setInitialRoleIds] = useState([]); const emailVerifiedOptions = [ { value: 'false', label: 'Non vérifié' }, { value: 'true', label: 'Vérifié' } ]; useEffect(() => { loadAll(); }, [userId]); const loadAll = async () => { try { setLoading(true); const [userRes, rolesRes, userRolesRes] = await Promise.all([ fetch(`/zen/api/users/${userId}`, { credentials: 'include' }), fetch('/zen/api/roles', { credentials: 'include' }), fetch(`/zen/api/users/${userId}/roles`, { credentials: 'include' }), ]); const [userData, rolesData, userRolesData] = await Promise.all([ userRes.json(), rolesRes.json(), userRolesRes.json(), ]); if (userData.user) { setUserData(userData.user); setFormData({ name: userData.user.name || '', email_verified: userData.user.email_verified ? 'true' : 'false', }); } else { toast.error(userData.message || 'Utilisateur introuvable'); } if (rolesData.roles) { setAllRoles(rolesData.roles); } if (userRolesData.roles) { const ids = userRolesData.roles.map(r => r.id); setSelectedRoleIds(ids); setInitialRoleIds(ids); } } catch { toast.error("Impossible de charger l'utilisateur"); } finally { setLoading(false); } }; const handleInputChange = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })); if (errors[field]) { setErrors(prev => ({ ...prev, [field]: null })); } }; const validateForm = () => { const newErrors = {}; if (!formData.name || !formData.name.trim()) { newErrors.name = 'Le nom est requis'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e) => { e.preventDefault(); if (!validateForm()) return; try { setSaving(true); const userRes = await fetch(`/zen/api/users/${userId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ name: formData.name.trim(), email_verified: formData.email_verified === 'true', }) }); const userResData = await userRes.json(); if (!userRes.ok) { toast.error(userResData.message || userResData.error || "Impossible de mettre à jour l'utilisateur"); return; } const toAdd = selectedRoleIds.filter(id => !initialRoleIds.includes(id)); const toRemove = initialRoleIds.filter(id => !selectedRoleIds.includes(id)); await Promise.all([ ...toAdd.map(roleId => fetch(`/zen/api/users/${userId}/roles`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ roleId }), }) ), ...toRemove.map(roleId => fetch(`/zen/api/users/${userId}/roles/${roleId}`, { method: 'DELETE', credentials: 'include', }) ), ]); toast.success('Utilisateur mis à jour avec succès'); router.push('/admin/users'); } catch { toast.error("Impossible de mettre à jour l'utilisateur"); } finally { setSaving(false); } }; const roleOptions = allRoles.map(r => ({ value: r.id, label: r.name, color: r.color || '#6b7280', description: r.description || undefined, })); if (loading) { return (
); } if (!userData) { return (

Modifier l'utilisateur

Utilisateur introuvable

Utilisateur introuvable

L'utilisateur que vous recherchez n'existe pas ou a été supprimé.

); } return (

Modifier l'utilisateur

{userData.email}

Informations

handleInputChange('name', value)} placeholder="Nom de l'utilisateur" error={errors.name} />