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}
)}
{buttonLabel}
); }; 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} /> ))} )}
); }