import React, { useEffect, useState } from 'react'; import { toast } from 'sonner'; import { Loader2, Calendar, BookOpen, Search, ChevronRight, Eye, Trash2, ChevronLeft, X } from 'lucide-react'; import axios from 'axios'; import { useAuth } from '../hooks/use-auth'; const API_BASE = '/api/catalogues'; export default function Catalogues() { const [loading, setLoading] = useState(true); const [enseignes, setEnseignes] = useState([]); const [catalogues, setCatalogues] = useState([]); const [selectedEnseigne, setSelectedEnseigne] = useState(null); const [pagination, setPagination] = useState({ page: 1, limit: 12, total: 0 }); const [selectedCatalogue, setSelectedCatalogue] = useState(null); const [cataloguePages, setCataloguePages] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const [currentPageIndex, setCurrentPageIndex] = useState(0); const { user, getAuthHeaders } = useAuth(); useEffect(() => { loadEnseignes(); loadCatalogues(); }, []); useEffect(() => { loadCatalogues(); }, [pagination.page, selectedEnseigne, searchQuery]); const loadEnseignes = async () => { try { const response = await axios.get(`${API_BASE}/enseignes`); if (Array.isArray(response.data)) { setEnseignes(response.data); } else { console.error('API response for enseignes is not an array:', response.data); setEnseignes([]); } } catch (error) { console.error('Error loading enseignes:', error); toast.error('Erreur lors du chargement des enseignes'); } }; const loadCatalogues = async () => { setLoading(true); try { const params = { page: pagination.page, limit: pagination.limit, statut: 'actif', }; if (selectedEnseigne) { params.enseigne_ids = selectedEnseigne.id.toString(); } if (searchQuery) { params.recherche = searchQuery; } const response = await axios.get(API_BASE, { params }); if (response.data && Array.isArray(response.data.data)) { setCatalogues(response.data.data); setPagination(prev => ({ ...prev, total: response.data.pagination.total })); } else { console.error('API response for catalogues is invalid:', response.data); setCatalogues([]); } } catch (error) { console.error('Error loading catalogues:', error); toast.error('Erreur lors du chargement des catalogues'); } finally { setLoading(false); } }; const loadCataloguePages = async (catalogueId) => { try { const response = await axios.get(`${API_BASE}/${catalogueId}/pages`); setCataloguePages(response.data); } catch (error) { console.error('Error loading pages:', error); toast.error('Erreur lors du chargement des pages'); } }; const openCatalogue = (catalogue) => { setSelectedCatalogue(catalogue); setCurrentPageIndex(0); // Reset to first page loadCataloguePages(catalogue.id); }; const closeCatalogue = () => { setSelectedCatalogue(null); setCataloguePages([]); setCurrentPageIndex(0); }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleDateString('fr-FR', { day: 'numeric', month: 'short', year: 'numeric' }); }; const isValidNow = (catalogue) => { const now = new Date(); const debut = new Date(catalogue.date_debut); const fin = new Date(catalogue.date_fin); return now >= debut && now <= fin; }; const deleteCatalogue = async (catalogueId, event) => { event.stopPropagation(); // Prevent opening the catalogue if (!confirm('Êtes-vous sûr de vouloir supprimer ce catalogue ?')) { return; } try { await axios.delete(`${API_BASE}/admin/${catalogueId}`, { headers: getAuthHeaders() }); toast.success('Catalogue supprimé'); loadCatalogues(); // Reload the list } catch (error) { console.error('Error deleting catalogue:', error); toast.error('Erreur lors de la suppression'); } }; // Keyboard navigation support useEffect(() => { const handleKeyDown = (e) => { if (!selectedCatalogue) return; if (e.key === 'ArrowLeft') { setCurrentPageIndex(prev => Math.max(0, prev - 1)); } else if (e.key === 'ArrowRight') { setCurrentPageIndex(prev => Math.min(cataloguePages.length - 1, prev + 1)); } else if (e.key === 'Escape') { closeCatalogue(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [selectedCatalogue, cataloguePages.length]); return (
Consultez les catalogues et prospectus des enseignes discount
{searchQuery ? 'Aucun catalogue ne correspond à votre recherche' : 'Aucun catalogue disponible pour le moment'}
Voir le catalogue