Analytics
This commit is contained in:
@@ -219,8 +219,14 @@ export default function AnalyticsPage() {
|
||||
<p className="text-2xl font-bold text-gray-900">
|
||||
{analyticsData?.summary.totalScans.toLocaleString() || '0'}
|
||||
</p>
|
||||
<p className={`text-sm mt-2 ${analyticsData?.summary.totalScans > 0 ? 'text-green-600' : 'text-gray-500'}`}>
|
||||
{analyticsData?.summary.totalScans > 0 ? '+12.5%' : 'No data'} from last period
|
||||
<p className={`text-sm mt-2 ${
|
||||
analyticsData?.summary.scansTrend?.trend === 'up' ? 'text-green-600' :
|
||||
analyticsData?.summary.scansTrend?.trend === 'down' ? 'text-red-600' :
|
||||
'text-gray-500'
|
||||
}`}>
|
||||
{analyticsData?.summary.scansTrend
|
||||
? `${analyticsData.summary.scansTrend.isNegative ? '-' : '+'}${analyticsData.summary.scansTrend.percentage}%${analyticsData.summary.scansTrend.isNew ? ' (new)' : ''} from last ${analyticsData.summary.comparisonPeriod || 'period'}`
|
||||
: 'No data'}
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
@@ -231,8 +237,14 @@ export default function AnalyticsPage() {
|
||||
<p className="text-2xl font-bold text-gray-900">
|
||||
{analyticsData?.summary.avgScansPerQR || '0'}
|
||||
</p>
|
||||
<p className={`text-sm mt-2 ${analyticsData?.summary.avgScansPerQR > 0 ? 'text-green-600' : 'text-gray-500'}`}>
|
||||
{analyticsData?.summary.avgScansPerQR > 0 ? '+8.3%' : 'No data'} from last period
|
||||
<p className={`text-sm mt-2 ${
|
||||
analyticsData?.summary.avgScansTrend?.trend === 'up' ? 'text-green-600' :
|
||||
analyticsData?.summary.avgScansTrend?.trend === 'down' ? 'text-red-600' :
|
||||
'text-gray-500'
|
||||
}`}>
|
||||
{analyticsData?.summary.avgScansTrend
|
||||
? `${analyticsData.summary.avgScansTrend.isNegative ? '-' : '+'}${analyticsData.summary.avgScansTrend.percentage}%${analyticsData.summary.avgScansTrend.isNew ? ' (new)' : ''} from last ${analyticsData.summary.comparisonPeriod || 'period'}`
|
||||
: 'No data'}
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
@@ -349,7 +361,7 @@ export default function AnalyticsPage() {
|
||||
country.trend === 'down' ? 'destructive' :
|
||||
'default'
|
||||
}>
|
||||
{country.trend === 'up' ? '↑' : country.trend === 'down' ? '↓' : '→'} {country.trendPercentage}%
|
||||
{country.trend === 'up' ? '↑' : country.trend === 'down' ? '↓' : '→'} {country.trendPercentage}%{country.isNew ? ' (new)' : ''}
|
||||
</Badge>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -398,7 +410,7 @@ export default function AnalyticsPage() {
|
||||
qr.trend === 'down' ? 'destructive' :
|
||||
'default'
|
||||
}>
|
||||
{qr.trend === 'up' ? '↑' : qr.trend === 'down' ? '↓' : '→'} {qr.trendPercentage}%
|
||||
{qr.trend === 'up' ? '↑' : qr.trend === 'down' ? '↓' : '→'} {qr.trendPercentage}%{qr.isNew ? ' (new)' : ''}
|
||||
</Badge>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -41,6 +41,7 @@ export default function DashboardPage() {
|
||||
activeQRCodes: 0,
|
||||
conversionRate: 0,
|
||||
});
|
||||
const [analyticsData, setAnalyticsData] = useState<any>(null);
|
||||
|
||||
const mockQRCodes = [
|
||||
{
|
||||
@@ -239,6 +240,13 @@ export default function DashboardPage() {
|
||||
const userData = await userResponse.json();
|
||||
setUserPlan(userData.plan || 'FREE');
|
||||
}
|
||||
|
||||
// Fetch analytics data for trends (last 30 days = month comparison)
|
||||
const analyticsResponse = await fetch('/api/analytics/summary?range=30');
|
||||
if (analyticsResponse.ok) {
|
||||
const analytics = await analyticsResponse.json();
|
||||
setAnalyticsData(analytics);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching data:', error);
|
||||
setQrCodes([]);
|
||||
@@ -357,7 +365,13 @@ export default function DashboardPage() {
|
||||
</div>
|
||||
|
||||
{/* Stats Grid */}
|
||||
<StatsGrid stats={stats} />
|
||||
<StatsGrid
|
||||
stats={stats}
|
||||
trends={{
|
||||
totalScans: analyticsData?.summary.scansTrend,
|
||||
comparisonPeriod: analyticsData?.summary.comparisonPeriod || 'month'
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* Recent QR Codes */}
|
||||
<div>
|
||||
|
||||
Reference in New Issue
Block a user