'use client' import { useState, useCallback, useRef } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { ArrowLeft, Layers, RefreshCw, Zap } from 'lucide-react' import Link from 'next/link' import Header from '@/components/Header' import Footer from '@/components/Footer' import { BatchInput, BatchProgress, BatchResults } from '@/components/batch' import type { BatchResult, BatchResponse } from '@/types' type BatchState = 'input' | 'processing' | 'complete' interface ProgressItem { url: string status: 'pending' | 'processing' | 'success' | 'error' error?: string } export default function BatchPage() { const [state, setState] = useState('input') const [progressItems, setProgressItems] = useState([]) const [results, setResults] = useState([]) const [stats, setStats] = useState<{ total: number; successful: number; failed: number; totalTokens: number }>({ total: 0, successful: 0, failed: 0, totalTokens: 0, }) const [startTime, setStartTime] = useState(0) const [endTime, setEndTime] = useState(0) const handleUrlsSubmit = useCallback(async (urls: string[]) => { setState('processing') setStartTime(Date.now()) // Initialize progress items const initialItems: ProgressItem[] = urls.map(url => ({ url, status: 'pending', })) setProgressItems(initialItems) try { // For simpler UX, we'll process all at once via the API // Update all to processing setProgressItems(urls.map(url => ({ url, status: 'processing' }))) const response = await fetch('/api/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ urls }), }) if (!response.ok) { const error = await response.json() throw new Error(error.error || 'Batch processing failed') } const data: BatchResponse = await response.json() // Update progress items with results const updatedItems: ProgressItem[] = data.results.map(result => ({ url: result.url, status: result.success ? 'success' : 'error', error: result.error, })) setProgressItems(updatedItems) setResults(data.results) setStats(data.stats) setEndTime(Date.now()) setState('complete') } catch (error) { console.error('Batch processing error:', error) // Mark all as failed setProgressItems(urls.map(url => ({ url, status: 'error', error: error instanceof Error ? error.message : 'Unknown error', }))) setEndTime(Date.now()) setState('complete') } }, []) const handleReset = useCallback(() => { setState('input') setProgressItems([]) setResults([]) setStats({ total: 0, successful: 0, failed: 0, totalTokens: 0 }) setStartTime(0) setEndTime(0) }, []) return (
{/* Back Link */} Back to Home {/* Page Header */}

Batch Processing

Extract documentation from multiple sites at once

{/* Main Content */}
{/* Input State */} {state === 'input' && (

Enter URLs

{/* Tips */}

Tips

  • Enter one URL per line
  • You can paste up to 50 URLs at once
  • URLs will be processed in parallel for speed
  • Only sites with llms.txt support will succeed
)} {/* Processing State */} {state === 'processing' && (

Processing URLs

i.status === 'processing')} startTime={startTime} />
)} {/* Complete State */} {state === 'complete' && ( {/* Reset Button */}
)}
) }