import Image from '@/components/image'; import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, } from '@/components/ui/carousel'; import { IReferenceChunk } from '@/interfaces/database/chat'; import { isPlainObject } from 'lodash'; import { useMemo } from 'react'; import { extractNumbersFromMessageContent } from './utils'; type IProps = { referenceChunks?: IReferenceChunk[] | Record; messageContent: string; }; type ImageItem = { id: string; index: number; }; const getButtonVisibilityClass = (imageCount: number) => { const map: Record = { 1: 'hidden', 2: '@sm:hidden', 3: '@md:hidden', 4: '@lg:hidden', 5: '@lg:hidden', }; return map[imageCount] || (imageCount >= 6 ? '@2xl:hidden' : ''); }; function ImageCarousel({ images }: { images: ImageItem[] }) { const buttonVisibilityClass = getButtonVisibilityClass(images.length); return ( {images.map(({ id, index }) => ( ))} ); } export function ReferenceImageList({ referenceChunks, messageContent, }: IProps) { const allChunkIndexes = extractNumbersFromMessageContent(messageContent); const images = useMemo(() => { if (Array.isArray(referenceChunks)) { return referenceChunks .map((chunk, idx) => ({ id: chunk.image_id, index: idx })) .filter((item, idx) => allChunkIndexes.includes(idx) && item.id); } if (isPlainObject(referenceChunks)) { return Object.entries(referenceChunks || {}).reduce( (pre, [idx, chunk]) => { if (allChunkIndexes.includes(Number(idx)) && chunk.image_id) { return pre.concat({ id: chunk.image_id, index: Number(idx) }); } return pre; }, [], ); } return []; }, [allChunkIndexes, referenceChunks]); const imageCount = images?.length || 0; if (imageCount === 0) { return <>; } return (
); }