'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 && (
)}
{/* Error message */}
{error && (
)}
);
}