import { useState, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { fetchFormexMaterials, fetchFormexCollections, deleteFormexMaterial } from '../api/client'; import MaterialModal from '../components/MaterialModal'; import styles from './Materials.module.css'; export default function Materials() { const { isAdmin } = useAuth(); const navigate = useNavigate(); // Data state const [materials, setMaterials] = useState([]); const [collections, setCollections] = useState([]); const [pagination, setPagination] = useState({ page: 1, limit: 25, total: 0, totalPages: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); // Filter state const [search, setSearch] = useState(''); const [collection, setCollection] = useState(''); const [searchInput, setSearchInput] = useState(''); // Modal state const [modalOpen, setModalOpen] = useState(false); const [editingMaterial, setEditingMaterial] = useState(null); // Delete confirmation const [deletingId, setDeletingId] = useState(null); const loadMaterials = useCallback(async (page = 1) => { setLoading(true); setError(''); try { const result = await fetchFormexMaterials({ search, collection, page, limit: 25 }); setMaterials(result.materials); setPagination(result.pagination); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [search, collection]); useEffect(() => { if (!isAdmin) { navigate('/login?next=/materiaux', { replace: true }); return; } // Load collections for filter dropdown fetchFormexCollections() .then(setCollections) .catch(() => {}); // Load materials loadMaterials(1); }, [isAdmin, navigate, loadMaterials]); const handleSearch = (e) => { e.preventDefault(); setSearch(searchInput); }; const handleCollectionChange = (e) => { setCollection(e.target.value); }; // Reload when filters change useEffect(() => { loadMaterials(1); }, [search, collection, loadMaterials]); const handlePageChange = (newPage) => { loadMaterials(newPage); }; const handleCreate = () => { setEditingMaterial(null); setModalOpen(true); }; const handleEdit = (material) => { setEditingMaterial(material); setModalOpen(true); }; const handleModalClose = () => { setModalOpen(false); setEditingMaterial(null); }; const handleModalSave = () => { setModalOpen(false); setEditingMaterial(null); loadMaterials(pagination.page); }; const handleDeleteClick = (id) => { setDeletingId(id); }; const handleDeleteConfirm = async () => { if (!deletingId) return; try { await deleteFormexMaterial(deletingId); setDeletingId(null); loadMaterials(pagination.page); } catch (err) { setError(err.message); setDeletingId(null); } }; const handleDeleteCancel = () => { setDeletingId(null); }; if (!isAdmin) return null; return (

Matériaux Formex

{/* Filters */}
setSearchInput(e.target.value)} className={styles.searchInput} />
{error &&

{error}

} {loading ? (

Chargement…

) : ( <>
{materials.length === 0 ? ( ) : ( materials.map((m) => ( )) )}
Code Nom Collection Dimensions (mm) Actions
Aucun matériau trouvé.
{m.formex_code} {m.name} {m.collection} {m.width_mm && m.height_mm && m.thickness_mm ? `${m.width_mm} × ${m.height_mm} × ${m.thickness_mm}` : '—'}
{/* Pagination */} {pagination.totalPages > 1 && (
Page {pagination.page} sur {pagination.totalPages} ({pagination.total} résultats)
)} )} {/* Delete confirmation dialog */} {deletingId && (

Voulez-vous vraiment supprimer ce matériau ?

)} {/* Create/Edit Modal */} {modalOpen && ( )}
); }