import { useCallback, useEffect, useState } from 'react' import { Sparkles, PartyPopper } from 'lucide-react' import { AgentAvatar } from './AgentAvatar' import type { AgentMascot } from '../lib/types' import { Card, CardContent } from '@/components/ui/card' interface CelebrationOverlayProps { agentName: AgentMascot | 'Unknown' featureName: string onComplete?: () => void } // Generate random confetti particles function generateConfetti(count: number) { return Array.from({ length: count }, (_, i) => ({ id: i, x: Math.random() * 100, delay: Math.random() * 0.5, duration: 1 + Math.random() * 1, color: ['#ff006e', '#ffd60a', '#70e000', '#00b4d8', '#8338ec'][Math.floor(Math.random() * 5)], rotation: Math.random() * 360, })) } export function CelebrationOverlay({ agentName, featureName, onComplete }: CelebrationOverlayProps) { const [isVisible, setIsVisible] = useState(true) const [confetti] = useState(() => generateConfetti(30)) const dismiss = useCallback(() => { setIsVisible(false) setTimeout(() => onComplete?.(), 300) // Wait for fade animation }, [onComplete]) useEffect(() => { // Auto-dismiss after 3 seconds const timer = setTimeout(dismiss, 3000) // Escape key to dismiss early const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { dismiss() } } window.addEventListener('keydown', handleKeyDown) return () => { clearTimeout(timer) window.removeEventListener('keydown', handleKeyDown) } }, [dismiss]) if (!isVisible) { return null } return (
{featureName}
Great job, {agentName}!
Click or press Esc to dismiss