import { AnimatePresence, motion } from "motion/react"; import { type ReactNode, useEffect, useState } from "react"; import { Message } from "@/app/chat/_components/message"; import DogIcon from "@/components/icons/dog-icon"; import { MarkdownRenderer } from "@/components/markdown-renderer"; import { cn } from "@/lib/utils"; interface OnboardingStepProps { text: string; children?: ReactNode; isVisible: boolean; isCompleted?: boolean; showCompleted?: boolean; icon?: ReactNode; isMarkdown?: boolean; hideIcon?: boolean; } export function OnboardingStep({ text, children, isVisible, isCompleted = false, showCompleted = false, icon, isMarkdown = false, hideIcon = false, }: OnboardingStepProps) { const [displayedText, setDisplayedText] = useState(""); const [showChildren, setShowChildren] = useState(false); useEffect(() => { if (!isVisible) { setDisplayedText(""); setShowChildren(false); return; } if (isCompleted) { setDisplayedText(text); setShowChildren(true); return; } let currentIndex = 0; setDisplayedText(""); setShowChildren(false); const interval = setInterval(() => { if (currentIndex < text.length) { setDisplayedText(text.slice(0, currentIndex + 1)); currentIndex++; } else { clearInterval(interval); setShowChildren(true); } }, 20); // 20ms per character return () => clearInterval(interval); }, [text, isVisible, isCompleted]); if (!isVisible) return null; return ( ) : ( icon || (
) ) } >
{isMarkdown ? ( ) : (

{displayedText} {!showChildren && !isCompleted && ( )}

)} {children && ( {((showChildren && (!isCompleted || showCompleted)) || isMarkdown) && (
{children}
)}
)}
); }