import { useState, useMemo, useEffect } from 'react'; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Cpu } from 'lucide-react'; import ResponseBlock from './ResponseBlock'; import ResponseCarousel from './ResponseCarousel'; function buildModelLookup(providers) { const map = {}; for (const p of providers) { for (const m of p.models) { map[m.id] = { name: m.name, params: m.params || '' }; } } return map; } function useWindowWidth() { const [width, setWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 1200); useEffect(() => { const onResize = () => setWidth(window.innerWidth); window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, []); return width; } export default function ResultsArea({ results, multipleNeon, comparisonModelOrder = [], comparisonProviders = [], showPersonaPrompt = false, showPrePromptIndicator = false }) { const [carouselOffset, setCarouselOffset] = useState(0); const screenWidth = useWindowWidth(); const modelLookup = useMemo(() => buildModelLookup(comparisonProviders), [comparisonProviders]); const orderedComparisonIds = comparisonModelOrder; const sortComparisons = (responses) => { const byId = {}; for (const r of responses) byId[r.model_id] = r; const ordered = []; for (const id of orderedComparisonIds) { if (byId[id]) ordered.push(byId[id]); } for (const r of responses) { if (!orderedComparisonIds.includes(r.model_id)) ordered.push(r); } return ordered; }; const totalComparisons = orderedComparisonIds.length; const isMobile = screenWidth <= 480; const isTablet = screenWidth <= 900; const visible = isMobile ? 1 : (isTablet ? 1 : 2); const maxOffset = Math.max(0, totalComparisons - visible); const skipStart = () => setCarouselOffset(0); const prev = () => setCarouselOffset(o => Math.max(0, o - 1)); const next = () => setCarouselOffset(o => Math.min(maxOffset, o + 1)); const skipEnd = () => setCarouselOffset(maxOffset); const visibleComparisonIds = orderedComparisonIds.slice(carouselOffset, carouselOffset + visible); const visibleColumnHeaders = visibleComparisonIds.map(id => { const info = modelLookup[id]; return info ? { name: info.name, params: info.params } : { name: id.split('/').pop(), params: '' }; }); if (!results.length) { return null; } return (