"use client"; import { AnimatePresence, motion } from "framer-motion"; import { CheckIcon, XIcon } from "lucide-react"; import { useEffect, useState } from "react"; import AnimatedProcessingIcon from "@/components/icons/animated-processing-icon"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { ONBOARDING_CARD_STEPS_KEY } from "@/lib/constants"; import { cn } from "@/lib/utils"; export function AnimatedProviderSteps({ currentStep, isCompleted, setCurrentStep, steps, storageKey = ONBOARDING_CARD_STEPS_KEY, processingStartTime, hasError = false, }: { currentStep: number; isCompleted: boolean; setCurrentStep: (step: number) => void; steps: string[]; storageKey?: string; processingStartTime?: number | null; hasError?: boolean; }) { const [startTime, setStartTime] = useState(null); const [elapsedTime, setElapsedTime] = useState(0); // Initialize start time from prop or local storage useEffect(() => { const storedElapsedTime = localStorage.getItem(storageKey); if (isCompleted && storedElapsedTime) { // If completed, use stored elapsed time setElapsedTime(parseFloat(storedElapsedTime)); } else if (processingStartTime) { // Use the start time passed from parent (when user clicked Complete) setStartTime(processingStartTime); } }, [storageKey, isCompleted, processingStartTime]); // Progress through steps useEffect(() => { if (currentStep < steps.length - 1 && !isCompleted) { const interval = setInterval(() => { setCurrentStep(currentStep + 1); }, 1500); return () => clearInterval(interval); } }, [currentStep, setCurrentStep, steps, isCompleted]); // Calculate and store elapsed time when completed useEffect(() => { if (isCompleted && startTime) { const elapsed = Date.now() - startTime; setElapsedTime(elapsed); localStorage.setItem(storageKey, elapsed.toString()); } }, [isCompleted, startTime, storageKey]); const isDone = currentStep >= steps.length && !isCompleted && !hasError; return ( {!isCompleted ? (
{hasError ? "Error" : isDone ? "Done" : "Thinking"}
{!isDone && !hasError && (
{steps[currentStep]}
)}
) : (
{`Initialized in ${(elapsedTime / 1000).toFixed(1)} seconds`}
{/* Connecting line on the left */}
{steps.map((step, index) => ( {step} ))}
)}
); }