/**
* 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;