blob: 97a09561aa45b7043fe3e4990390242545a80052 [file] [log] [blame] [edit]
const React = require('react');
const { countryFlags } = require('./country-flags.cjs');
const Review = ({ review }) => (
<div className="review">
<h4>{review.user} ({review.rating}/100)</h4>
<p>{review.comment}</p>
</div>
);
const Grape = ({ grape }) => (
<li>
<a href={`/list/?grape=${grape.grape}`}>{grape.grape}</a> ({grape.percentage}%)
<div style={{
display: 'inline-block',
border: '1px solid #ccc',
width: '100px',
height: '10px',
marginLeft: '10px',
verticalAlign: 'middle'
}}>
<div style={{
width: `${grape.percentage}%`,
height: '100%',
backgroundColor: '#663399'
}}></div>
</div>
</li>
);
const GrapeComposition = ({ composition }) => (
<ul className="grape-composition">
{composition.map(g => (
<Grape key={g.grape} grape={g} />
))}
</ul>
);
const WineName = ({ name, hasHighRating }) => (
<h2>{name} {hasHighRating && '⭐'}</h2>
);
const Winemaker = ({ winemaker }) => (
<div className="winemaker">
<h3><a href={winemaker.url}>{winemaker.name}</a></h3>
<p>{winemaker.description}</p>
<p>Established: {winemaker.establishedDate}</p>
</div>
);
const Region = ({ region }) => (
<h3>
{region.name} - <a href={`/list/?country=${region.country}&province=${region.province}`}>{region.province}</a>,
<a href={`/list/?country=${region.country}`}>{region.country}</a>
{countryFlags[region.country]}
</h3>
);
const Tag = ({ tag }) => (
<li key={tag}><a href={`/list/?tag=${tag}`}>{tag}</a></li>
);
const Tags = ({ tags }) => (
<ul className="tags">
{tags.map(t => (
<Tag key={t} tag={t} />
))}
</ul>
);
const Vintage = ({ vintage }) => (
<h4>Vintage: {vintage}</h4>
);
const getSaleInfo = (price, salePrice) => {
const onSale = salePrice && salePrice < price;
const percentageDiff = onSale ? Math.round(((price - salePrice) / price) * 100) : 0;
return { onSale, percentageDiff };
};
const getPriceRating = (price) => {
if (price < 100) return "€";
if (price < 1000) return "€€";
return "€€€";
};
const PriceRating = ({ price }) => (
<span>{getPriceRating(price)}</span>
);
const Price = ({ price, salePrice }) => {
const onSale = salePrice && salePrice < price;
if (onSale) {
return (
<span>
<span style={{ textDecoration: 'line-through' }}>${price}</span> ${salePrice}
</span>
);
}
return <span>${price}</span>;
};
const Bottle750 = ({ bottle }) => {
const { quantity, price, salePrice } = bottle;
const { onSale, percentageDiff } = getSaleInfo(price, salePrice);
return (
<li>
750ml: {quantity} {quantity < 10 && '(Low stock)'} - <Price price={price} salePrice={salePrice} /> <PriceRating price={price} />
{onSale && <span>❗({percentageDiff}% off)</span>}
</li>
);
};
const BottleMagnum = ({ bottle }) => {
const { quantity, price, salePrice } = bottle;
const { onSale, percentageDiff } = getSaleInfo(price, salePrice);
return (
<li>
Magnum: {quantity} {quantity < 10 && '(Low stock)'} - <Price price={price} salePrice={salePrice} /> <PriceRating price={price} />
{onSale && <span>❗({percentageDiff}% off)</span>}
</li>
);
};
const BottleBalthazar = ({ bottle }) => {
const { quantity, price, salePrice } = bottle;
const { onSale, percentageDiff } = getSaleInfo(price, salePrice);
return (
<li>
Balthazar: {quantity} {quantity < 10 && '(Low stock)'} - <Price price={price} salePrice={salePrice} /> <PriceRating price={price} />
{onSale && <span>❗({percentageDiff}% off)</span>}
</li>
);
};
const Stock = ({ stock }) => (
<div className="stock">
<h4>Stock</h4>
{stock && Object.values(stock).some(s => s.quantity > 0) ? (
<ul>
{stock["750ml"] && <Bottle750 bottle={stock["750ml"]} />}
{stock["magnum"] && <BottleMagnum bottle={stock["magnum"]} />}
{stock["balthazar"] && <BottleBalthazar bottle={stock["balthazar"]} />}
</ul>
) : (
<p>Out of stock</p>
)}
</div>
);
const Wine = ({ wine }) => (
<div className="wine-card">
<WineName name={wine.name} hasHighRating={wine.reviews.some(r => r.rating > 90)} />
<Winemaker winemaker={wine.winemaker} />
<Region region={wine.region} />
<Vintage vintage={wine.vintage} />
<h4>Tasting Notes</h4>
<p>{wine.tastingNotes}</p>
<Tags tags={wine.tags} />
<h4>Grape Composition</h4>
<GrapeComposition composition={wine.grapeComposition} />
<Stock stock={wine.stock} />
<h4>Reviews</h4>
{wine.reviews.map((review, i) => (
<Review key={i} review={review} />
))}
</div>
);
const WineList = ({ wines }) => (
<div className="wine-list">
<h1>Complex Wine List</h1>
{wines.map((wine, i) => (
<Wine key={i} wine={wine} />
))}
</div>
);
module.exports = {
Review,
Grape,
GrapeComposition,
WineName,
Winemaker,
Region,
Tag,
Tags,
Vintage,
Price,
PriceRating,
Bottle750,
BottleMagnum,
BottleBalthazar,
Stock,
Wine,
WineList,
};