// 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 (
Loading...
) if (samplesError) return (
Error: {samplesError.message}
) return (
{/* Header with navigation */}

Samples Gallery

← Back to Dashboard
{/* Prompts display */}

Generation Prompts

{prompts.map((prompt, index) => (
{index}: {prompt}
))}
{/* Sample groups */}
{Array.from(groupedSamples).map(([batch, items]) => (

Steps {batch}

{/* Scrollable container for samples */}
{items.map((sample: any) => ( ))}
))}
) }