mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-05-23 10:22:03 +00:00
88 lines
3.1 KiB
JavaScript
88 lines
3.1 KiB
JavaScript
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
|
import { Carousel } from 'primereact/carousel';
|
|
import TemplateSkeleton from '@/components/content/carousels/skeletons/TemplateSkeleton';
|
|
import { VideoTemplate } from '@/components/content/carousels/templates/VideoTemplate';
|
|
import { DocumentTemplate } from '@/components/content/carousels/templates/DocumentTemplate';
|
|
import { CourseTemplate } from '@/components/content/carousels/templates/CourseTemplate';
|
|
import debounce from 'lodash/debounce';
|
|
|
|
const responsiveOptions = [
|
|
{
|
|
breakpoint: '3000px',
|
|
numVisible: 3,
|
|
},
|
|
{
|
|
breakpoint: '1462px',
|
|
numVisible: 2,
|
|
},
|
|
{
|
|
breakpoint: '575px',
|
|
numVisible: 1,
|
|
}
|
|
];
|
|
|
|
export default function GenericCarousel({items, selectedTopic, title}) {
|
|
const [carousels, setCarousels] = useState([]);
|
|
|
|
const memoizedItems = useMemo(() => items, [items]);
|
|
|
|
useEffect(() => {
|
|
console.log("carousel update", carousels);
|
|
}, [carousels]);
|
|
|
|
const getItemsPerCarousel = useCallback(() => {
|
|
const width = window.innerWidth;
|
|
if (width <= 575) return 1;
|
|
if (width <= 1462) return 2;
|
|
return 3;
|
|
}, []);
|
|
|
|
const updateCarousels = useCallback(() => {
|
|
const itemsPerCarousel = getItemsPerCarousel();
|
|
const newCarousels = [];
|
|
for (let i = 0; i < memoizedItems.length; i += itemsPerCarousel) {
|
|
newCarousels.push(memoizedItems.slice(i, i + itemsPerCarousel));
|
|
}
|
|
setCarousels(newCarousels);
|
|
}, [memoizedItems, getItemsPerCarousel]);
|
|
|
|
useEffect(() => {
|
|
updateCarousels();
|
|
const debouncedHandleResize = debounce(updateCarousels, 250);
|
|
window.addEventListener('resize', debouncedHandleResize);
|
|
|
|
return () => {
|
|
window.removeEventListener('resize', debouncedHandleResize);
|
|
};
|
|
}, [updateCarousels, memoizedItems]);
|
|
|
|
return (
|
|
<>
|
|
{carousels.map((carouselItems, index) => (
|
|
<Carousel
|
|
key={index}
|
|
value={carouselItems}
|
|
itemTemplate={(item) => {
|
|
if (carouselItems.length > 0) {
|
|
if (item.type === 'document') {
|
|
return <DocumentTemplate key={item.id} document={item} />;
|
|
} else if (item.type === 'video') {
|
|
return <VideoTemplate key={item.id} video={item} />;
|
|
} else if (item.type === 'course') {
|
|
return <CourseTemplate key={item.id} course={item} />;
|
|
}
|
|
}
|
|
return <TemplateSkeleton key={Math.random()} />;
|
|
}}
|
|
responsiveOptions={responsiveOptions}
|
|
className="mb-4"
|
|
pt={{
|
|
previousButton: { className: 'hidden' },
|
|
nextButton: { className: 'hidden' }
|
|
}}
|
|
/>
|
|
))}
|
|
</>
|
|
);
|
|
}
|