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.
73 lines
1.8 KiB
73 lines
1.8 KiB
package react.store;
|
|
import react.ReactComponent;
|
|
import react.ReactMacro.jsx;
|
|
import Common;
|
|
|
|
using Lambda;
|
|
|
|
typedef ProductListProps = {
|
|
var categories:Array<CategoryInfo>;
|
|
var productsBySubcategoryIdMap:Map<Int, Array<ProductInfo>>;
|
|
var filters:Array<String>;
|
|
var addToCart:ProductInfo -> Int -> Void;
|
|
};
|
|
|
|
class ProductList extends react.ReactComponentOfProps<ProductListProps>
|
|
{
|
|
override public function render(){
|
|
return jsx('
|
|
<div className="categories">
|
|
${renderCategories()}
|
|
</div>
|
|
');
|
|
}
|
|
|
|
function renderCategories() {
|
|
return props.categories.map(function(category) {
|
|
if (!props.filters.has(category.name))
|
|
return null;
|
|
|
|
return jsx('
|
|
<div className="category" key=${category.name}>
|
|
<h2>${category.name}</h2>
|
|
<div className="subCategories">
|
|
${renderSubCategories(category)}
|
|
</div>
|
|
</div>
|
|
');
|
|
});
|
|
}
|
|
|
|
function renderSubCategories(category) {
|
|
var subCategories = category.subcategories.map(function(category) {
|
|
if (!props.productsBySubcategoryIdMap.exists(category.id))
|
|
return jsx('<div key=${category.name}>Loading...</div>');
|
|
|
|
var products = props.productsBySubcategoryIdMap.get(category.id);
|
|
|
|
return jsx('
|
|
<div className="sub-category" key=${category.name}>
|
|
<h3>${category.name}</h3>
|
|
<div className="products">
|
|
${renderProducts(products)}
|
|
</div>
|
|
</div>
|
|
');
|
|
});
|
|
|
|
return jsx('
|
|
<div className="sub-categories">
|
|
$subCategories
|
|
</div>
|
|
');
|
|
}
|
|
|
|
function renderProducts(products) {
|
|
return products.map(function(product) {
|
|
return jsx('
|
|
<Product product=${product} key=${product.id} addToCart=${props.addToCart}/>
|
|
');
|
|
});
|
|
}
|
|
}
|
|
|