import { useCallback, useEffect, useMemo, useState } from 'react'; import { LuImageOff, LuLoader, LuBan } from 'react-icons/lu'; import DatasetImageCard from './DatasetImageCard'; import classNames from 'classnames'; import { apiClient } from '@/utils/api'; type LoadState = 'idle' | 'loading' | 'success' | 'error' | 'empty'; interface DatasetPreviewGridProps { datasetName?: string | null; refreshKey?: number; className?: string; emptyMessage?: string; compact?: boolean; } export default function DatasetPreviewGrid({ datasetName, refreshKey = 0, className = '', emptyMessage = 'No files uploaded yet. Add images or videos to see them here.', compact = false, }: DatasetPreviewGridProps) { const [status, setStatus] = useState('idle'); const [items, setItems] = useState<{ img_path: string }[]>([]); const fetchMedia = useCallback(async () => { const trimmedName = datasetName?.trim(); if (!trimmedName) { setItems([]); setStatus('idle'); return; } setStatus('loading'); try { const response = await apiClient .post('/api/datasets/listImages', { datasetName: trimmedName }) .then(res => res.data); const sorted = Array.isArray(response?.images) ? [...response.images].sort((a, b) => a.img_path.localeCompare(b.img_path)) : []; setItems(sorted); setStatus(sorted.length === 0 ? 'empty' : 'success'); } catch (error) { console.error('Failed to fetch dataset preview:', error); setItems([]); setStatus('error'); } }, [datasetName]); useEffect(() => { fetchMedia(); }, [fetchMedia, refreshKey]); const content = useMemo(() => { switch (status) { case 'idle': return (
Select or upload a dataset to preview its contents.
); case 'loading': return (
Loading dataset contents…
); case 'error': return (
Unable to load dataset media. Verify the dataset exists and try again.
); case 'empty': return (
{emptyMessage}
); case 'success': return (
{items.map(item => ( ))}
); default: return null; } }, [status, items, emptyMessage, compact, fetchMedia]); return
{content}
; }