Recommendations: Products per row based on recommendation widgets
Components
In this example we are going to adjust the recommendations widget for sliders (or grid) to display three products per row for product-findify-rec-1
and category-findify-rec-1
, whereas the rest of our recommendations will remain to have a different layout.
(The information on the recommendation widget names can be found in the Dashboard.)
Below you can find an example for Slider as well as for Grid.
Note
For Slider we define how many products we want per row.
For Grid we define the width of the columns, e.g. 12 would be equal to 100% width, 4 to 33.3% width, 3 to 25%, etc.
// some code
const countProductsToShow = (width, config) => {
// array of recommendations we want to change
const recsList = ['product-findify-rec-1', 'category-findify-rec-1'];
// current widget name
const recWidget = config.get('slot');
// check if current recommendation is present in our array
const findCurrentWidgetInRecsList = recsList.find(rec => rec == recWidget);
// render rows based on the widget name
if (findCurrentWidgetInRecsList) {
if (width > 50) return 3;
} else {
if (width > 900) return 5;
if (width > 700) return 4;
if (width > 500) return 3;
if (width > 300) return 2;
return 2;
}
};
export default compose(
// some code
withPropsOnChange(['config', 'size'], ({ config, size, scrollToFirst, scrollToLast }) => ({
sliderOptions: {
swipeToSlide: true,
infinite: false,
slidesToScroll: 1,
arrows: true,
// pass config to the function
slidesToShow: countProductsToShow(size.width, config),
nextArrow: renderArrow('right' , scrollToFirst),
prevArrow: renderArrow('left', scrollToLast),
...config.get('sliderOptions'),
}
})),
)(view);
// some code
// import this
import { withHandlers } from 'recompose';
// create enhancer
const enhancer = withHandlers({
customColumns: ({ config }) => () => {
const width = window.innerWidth;
// array of recommendations we want to change
const recsList = ['product-findify-rec-1', 'category-findify-rec-1'];
// current widget name
const recWidget = config.get('slot');
// check if current recommendation is present in our array
const findCurrentWidgetInRecsList = recsList.find(rec => rec == recWidget);
// render rows based on the widget name
if (findCurrentWidgetInRecsList) {
if (width > 50) return '4';
} else {
if (width > 900) return '3';
if (width > 300) return '6';
return '2';
}
}
})
// don't forget to add 'customColumns'
const GridRecommendationLayout = ({ items, config, theme, customColumns }: IGridProps) =>
<React.Fragment display-if={items && items.size > 0}>
<Text primary lowercase>{ config.get('title') }</Text>
{/* replace columns to use our handler */}
<Grid columns={customColumns()}>
{
MapArray({
config,
array: items,
factory: Product
})
}
</Grid>
</React.Fragment>
export default enhancer(GridRecommendationLayout); // add enhancer
Updated about 4 years ago