feat(seo-copilot): caching + freshness UI; glassomorphic styling; CopilotKit HITL modular actions; provider fixes; DB sessions & action types; seed 17 actions
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import React, { useEffect, useMemo } from 'react';
|
||||
import { useCopilotChat } from '@copilotkit/react-core';
|
||||
|
||||
// A lightweight controller that sets top-level suggestion groups and
|
||||
// updates sub-suggestions based on the latest user message.
|
||||
const SEOSuggestionsController: React.FC = () => {
|
||||
// Use a permissive cast to support variations across library versions
|
||||
const chat = useCopilotChat() as any;
|
||||
const messages = (chat && chat.messages) || [];
|
||||
const setSuggestions: ((s: { title: string; message: string }[]) => void) =
|
||||
(chat && chat.setSuggestions) || (() => {});
|
||||
|
||||
// Top-level groups for progressive disclosure
|
||||
const topLevelGroups = useMemo(
|
||||
() => [
|
||||
{ title: 'Content analysis', message: 'Content analysis' },
|
||||
{ title: 'Website/URL analysis', message: 'Web URL analysis' },
|
||||
{ title: 'Technical SEO', message: 'Technical SEO' },
|
||||
{ title: 'Strategy & planning', message: 'Strategy and planning' },
|
||||
{ title: 'Monitoring & health', message: 'Monitoring and health' }
|
||||
],
|
||||
[]
|
||||
);
|
||||
|
||||
// Sub-suggestions mapped by group selection
|
||||
const subSuggestionsByGroup = useMemo(
|
||||
() => ({
|
||||
'Content analysis': [
|
||||
{ title: 'Comprehensive content analysis', message: 'Analyze content comprehensively for my site' },
|
||||
{ title: 'Optimize page content', message: 'Optimize page content for SEO' },
|
||||
{ title: 'Generate meta descriptions', message: 'Generate meta descriptions for key pages' }
|
||||
],
|
||||
'Web URL analysis': [
|
||||
{ title: 'Comprehensive SEO analysis', message: 'Run comprehensive SEO analysis for a URL' },
|
||||
{ title: 'Analyze page speed', message: 'Analyze page speed for a URL' },
|
||||
{ title: 'Analyze sitemap', message: 'Analyze sitemap for my site' },
|
||||
{ title: 'Generate OpenGraph tags', message: 'Generate OpenGraph tags for a URL' }
|
||||
],
|
||||
'Technical SEO': [
|
||||
{ title: 'Technical SEO audit', message: 'Run a technical SEO audit' },
|
||||
{ title: 'Check SEO health', message: 'Check overall SEO health' },
|
||||
{ title: 'Image alt text', message: 'Generate image alt text for pages' }
|
||||
],
|
||||
'Strategy and planning': [
|
||||
{ title: 'Enterprise SEO analysis', message: 'Run enterprise SEO analysis' },
|
||||
{ title: 'Content strategy', message: 'Analyze content strategy and recommendations' },
|
||||
{ title: 'Customize SEO dashboard', message: 'Customize the SEO dashboard' }
|
||||
],
|
||||
'Monitoring and health': [
|
||||
{ title: 'Website audit', message: 'Perform a website audit' },
|
||||
{ title: 'Update SEO charts', message: 'Update SEO charts and visualizations' },
|
||||
{ title: 'Explain an SEO concept', message: 'Explain an SEO concept in simple terms' }
|
||||
]
|
||||
}),
|
||||
[]
|
||||
);
|
||||
|
||||
// Initialize top-level suggestions on mount
|
||||
useEffect(() => {
|
||||
setSuggestions(topLevelGroups);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
// When the latest user message matches a group name, show its sub-suggestions
|
||||
useEffect(() => {
|
||||
if (!messages || messages.length === 0) return;
|
||||
const last = messages[messages.length - 1];
|
||||
if (last?.role !== 'user') return;
|
||||
|
||||
const text = (last.content || '').trim();
|
||||
const group = Object.keys(subSuggestionsByGroup).find(
|
||||
key => key.toLowerCase() === text.toLowerCase()
|
||||
);
|
||||
|
||||
if (group) {
|
||||
setSuggestions(subSuggestionsByGroup[group as keyof typeof subSuggestionsByGroup]);
|
||||
} else {
|
||||
if (text.length > 0 && !Object.keys(subSuggestionsByGroup).some(k => text.toLowerCase().includes(k.toLowerCase()))) {
|
||||
setSuggestions(topLevelGroups);
|
||||
}
|
||||
}
|
||||
}, [messages, setSuggestions, subSuggestionsByGroup, topLevelGroups]);
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export default SEOSuggestionsController;
|
||||
Reference in New Issue
Block a user