import { useState, useEffect } from "react"; import ProductCard from "../../components/ProductCard"; import Navbar from "../../components/Navbar"; import { getAllProducts, getProductsByCategory, getMediaUrl, getCategories } from "../../api/api"; import type { Product, Category } from "../../api/api"; import "./UserAccueil.css"; function UserAccueil() { const [selectedCategory, setSelectedCategory] = useState("tous"); const [categories, setCategories] = useState([]); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { getCategories().then(setCategories); }, []); useEffect(() => { const catObj = categories.find((c) => c.name === selectedCategory); if (catObj?.is_coming_soon) { setLoading(false); setProducts([]); return; } loadProducts(); }, [selectedCategory, categories]); const loadProducts = async () => { setLoading(true); setError(null); try { let response; if (selectedCategory === "tous") { response = await getAllProducts(); } else { response = await getProductsByCategory(selectedCategory); } if (response.success && response.data) { setProducts(response.data); } else { setError( response.message || "Erreur lors du chargement des produits", ); } } catch (err: any) { setError(err.message || "Erreur lors du chargement des produits"); } finally { setLoading(false); } }; const handleCategoryChange = (category: string) => { setSelectedCategory(category); }; const getProductPrice = (product: Product): number => { if (!product.prices || product.prices.length === 0) { return 0; } return product.prices[0]?.price || 0; }; const hasProductVideo = (product: Product): boolean => { if (!product.media || product.media.length === 0) { return false; } return product.media.some( (mediaItem) => mediaItem && mediaItem.type === "video", ); }; const getProductVideoUrl = (product: Product): string | undefined => { if (!product.media || product.media.length === 0) { return undefined; } const videoMedia = product.media.find( (mediaItem) => mediaItem && mediaItem.type === "video", ); return videoMedia?.url ? getMediaUrl(videoMedia.url) : undefined; }; const getProductImage = (product: Product): string => { // Pas de media ? Image placeholder if (!product.media || product.media.length === 0) { return "https://via.placeholder.com/400x400/1a1a1a/ffffff?text=No+Image"; } // Parcourir le tableau media pour trouver la première image for (let i = 0; i < product.media.length; i++) { const mediaItem = product.media[i]; // Vérifier si c'est un objet avec type "image" et url if (mediaItem && mediaItem.type === "image" && mediaItem.url) { return getMediaUrl(mediaItem.url); } } // Si aucune image trouvée, fallback return "https://via.placeholder.com/400x400/1a1a1a/ffffff?text=No+Image"; }; const selectedCategoryObj = categories.find((c) => c.name === selectedCategory); const isSelectedComingSoon = selectedCategoryObj?.is_coming_soon ?? false; return ( <>
{categories.map((category) => { const isActive = selectedCategory === category.name; const catColor = category.color || "#7c3aed"; return ( ); })}

{selectedCategory === "tous" ? "Tous les produits" : selectedCategory}

{isSelectedComingSoon ? (
Prochainement

Les produits de cette catégorie arrivent bientôt !

) : ( <> {loading && (

Chargement des produits...

)} {!loading && !error && products.length > 0 && (
{products.map((product) => (
c.name.toLowerCase() === product.category?.toLowerCase(), )?.color } />
))}
)} )}
); } export default UserAccueil;