'use client'; import { useEffect, useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Loader2, CheckCircle2, XCircle, Circle } from 'lucide-react'; import { useI18n } from '@/lib/hooks/use-i18n'; interface GeneratingProgressProps { outlineReady: boolean; // Is outline generation complete? firstPageReady: boolean; // Is first page generated? statusMessage: string; error?: string | null; } // Status item component - declared outside main component function StatusItem({ completed, inProgress, hasError, label, }: { completed: boolean; inProgress: boolean; hasError: boolean; label: string; }) { return (
{hasError ? ( ) : completed ? ( ) : inProgress ? ( ) : ( )}
{label}
); } export function GeneratingProgress({ outlineReady, firstPageReady, statusMessage, error, }: GeneratingProgressProps) { const { t } = useI18n(); const [dots, setDots] = useState(''); // Animated dots for loading state useEffect(() => { if (!error && !firstPageReady) { const interval = setInterval(() => { setDots((prev) => (prev.length >= 3 ? '' : prev + '.')); }, 500); return () => clearInterval(interval); } }, [error, firstPageReady]); return (
{error ? ( <> {t('generation.generationFailed')} ) : firstPageReady ? ( <> {t('generation.openingClassroom')} ) : ( <> {t('generation.generatingCourse')} {dots} )} {/* Two milestone status items */}
{/* Status message */} {statusMessage && !error && (

{statusMessage}

)} {/* Error message */} {error && (

{error}

)}
); }