/** * NeedsAttentionBar - Compact alert bar for items needing user attention * * Shows at the top of dashboard when there are: * - Content pending review * - WordPress sync failures * - Incomplete site setup * - Automation failures * * Collapsible and only visible when there are items to show. */ import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import { AlertIcon, ArrowRightIcon, ChevronDownIcon, RefreshIcon, CloseIcon } from '../../icons'; export type AttentionType = 'pending_review' | 'sync_failed' | 'setup_incomplete' | 'automation_failed' | 'credits_low'; export interface AttentionItem { id: string; type: AttentionType; title: string; count?: number; actionLabel: string; actionUrl?: string; onAction?: () => void; onRetry?: () => void; severity: 'warning' | 'error' | 'info'; } interface NeedsAttentionBarProps { items: AttentionItem[]; onDismiss?: (id: string) => void; className?: string; } const severityStyles = { warning: { bg: 'bg-amber-50 dark:bg-amber-500/10', border: 'border-amber-200 dark:border-amber-500/30', icon: 'text-amber-500', text: 'text-amber-800 dark:text-amber-200', button: 'bg-amber-100 hover:bg-amber-200 text-amber-700 dark:bg-amber-500/20 dark:hover:bg-amber-500/30 dark:text-amber-200', }, error: { bg: 'bg-red-50 dark:bg-red-500/10', border: 'border-red-200 dark:border-red-500/30', icon: 'text-red-500', text: 'text-red-800 dark:text-red-200', button: 'bg-red-100 hover:bg-red-200 text-red-700 dark:bg-red-500/20 dark:hover:bg-red-500/30 dark:text-red-200', }, info: { bg: 'bg-blue-50 dark:bg-blue-500/10', border: 'border-blue-200 dark:border-blue-500/30', icon: 'text-blue-500', text: 'text-blue-800 dark:text-blue-200', button: 'bg-blue-100 hover:bg-blue-200 text-blue-700 dark:bg-blue-500/20 dark:hover:bg-blue-500/30 dark:text-blue-200', }, }; export default function NeedsAttentionBar({ items, onDismiss, className = '' }: NeedsAttentionBarProps) { const [isCollapsed, setIsCollapsed] = useState(false); if (items.length === 0) return null; // Group items by severity for display priority const errorItems = items.filter(i => i.severity === 'error'); const warningItems = items.filter(i => i.severity === 'warning'); const infoItems = items.filter(i => i.severity === 'info'); const sortedItems = [...errorItems, ...warningItems, ...infoItems]; const totalCount = items.reduce((sum, item) => sum + (item.count || 1), 0); return (