196 lines
5.9 KiB
JavaScript
196 lines
5.9 KiB
JavaScript
const React = require('react');
|
|
const {
|
|
Container,
|
|
Typography,
|
|
Card,
|
|
CardMedia,
|
|
Grid,
|
|
Box,
|
|
Chip,
|
|
Stack,
|
|
AppBar,
|
|
Toolbar
|
|
} = require('@mui/material');
|
|
const Footer = require('./components/Footer.js').default;
|
|
const { Logo } = require('./components/header/index.js');
|
|
|
|
class PrerenderProduct extends React.Component {
|
|
render() {
|
|
const { productData } = this.props;
|
|
|
|
if (!productData) {
|
|
return React.createElement(
|
|
Container,
|
|
{ maxWidth: 'lg', sx: { py: 4 } },
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h4', component: 'h1', gutterBottom: true },
|
|
'Product not found'
|
|
)
|
|
);
|
|
}
|
|
|
|
const product = productData.product;
|
|
const attributes = productData.attributes || [];
|
|
const mainImage = product.pictureList && product.pictureList.trim()
|
|
? `/assets/images/prod${product.pictureList.split(',')[0].trim()}.jpg`
|
|
: '/assets/images/nopicture.jpg';
|
|
|
|
return React.createElement(
|
|
Box,
|
|
{
|
|
sx: {
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
minHeight: '100vh',
|
|
mb: 0,
|
|
pb: 0,
|
|
bgcolor: 'background.default'
|
|
}
|
|
},
|
|
React.createElement(
|
|
AppBar,
|
|
{ position: 'sticky', color: 'primary', elevation: 0, sx: { zIndex: 1100 } },
|
|
React.createElement(
|
|
Toolbar,
|
|
{ sx: { minHeight: 64 } },
|
|
React.createElement(
|
|
Container,
|
|
{ maxWidth: 'lg', sx: { display: 'flex', alignItems: 'center' } },
|
|
React.createElement(Logo)
|
|
)
|
|
)
|
|
),
|
|
React.createElement(
|
|
Container,
|
|
{ maxWidth: 'lg', sx: { py: 4, flexGrow: 1 } },
|
|
React.createElement(
|
|
Grid,
|
|
{ container: true, spacing: 4 },
|
|
// Product Image
|
|
React.createElement(
|
|
Grid,
|
|
{ item: true, xs: 12, md: 6 },
|
|
React.createElement(
|
|
Card,
|
|
{ sx: { height: '100%' } },
|
|
React.createElement(
|
|
CardMedia,
|
|
{
|
|
component: 'img',
|
|
height: '400',
|
|
image: mainImage,
|
|
alt: product.name,
|
|
sx: { objectFit: 'contain', p: 2 }
|
|
}
|
|
)
|
|
)
|
|
),
|
|
// Product Details
|
|
React.createElement(
|
|
Grid,
|
|
{ item: true, xs: 12, md: 6 },
|
|
React.createElement(
|
|
Stack,
|
|
{ spacing: 3 },
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h3', component: 'h1', gutterBottom: true },
|
|
product.name
|
|
),
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h6', color: 'text.secondary' },
|
|
'Artikelnummer: '+product.articleNumber+' '+(product.gtin ? ` | GTIN: ${product.gtin}` : "")
|
|
),
|
|
React.createElement(
|
|
Box,
|
|
{ sx: { mt: 1 } },
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h4', color: 'primary', fontWeight: 'bold' },
|
|
new Intl.NumberFormat('de-DE', {
|
|
style: 'currency',
|
|
currency: 'EUR'
|
|
}).format(product.price)
|
|
),
|
|
product.vat && React.createElement(
|
|
Typography,
|
|
{ variant: 'body2', color: 'text.secondary' },
|
|
`inkl. ${product.vat}% MwSt.`
|
|
),
|
|
React.createElement(
|
|
Typography,
|
|
{
|
|
variant: 'body1',
|
|
color: product.available ? 'success.main' : 'error.main',
|
|
fontWeight: 'medium',
|
|
sx: { mt: 1 }
|
|
},
|
|
product.available ? '✅ Verfügbar' : '❌ Nicht verfügbar'
|
|
)
|
|
),
|
|
product.description && React.createElement(
|
|
Box,
|
|
{ sx: { mt: 2 } },
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h6', gutterBottom: true },
|
|
'Beschreibung'
|
|
),
|
|
React.createElement(
|
|
'div',
|
|
{
|
|
dangerouslySetInnerHTML: { __html: product.description },
|
|
style: {
|
|
fontFamily: '"Roboto","Helvetica","Arial",sans-serif',
|
|
fontSize: '1rem',
|
|
lineHeight: '1.5',
|
|
color: '#33691E'
|
|
}
|
|
}
|
|
)
|
|
),
|
|
// Product specifications
|
|
React.createElement(
|
|
Box,
|
|
{ sx: { mt: 2 } },
|
|
React.createElement(
|
|
Typography,
|
|
{ variant: 'h6', gutterBottom: true },
|
|
'Produktdetails'
|
|
),
|
|
React.createElement(
|
|
Stack,
|
|
{ direction: 'row', spacing: 1, flexWrap: 'wrap', gap: 1 },
|
|
product.manufacturer && React.createElement(
|
|
Chip,
|
|
{ label: `Hersteller: ${product.manufacturer}`, variant: 'outlined' }
|
|
),
|
|
product.weight && product.weight > 0 && React.createElement(
|
|
Chip,
|
|
{ label: `Gewicht: ${product.weight} kg`, variant: 'outlined' }
|
|
),
|
|
...attributes.map((attr, index) =>
|
|
React.createElement(
|
|
Chip,
|
|
{
|
|
key: index,
|
|
label: `${attr.cName}: ${attr.cWert}`,
|
|
variant: 'outlined',
|
|
color: 'primary'
|
|
}
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
),
|
|
React.createElement(Footer)
|
|
);
|
|
}
|
|
}
|
|
|
|
module.exports = { default: PrerenderProduct };
|