Files
reactShop/src/PrerenderCategory.js
sebseb7 1b51da69a9 feat(Images): update image URLs to AVIF format in SEO components
- Changed image file extensions from JPG to AVIF in category, feeds, and product SEO components to enhance performance and reduce file sizes.
- Ensured consistent image handling across the application by updating relevant image paths.
2025-11-21 13:21:58 +01:00

161 lines
5.9 KiB
JavaScript

import React from 'react';
import { Box, AppBar, Toolbar, Container, Typography, Grid, Card, CardMedia, CardContent } from '@mui/material';
import Footer from './components/Footer.js';
import { Logo, SearchBar, CategoryList } from './components/header/index.js';
const PrerenderCategory = ({ categoryId, categoryName, categorySeoName: _categorySeoName, productData }) => {
const products = productData?.products || [];
return (
<Box
sx={{
display: 'flex',
flexDirection: 'column',
minHeight: '100vh',
mb: 0,
pb: 0,
bgcolor: 'background.default'
}}
>
<AppBar position="sticky" color="primary" elevation={0} sx={{ zIndex: 1100 }}>
<Toolbar sx={{ minHeight: 64 }}>
<Container maxWidth="lg" sx={{ display: 'flex', alignItems: 'center' }}>
{/* First row: Logo and ButtonGroup on xs, all items on larger screens */}
<Box sx={{
display: 'flex',
alignItems: 'center',
width: '100%',
flexDirection: { xs: 'column', sm: 'row' }
}}>
{/* Top row for xs, single row for larger screens */}
<Box sx={{
display: 'flex',
alignItems: 'center',
width: '100%',
justifyContent: { xs: 'space-between', sm: 'flex-start' }
}}>
<Logo />
{/* SearchBar visible on sm and up */}
<Box sx={{ display: { xs: 'none', sm: 'block' }, flexGrow: 1 }}>
</Box>
</Box>
{/* Second row: SearchBar only on xs */}
<Box sx={{
display: { xs: 'block', sm: 'none' },
width: '100%',
mt: 1, mb: 1
}}>
<SearchBar />
</Box>
</Box>
</Container>
</Toolbar>
<CategoryList categoryId={209} activeCategoryId={categoryId} />
</AppBar>
<Container maxWidth="xl" sx={{ py: 2, flexGrow: 1, display: 'grid', gridTemplateRows: '1fr' }}>
<Box sx={{
display: 'grid',
gridTemplateColumns: { xs: '1fr', sm: '1fr 2fr', md: '1fr 3fr', lg: '1fr 4fr', xl: '1fr 4fr' },
gap: 3
}}>
<Box>
{/* Category Info */}
<Typography variant="h4" component="h1" sx={{ mb: 2, color: 'primary.main' }}>
{categoryName || `Category ${categoryId}`}
</Typography>
</Box>
<Box>
{/* Product list */}
<Box sx={{
bgcolor: 'background.paper',
p: 2,
borderRadius: 1,
minHeight: 400
}}>
<Typography variant="h6" sx={{ mb: 2 }}>
Products {products.length > 0 && `(${products.length})`}
</Typography>
{products.length > 0 ? (
<Grid container spacing={2}>
{products.map((product) => (
<Grid item xs={12} sm={6} md={4} lg={3} key={product.id}>
<a
href={`/Artikel/${product.seoName}`}
style={{
textDecoration: 'none',
color: 'inherit',
display: 'block',
height: '100%'
}}
>
<Card sx={{
height: '100%',
display: 'flex',
flexDirection: 'column',
transition: 'transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out',
'&:hover': {
transform: 'translateY(-4px)',
boxShadow: '0 4px 20px rgba(0,0,0,0.1)'
}
}}>
<noscript>
<CardMedia
component="img"
height="200"
image={product.pictureList && product.pictureList.trim()
? `/assets/images/prod${product.pictureList.split(',')[0].trim()}.avif`
: '/assets/images/nopicture.jpg'
}
alt={product.name}
sx={{ objectFit: 'cover' }}
/>
</noscript>
<CardContent sx={{ flexGrow: 1 }}>
<Typography variant="h6" component="h3" sx={{
mb: 1,
fontSize: '0.9rem',
lineHeight: 1.2,
height: '2.4em',
overflow: 'hidden',
display: '-webkit-box',
WebkitLineClamp: 2,
WebkitBoxOrient: 'vertical'
}}>
{product.name}
</Typography>
<Typography variant="body2" color="text.secondary" sx={{ mb: 1 }}>
Art.-Nr.: {product.articleNumber}
</Typography>
<Typography variant="h6" color="primary.main" sx={{ fontWeight: 'bold' }}>
{product.price ? `${parseFloat(product.price).toFixed(2)}` : 'Preis auf Anfrage'}
</Typography>
</CardContent>
</Card>
</a>
</Grid>
))}
</Grid>
) : (
<Typography variant="body2" color="text.secondary">
No products found in this category
</Typography>
)}
</Box>
</Box>
</Box>
</Container>
<Footer />
</Box>
);
};
export default PrerenderCategory;