/** * Usage Analytics Page Component * * AI usage analytics and performance tracking with real data integration * * @package ThinkRank * @since 1.0.0 */ import { __ } from '@wordpress/i18n'; import { Card, CardBody, CardHeader, Spinner, Notice, SelectControl, TabPanel } from '@wordpress/components'; import { useSelect, useDispatch } from '@wordpress/data'; import { useEffect, useState } from '@wordpress/element'; import { edit, chartBar, currencyDollar, backup, plugins, starFilled, check, trendingUp } from '@wordpress/icons'; import UsageBreakdown from './UsageBreakdown'; /** * Icon Component - Renders WordPress icons consistently */ const Icon = ({ icon, className = "thinkrank-w-5 thinkrank-h-5" }) => { return ( {icon} ); }; /** * MetricCard Component */ const MetricCard = ({ title, value, change, prefix = '', suffix = '', subtitle = '', icon = null }) => { const changeColorClass = change > 0 ? 'thinkrank-text-green' : change < 0 ? 'thinkrank-text-red' : 'thinkrank-text-secondary'; const changeSymbol = change > 0 ? '+' : ''; // More meaningful text for zero change const getChangeText = () => { if (change !== 0) { return `${changeSymbol}${change}%`; } // Show meaningful text based on the metric type if (title.includes('Success Rate')) return 'Successful AI Responses'; if (title.includes('Features Used')) return 'Diverse toolkit usage'; if (title.includes('Most Used')) return ''; // No change text needed - has subtitle if (title.includes('AI Optimizations')) return 'Total count'; return 'No change'; }; return (
{icon && }

{title}

{prefix}{typeof value === 'number' ? value.toLocaleString() : value}{suffix}

{subtitle &&

{subtitle}

}

{getChangeText()}

); }; /** * Overview Tab Component */ const OverviewTab = () => { const [period, setPeriod] = useState('30d'); // Select data from the analytics store const { dashboardMetrics, isLoading, error, hasData, lastUpdated, featureBreakdown, providerBreakdown } = useSelect((select) => { const analyticsSelect = select('thinkrank/analytics'); return { dashboardMetrics: analyticsSelect.getDashboardMetrics(), isLoading: analyticsSelect.getIsLoading(), error: analyticsSelect.getError(), hasData: analyticsSelect.hasData(), lastUpdated: analyticsSelect.getLastUpdated(), featureBreakdown: analyticsSelect.getFeatureBreakdown(), providerBreakdown: analyticsSelect.getProviderBreakdown() }; }, []); // Get dispatch functions const { fetchMetrics } = useDispatch('thinkrank/analytics'); // Fetch data on component mount and when period changes useEffect(() => { fetchMetrics(period); }, [period, fetchMetrics]); // Period options const periodOptions = [ { label: __('Last 7 days', 'thinkrank'), value: '7d' }, { label: __('Last 30 days', 'thinkrank'), value: '30d' }, { label: __('Last 90 days', 'thinkrank'), value: '90d' }, { label: __('All time', 'thinkrank'), value: 'all' } ]; return (

{__('Usage Overview', 'thinkrank')}

{error && (

{__('Error loading analytics data:', 'thinkrank')} {error.message}

)} {isLoading && (

{__('Loading analytics data...', 'thinkrank')}

)} {!isLoading && !error && ( <> {/* Row 1: Core Performance Metrics */}
{/* Row 2: Feature & Efficiency Metrics */}
{!hasData && (

{__('No analytics data available yet. Start using AI features to see your usage statistics.', 'thinkrank')}

)} {hasData && (

{__('Feature Usage Breakdown', 'thinkrank')}

{Object.entries(featureBreakdown).map(([feature, count]) => (
{feature.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()).replace(/\bSeo\b/g, 'SEO')} {count}
))}

{__('Provider Cost Breakdown', 'thinkrank')}

{Object.entries(providerBreakdown).map(([provider, data]) => (
{provider.charAt(0).toUpperCase() + provider.slice(1)} ${data.cost?.toFixed(4) || '0.0000'} ({data.percentage || 0}%)
))}
)} {lastUpdated && (

{__('Last updated:', 'thinkrank')} {new Date(lastUpdated).toLocaleString()}

)} )}
); }; /** * Main Analytics Component with Tabs */ const Analytics = () => { const tabs = [ { name: 'overview', title: __('Overview', 'thinkrank'), className: 'thinkrank-tab-overview' }, { name: 'usage-breakdown', title: __('Usage Breakdown', 'thinkrank'), className: 'thinkrank-tab-usage-breakdown' } ]; return (

{__('AI Usage & Performance Analytics', 'thinkrank')}

{__('Track your AI usage, costs, and plugin performance analytics', 'thinkrank')}

{(tab) => { switch (tab.name) { case 'overview': return ; case 'usage-breakdown': return ; default: return ; } }}
); }; export default Analytics;