import React from 'react'; import { useCopilotActionTyped, useExecute, getDefaultUrl } from './helpers'; import { seoApiService } from '../../../services/seoApiService'; const OnPageUI: React.FC<{ args: any; respond: (data: any) => void }> = ({ args, respond }) => { const [keywords, setKeywords] = React.useState((args?.targetKeywords || []).join(', ')); const [analyzeImages, setAnalyzeImages] = React.useState(!!args?.analyzeImages); const [analyzeContentQuality, setAnalyzeContentQuality] = React.useState(!!args?.analyzeContentQuality); const [isRunning, setIsRunning] = React.useState(false); const [result, setResult] = React.useState(null); const [error, setError] = React.useState(null); const url = args?.url || getDefaultUrl(); const run = async () => { try { setIsRunning(true); setError(null); if (!url) throw new Error('No URL available'); const parsedKeywords = keywords.split(',').map(k => k.trim()).filter(Boolean); const res = await seoApiService.analyzeOnPageSEO({ url, target_keywords: parsedKeywords.length ? parsedKeywords : undefined, analyze_images: analyzeImages, analyze_content_quality: analyzeContentQuality }); setResult(res); respond({ success: true, url, targetKeywords: parsedKeywords, analyzeImages, analyzeContentQuality, result: res }); } catch (e: any) { setError(e?.message || 'Failed to analyze on-page SEO'); } finally { setIsRunning(false); } }; return (
On-page SEO analysis
URL: {url || 'Not available'}
Target keywords (comma-separated)
setKeywords(e.target.value)} style={{ width: '100%', padding: 6, fontSize: 12 }} />
{error &&
{error}
} {result && (
{JSON.stringify(result, null, 2)}
)}
); }; const RegisterOnPage: React.FC = () => { const execute = useExecute(); const useAction = useCopilotActionTyped(); useAction({ name: 'analyzeOnPageSEO', description: 'Analyze on-page SEO elements and provide optimization recommendations', parameters: [ { name: 'url', type: 'string', description: 'URL to analyze (optional)', required: false }, { name: 'targetKeywords', type: 'string[]', description: 'Target keywords (optional)', required: false }, { name: 'analyzeImages', type: 'boolean', description: 'Analyze images', required: false }, { name: 'analyzeContentQuality', type: 'boolean', description: 'Analyze content quality', required: false } ], renderAndWaitForResponse: ({ args, respond }: any) => , handler: async (args: any) => { const url = args?.url || getDefaultUrl(); return await execute('analyzeOnPageSEO', { ...args, url }); } }); return null; }; export default RegisterOnPage;