// SEO CopilotKit Suggestions Component // Displays contextual suggestions based on current SEO data and user state import React, { useMemo, useState } from 'react'; import { useSEOCopilotSuggestions } from '../../stores/seoCopilotStore'; import { CopilotSuggestion } from '../../types/seoCopilotTypes'; interface SEOCopilotSuggestionsProps { maxSuggestions?: number; showCategories?: boolean; onSuggestionClick?: (suggestion: CopilotSuggestion) => void; } const SEOCopilotSuggestionsComponent: React.FC = ({ maxSuggestions = 4, showCategories = true, onSuggestionClick }) => { const suggestions = useSEOCopilotSuggestions(); const [expandedCategory, setExpandedCategory] = useState(null); // Group suggestions by category (memoized) const groupedSuggestions = useMemo(() => { return suggestions.reduce((acc, suggestion) => { if (!acc[suggestion.category]) { acc[suggestion.category] = []; } acc[suggestion.category].push(suggestion); return acc; }, {} as Record); }, [suggestions]); // Get category display info const getCategoryInfo = (category: string) => { const categoryInfo = { analysis: { icon: '🔍', name: 'Analysis', color: '#3B82F6' }, optimization: { icon: '⚡', name: 'Optimization', color: '#10B981' }, education: { icon: '🎓', name: 'Education', color: '#F59E0B' }, monitoring: { icon: '📊', name: 'Monitoring', color: '#8B5CF6' } }; return categoryInfo[category as keyof typeof categoryInfo] || { icon: '💡', name: category, color: '#6B7280' }; }; // Get priority badge const getPriorityBadge = (priority: string) => { const priorityInfo = { high: { label: 'High', color: '#EF4444', bgColor: '#FEE2E2' }, medium: { label: 'Medium', color: '#F59E0B', bgColor: '#FEF3C7' }, low: { label: 'Low', color: '#10B981', bgColor: '#D1FAE5' } }; return priorityInfo[priority as keyof typeof priorityInfo] || { label: priority, color: '#6B7280', bgColor: '#F3F4F6' }; }; // Handle suggestion click const handleSuggestionClick = (suggestion: CopilotSuggestion) => { if (onSuggestionClick) { onSuggestionClick(suggestion); } else { // Default behavior - trigger the action console.log('Suggestion clicked:', suggestion); // Here you would typically trigger the CopilotKit action } }; // Render individual suggestion const renderSuggestion = (suggestion: CopilotSuggestion) => { const priorityBadge = getPriorityBadge(suggestion.priority); return (
handleSuggestionClick(suggestion)} >
{suggestion.icon}

{suggestion.title}

{suggestion.message}

{priorityBadge.label}
); }; // Render category section const renderCategory = (category: string, categorySuggestions: CopilotSuggestion[]) => { const categoryInfo = getCategoryInfo(category); const isExpanded = expandedCategory === category; const displaySuggestions = isExpanded ? categorySuggestions : categorySuggestions.slice(0, 2); return (
setExpandedCategory(isExpanded ? null : category)} >
{categoryInfo.icon} {categoryInfo.name} ({categorySuggestions.length})
{isExpanded ? '−' : '+'}
{displaySuggestions.map(renderSuggestion)} {categorySuggestions.length > 2 && !isExpanded && (
)}
); }; if (suggestions.length === 0) { return (
💡

No suggestions available

Start by analyzing your website to get personalized SEO suggestions.

); } return (

🎯 SEO Suggestions

Personalized recommendations based on your current SEO data

{showCategories ? ( // Grouped by category Object.entries(groupedSuggestions).map(([category, categorySuggestions]) => renderCategory(category, categorySuggestions) ) ) : ( // Flat list
{suggestions.slice(0, maxSuggestions).map(renderSuggestion)}
)}
); }; const SEOCopilotSuggestions = React.memo(SEOCopilotSuggestionsComponent); export default SEOCopilotSuggestions;