import { useState } from 'react'; import { Alert, FlatList, KeyboardAvoidingView, Modal, Platform, Pressable, ScrollView, StyleSheet, Switch, Text, View, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { Badge, Button, Card, EmptyState, Loader, TextField } from '@/components/ui'; import { useAdminFeeds, useSaveFeed, useDeleteFeed } from '@/hooks/useAdmin'; import { Colors } from '@/lib/colors'; import { FontSize, FontWeight, HIT_SLOP, Radius, Spacing } from '@/lib/theme'; import type { Feed } from '@/types'; interface FormState { id?: number; titre: string; contenu: string; ordre: string; est_publie: boolean; } const FORM_VIDE: FormState = { titre: '', contenu: '', ordre: '0', est_publie: false }; function messageErreur(e: unknown, defaut: string): string { const err = e as { response?: { data?: { message?: string } } }; return err?.response?.data?.message ?? defaut; } export default function AdminContenusScreen() { const { data: feeds, isLoading } = useAdminFeeds(); const saveMut = useSaveFeed(); const deleteMut = useDeleteFeed(); const [modalVisible, setModalVisible] = useState(false); const [form, setForm] = useState(FORM_VIDE); const ouvrirCreation = () => { setForm(FORM_VIDE); setModalVisible(true); }; const ouvrirEdition = (f: Feed) => { setForm({ id: f.id, titre: f.titre, contenu: f.contenu, ordre: String(f.ordre), est_publie: f.est_publie }); setModalVisible(true); }; const set = (cle: 'titre' | 'contenu' | 'ordre') => (valeur: string) => setForm((f) => ({ ...f, [cle]: valeur })); const soumettre = async () => { if (!form.titre.trim() || !form.contenu.trim()) { Alert.alert('Champs requis', 'Le titre et le contenu sont obligatoires.'); return; } try { await saveMut.mutateAsync({ id: form.id, titre: form.titre.trim(), contenu: form.contenu.trim(), ordre: Number.parseInt(form.ordre, 10) || 0, est_publie: form.est_publie, }); setModalVisible(false); } catch (e) { Alert.alert('Erreur', messageErreur(e, 'Enregistrement impossible.')); } }; const supprimer = (f: Feed) => { Alert.alert('Supprimer', `Supprimer « ${f.titre} » ?`, [ { text: 'Annuler', style: 'cancel' }, { text: 'Supprimer', style: 'destructive', onPress: async () => { try { await deleteMut.mutateAsync(f.id); } catch (e) { Alert.alert('Erreur', messageErreur(e, 'Suppression impossible.')); } }, }, ]); }; const renderItem = ({ item }: { item: Feed }) => ( {item.titre} {item.contenu}