104 lines
2.9 KiB
TypeScript
104 lines
2.9 KiB
TypeScript
import { apiClient } from './client';
|
|
|
|
// Semantic health metric interface matching backend SemanticHealthMetric
|
|
export interface SemanticHealthMetric {
|
|
metric_name: string;
|
|
value: number;
|
|
threshold: number;
|
|
status: 'healthy' | 'warning' | 'critical';
|
|
timestamp: string;
|
|
description: string;
|
|
recommendations: string[];
|
|
}
|
|
|
|
// Competitor semantic snapshot interface
|
|
export interface CompetitorSemanticSnapshot {
|
|
competitor_id: string;
|
|
competitor_name: string;
|
|
semantic_overlap: number;
|
|
unique_topics: string[];
|
|
content_volume: number;
|
|
authority_score: number;
|
|
last_updated: string;
|
|
trending_topics: string[];
|
|
}
|
|
|
|
// Content semantic insight interface
|
|
export interface ContentSemanticInsight {
|
|
insight_id: string;
|
|
insight_type: 'gap' | 'opportunity' | 'trend' | 'threat';
|
|
title: string;
|
|
description: string;
|
|
confidence_score: number;
|
|
impact_score: number;
|
|
related_topics: string[];
|
|
suggested_actions: string[];
|
|
created_at: string;
|
|
expires_at: string;
|
|
}
|
|
|
|
// Semantic dashboard data interface
|
|
export interface SemanticDashboardData {
|
|
health_metrics: SemanticHealthMetric[];
|
|
competitor_snapshots: CompetitorSemanticSnapshot[];
|
|
content_insights: ContentSemanticInsight[];
|
|
monitoring_status: 'active' | 'inactive';
|
|
last_updated: string;
|
|
}
|
|
|
|
// Semantic Dashboard API functions
|
|
export const semanticDashboardAPI = {
|
|
// Get semantic health metrics
|
|
async getSemanticHealth(): Promise<SemanticHealthMetric> {
|
|
try {
|
|
const response = await apiClient.get('/api/seo-dashboard/semantic-health');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Error fetching semantic health:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
// Get complete semantic dashboard data
|
|
async getSemanticDashboardData(): Promise<SemanticDashboardData> {
|
|
try {
|
|
const response = await apiClient.get('/api/semantic-dashboard/data');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Error fetching semantic dashboard data:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
// Get competitor semantic snapshots
|
|
async getCompetitorSnapshots(): Promise<CompetitorSemanticSnapshot[]> {
|
|
try {
|
|
const response = await apiClient.get('/api/semantic-dashboard/competitors');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Error fetching competitor snapshots:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
// Get content insights
|
|
async getContentInsights(): Promise<ContentSemanticInsight[]> {
|
|
try {
|
|
const response = await apiClient.get('/api/semantic-dashboard/insights');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Error fetching content insights:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
// Refresh semantic analysis
|
|
async refreshSemanticAnalysis(): Promise<void> {
|
|
try {
|
|
await apiClient.post('/api/semantic-dashboard/refresh');
|
|
} catch (error) {
|
|
console.error('Error refreshing semantic analysis:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
}; |