import React from 'react';
import Slider from 'react-slick';
import type { Settings } from 'react-slick';
// TYPES
import type { RecommendationQuery } from '../../types';
// HOOKS
import { useRecommendations } from '../../hooks';
// CSS
import 'slick-carousel/slick/slick.css';
import 'slick-carousel/slick/slick-theme.css';
import './carousel-styles.scss';
const DefaultCarouselComponent = ({ onButtonClick, buttonLabel, ...props }: any) => {
const { title, image, description } = props;
return (
{title}
{!!description && (
{description}
)}
);
};
const DefaultLoaderComponent = () => {
return (
);
};
function defaultGetComponentProps(data: Record = {}) {
const { additionalData } = data;
const title = additionalData['product::productName'];
const image = additionalData['product::productMediumImageUrl'] || additionalData['product::productImageUrl']; // prioritzes medium image URL
const url = additionalData['product::productUrl'];
const description = additionalData['product::productDescription'];
return {
title,
image,
url,
description,
};
}
function defaultSelect(response: any) {
return response?.result;
}
export interface CarouselProps extends Settings {
component?: React.ComponentType;
loaderComponent?: React.ComponentType;
getComponentProps?(dataResult: any): Record;
selector?(response: any): any;
recommendationQuery: RecommendationQuery;
containerClassName?: string;
containerStyles?: React.CSSProperties;
onButtonClick?(props: any): void;
onError?(error: any): void;
buttonLabel?: string;
}
export default function Carousel({
component: Component = DefaultCarouselComponent,
loaderComponent: LoaderComponent = DefaultLoaderComponent,
getComponentProps = defaultGetComponentProps,
selector = defaultSelect,
recommendationQuery,
containerClassName = 'breinify-carousel',
containerStyles,
onButtonClick,
onError,
buttonLabel = 'View Product',
...sliderProps
}: CarouselProps) {
const { data, getRecs, isFailure, isLoading, isSuccess, error } = useRecommendations(null);
function onClick(data: any) {
if (onButtonClick instanceof Function) onButtonClick(data);
}
React.useEffect(() => {
getRecs(recommendationQuery, selector);
}, []);
React.useEffect(() => {
if (isFailure && onError instanceof Function) onError(error);
}, [isFailure]);
if (isFailure) {
return null;
}
return (
{isLoading && }
{isSuccess && (
{Array.isArray(data) &&
data.map((each, idx) => (
onClick(each)}
key={idx}
/>
))}
)}
);
}