// src/app/samples/page.tsx "use client" import {useSamples} from '@/contexts/SamplesContext' import Link from "next/link" import {useMemo} from 'react' import {useTraining} from "@/contexts/TrainingContext"; import {SampleCard} from "@/components/SampleCard"; // Helper function to parse sample information const parseSampleInfo = (filename: string) => { const [timestamp, info] = filename.split('__') const [batch, index] = info.split('.')[0].split('_') return { timestamp: parseInt(timestamp), batch: parseInt(batch), index: parseInt(index) } } export default function SamplesPage() { const {samples, isLoading: samplesLoading, error: samplesError} = useSamples() const {config, isLoading: configLoading} = useTraining() // Get prompts from config const prompts = config?.config?.process[0]?.sample?.prompts || [] // Group samples by batch number using a memoized calculation const groupedSamples = useMemo(() => { if (!samples?.length) return new Map() // Create groups based on batch numbers const groups = samples.reduce((acc, sample) => { const {batch} = parseSampleInfo(sample.filename) const group = acc.get(batch) || [] group.push({ ...sample, ...parseSampleInfo(sample.filename) }) acc.set(batch, group) return acc }, new Map()) // Sort samples within each group by index for (const [batch, items] of groups) { groups.set(batch, items.sort((a: any, b: any) => a.index - b.index)) } // Return groups sorted by batch number (descending) return new Map([...groups].sort((a, b) => b[0] - a[0])) }, [samples]) // Handle loading and error states if (samplesLoading || configLoading) return (