import { useState } from 'react'; import { Alert, FlatList, KeyboardAvoidingView, Modal, Platform, Pressable, ScrollView, StyleSheet, Text, View, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { Badge, Button, Card, EmptyState, Loader, TextField } from '@/components/ui'; import { useAdminUtilisateurs, useCreateUtilisateur, useToggleUtilisateurActif, useDeleteUtilisateur, } from '@/hooks/useAdmin'; import { Colors } from '@/lib/colors'; import { FontSize, FontWeight, HIT_SLOP, Radius, Spacing } from '@/lib/theme'; import type { Utilisateur } from '@/types'; const ROLE_MEMBRE = 2; const ROLE_ADMIN = 3; interface FormState { prenom: string; nom: string; email: string; password: string; password_confirmation: string; role_id: number; } const FORM_VIDE: FormState = { prenom: '', nom: '', email: '', password: '', password_confirmation: '', role_id: ROLE_MEMBRE, }; /** Extrait le message d'erreur d'une réponse API (422 backend) ou un texte par défaut. */ function messageErreur(e: unknown, defaut: string): string { const err = e as { response?: { data?: { message?: string } } }; return err?.response?.data?.message ?? defaut; } export default function AdminUtilisateursScreen() { const { data: utilisateurs, isLoading } = useAdminUtilisateurs(); const createMut = useCreateUtilisateur(); const toggleMut = useToggleUtilisateurActif(); const deleteMut = useDeleteUtilisateur(); const [modalVisible, setModalVisible] = useState(false); const [form, setForm] = useState(FORM_VIDE); const ouvrirFormulaire = () => { setForm(FORM_VIDE); setModalVisible(true); }; const set = (cle: keyof FormState) => (valeur: string) => setForm((f) => ({ ...f, [cle]: valeur })); const soumettre = async () => { if (!form.prenom.trim() || !form.nom.trim() || !form.email.trim() || !form.password) { Alert.alert('Champs requis', 'Merci de renseigner tous les champs.'); return; } if (form.password !== form.password_confirmation) { Alert.alert('Mots de passe', 'La confirmation ne correspond pas.'); return; } try { await createMut.mutateAsync(form); setModalVisible(false); } catch (e) { Alert.alert('Erreur', messageErreur(e, 'Impossible de créer l’utilisateur.')); } }; const basculerActif = async (u: Utilisateur) => { try { await toggleMut.mutateAsync(u.id); } catch (e) { Alert.alert('Erreur', messageErreur(e, 'Action impossible.')); } }; const supprimer = (u: Utilisateur) => { Alert.alert('Supprimer', `Supprimer ${u.prenom} ${u.nom} ?`, [ { text: 'Annuler', style: 'cancel' }, { text: 'Supprimer', style: 'destructive', onPress: async () => { try { await deleteMut.mutateAsync(u.id); } catch (e) { Alert.alert('Erreur', messageErreur(e, 'Suppression impossible.')); } }, }, ]); }; const renderItem = ({ item }: { item: Utilisateur }) => ( {item.prenom} {item.nom} {item.email}