/** * ActionFeedback - Toast notification for completed actions. * * Shows non-intrusive confirmation when actions complete, * including version info and quick action buttons. */ import React, { useEffect, useState } from 'react'; import { CheckCircle, Eye, RotateCcw, X, Download } from 'lucide-react'; import { resolveFileUrl } from '../resolveFileUrl'; /** * ActionFeedback component shows a small toast notification * after an action completes successfully. * * @example * ```tsx * setActiveImage(resultImage)} * onUndo={handleUndo} * autoDismiss={5000} * onDismiss={() => setShowFeedback(false)} * /> * ``` */ export function ActionFeedback({ action, version, details, resultUrl, onView, onUndo, autoDismiss = 5000, onDismiss, }) { const [visible, setVisible] = useState(true); const [progress, setProgress] = useState(100); useEffect(() => { if (autoDismiss <= 0) return; // Animate progress bar const startTime = Date.now(); const interval = setInterval(() => { const elapsed = Date.now() - startTime; const remaining = Math.max(0, 100 - (elapsed / autoDismiss) * 100); setProgress(remaining); if (remaining === 0) { clearInterval(interval); handleDismiss(); } }, 50); return () => clearInterval(interval); }, [autoDismiss]); const handleDismiss = () => { setVisible(false); setTimeout(() => onDismiss?.(), 200); // Allow exit animation }; if (!visible) { return null; } return (
{/* Progress bar at top */} {autoDismiss > 0 && (
)} {/* Thumbnail */} {resultUrl && (
Result
)} {/* Content */}
{version ? `v${version}` : ''} {action}
{details && (
{details}
)}
{/* Action buttons */}
{onView && ()} {resultUrl && ( )} {onUndo && ()}
); } export default ActionFeedback;