You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.5 KiB
65 lines
1.5 KiB
package react.store;
|
|
|
|
import js.Browser.window;
|
|
import react.ReactComponent;
|
|
import react.ReactMacro.jsx;
|
|
import Common;
|
|
|
|
typedef ProductProps = {
|
|
var product:ProductInfo;
|
|
var addToCart:ProductInfo -> Int -> Void;
|
|
};
|
|
|
|
typedef ProductState = {
|
|
var quantity:Int;
|
|
};
|
|
|
|
class Product extends react.ReactComponentOfPropsAndState<ProductProps, ProductState>
|
|
{
|
|
static inline var OVERLAY_URL = '/shop/productInfo';
|
|
static inline var IMAGE_WIDTH = 120;
|
|
static inline var IMAGE_HEIGHT = 120;
|
|
|
|
public function new() {
|
|
super();
|
|
state = {
|
|
quantity: 1
|
|
};
|
|
}
|
|
|
|
function openOverlay() {
|
|
untyped window._.overlay('$OVERLAY_URL/${props.product.id}', props.product.name);
|
|
}
|
|
|
|
function updateQuantity(event:Dynamic) {
|
|
var quantity = Std.parseInt(event.target.value);
|
|
|
|
if (Std.is(quantity, Int) && quantity > 0)
|
|
setState({
|
|
quantity: Std.int(quantity)
|
|
});
|
|
}
|
|
|
|
function addToCart() {
|
|
props.addToCart(props.product, state.quantity);
|
|
}
|
|
|
|
override public function render(){
|
|
var product = props.product;
|
|
|
|
return jsx('
|
|
<div className="product">
|
|
<img src=${product.image} width=${IMAGE_WIDTH+'px'} height=${IMAGE_HEIGHT+'px'} alt={product.name} />
|
|
<div className="body">
|
|
<a onClick=$openOverlay>
|
|
${product.name}
|
|
</a>
|
|
<div>${product.price} €</div>
|
|
<input type="number" value=${state.quantity} onChange=$updateQuantity />
|
|
<div className="button" onClick=$addToCart>Ajouter</div>
|
|
</div>
|
|
</div>
|
|
');
|
|
}
|
|
}
|
|
|