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 (
{/* Header */}

Catalogues Promotionnels

Consultez les catalogues et prospectus des enseignes discount

{/* Search Bar */}
{ setSearchQuery(e.target.value); setPagination(prev => ({ ...prev, page: 1 })); }} />
{/* Enseignes Filter */}
{enseignes.map(enseigne => ( ))}
{/* Catalogues Grid */} {loading ? (
) : catalogues.length === 0 ? (

Aucun catalogue trouvé

{searchQuery ? 'Aucun catalogue ne correspond à votre recherche' : 'Aucun catalogue disponible pour le moment'}

) : ( <>
{catalogues.map(catalogue => (
openCatalogue(catalogue)} > {/* Cover Image */}
{catalogue.titre}

Voir le catalogue

{isValidNow(catalogue) && (
En cours
)}
{/* Content */}
{/* Enseigne Badge */}
{catalogue.enseigne.nom}
{/* Title */}

{catalogue.titre}

{/* Dates */}
{formatDate(catalogue.date_debut)} - {formatDate(catalogue.date_fin)}
{/* Pages */}
{catalogue.nombre_pages} pages
{user?.is_admin && ( )}
))}
{/* Pagination */} {pagination.total > pagination.limit && (
Page {pagination.page} sur {Math.ceil(pagination.total / pagination.limit)}
)} )} {/* Catalogue Viewer Modal - Page by Page Navigation */} {selectedCatalogue && (
e.stopPropagation()} > {/* Header */}

{selectedCatalogue.titre}

{selectedCatalogue.enseigne.nom}
{cataloguePages.length > 0 && ( Page {currentPageIndex + 1} / {cataloguePages.length} )}
{/* Main Image Viewer */}
{cataloguePages.length === 0 ? ( ) : ( <> {/* Current Page Image */}
{`Page
{/* Navigation Buttons */} {cataloguePages.length > 1 && ( <> {/* Previous Button */} {/* Next Button */} )} )}
{/* Thumbnail Strip */} {cataloguePages.length > 1 && (
{cataloguePages.map((page, index) => ( ))}
)}
)}
); }