import { AnimatePresence, motion } from "motion/react"; import { type ReactNode, useEffect, useState } from "react"; import { Message } from "@/app/chat/components/message"; import DogIcon from "@/components/logo/dog-icon"; import { MarkdownRenderer } from "@/components/markdown-renderer"; import { cn } from "@/lib/utils"; interface OnboardingStepProps { text: string; children?: ReactNode; isVisible: boolean; isCompleted?: boolean; icon?: ReactNode; isMarkdown?: boolean; } export function OnboardingStep({ text, children, isVisible, isCompleted = false, icon, isMarkdown = 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 ( ) } >
{isMarkdown ? (
) : (

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

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