performance improvments

This commit is contained in:
dimitar committed 2026-03-18 02:04:09 +01:00
1 parent 912981e3f3
commit 02c9681aca
13 files changed
+805 -474

No files matched your search

@@ -1,75 +1,34 @@
'use client'
"use client";
import { useState, useEffect } from 'react'
import { UserGrowthChart } from '@/components/charts/UserGrowthChart'
import { MembershipDistributionChart } from '@/components/charts/MembershipDistributionChart'
import { RevenueChart } from '@/components/charts/RevenueChart'
import { Card, CardHeader, CardContent } from '@/components/ui/card'
interface ChartData {
label: string
value: number
color?: string
}
import { UserGrowthChart } from "@/components/charts/UserGrowthChart";
import { MembershipDistributionChart } from "@/components/charts/MembershipDistributionChart";
import { RevenueChart } from "@/components/charts/RevenueChart";
import { Card, CardHeader, CardContent } from "@/components/ui/card";
import { useAnalytics } from "@/hooks/use-api";
export function AnalyticsDashboard() {
const [userGrowthData, setUserGrowthData] = useState<ChartData[]>([])
const [membershipData, setMembershipData] = useState<ChartData[]>([])
const [revenueData, setRevenueData] = useState<ChartData[]>([])
const [loading, setLoading] = useState(true)
const { data: analytics, isLoading } = useAnalytics(6);
useEffect(() => {
fetchAnalyticsData()
}, [])
const userGrowthData = analytics?.userGrowth ?? [];
const membershipData = analytics?.membershipDistribution ?? [];
const revenueData = analytics?.revenue ?? [];
const fetchAnalyticsData = async () => {
setLoading(true)
try {
// Mock data for demonstration - replace with real API calls
const mockUserGrowth = [
{ label: 'Jan', value: 45 },
{ label: 'Feb', value: 52 },
{ label: 'Mar', value: 61 },
{ label: 'Apr', value: 58 },
{ label: 'May', value: 67 },
{ label: 'Jun', value: 74 },
]
const totalUsers =
userGrowthData.length > 0
? userGrowthData[userGrowthData.length - 1].value
: 0;
const totalRevenue = revenueData.reduce((sum, item) => sum + item.value, 0);
const activeMembers = membershipData.reduce(
(sum, item) => sum + item.value,
0,
);
const mockMembershipData = [
{ label: 'Basic', value: 45, color: '#6b7280' },
{ label: 'Premium', value: 28, color: '#3b82f6' },
{ label: 'VIP', value: 12, color: '#f59e0b' },
]
const mockRevenueData = [
{ label: 'Jan', value: 12500, color: '#10b981' },
{ label: 'Feb', value: 14200, color: '#10b981' },
{ label: 'Mar', value: 16800, color: '#10b981' },
{ label: 'Apr', value: 15900, color: '#10b981' },
{ label: 'May', value: 18200, color: '#10b981' },
{ label: 'Jun', value: 19400, color: '#10b981' },
]
setUserGrowthData(mockUserGrowth)
setMembershipData(mockMembershipData)
setRevenueData(mockRevenueData)
} catch (error) {
console.error('Failed to fetch analytics data:', error)
} finally {
setLoading(false)
}
}
const totalUsers = userGrowthData.length > 0 ? userGrowthData[userGrowthData.length - 1].value : 0
const totalRevenue = revenueData.reduce((sum, item) => sum + item.value, 0)
const activeMembers = membershipData.reduce((sum, item) => sum + item.value, 0)
if (loading) {
if (isLoading) {
return (
<div className="flex justify-center items-center h-64">
<div className="text-lg">Loading analytics...</div>
</div>
)
);
}
return (
@@ -81,7 +40,9 @@ export function AnalyticsDashboard() {
<Card>
<CardContent>
<div className="text-center">
<div className="text-3xl font-bold text-blue-600">{totalUsers}</div>
<div className="text-3xl font-bold text-blue-600">
{totalUsers}
</div>
<div className="text-gray-600">Total Users</div>
</div>
</CardContent>
@@ -90,7 +51,9 @@ export function AnalyticsDashboard() {
<Card>
<CardContent>
<div className="text-center">
<div className="text-3xl font-bold text-green-600">${totalRevenue.toLocaleString()}</div>
<div className="text-3xl font-bold text-green-600">
${totalRevenue.toLocaleString()}
</div>
<div className="text-gray-600">Total Revenue</div>
</div>
</CardContent>
@@ -99,7 +62,9 @@ export function AnalyticsDashboard() {
<Card>
<CardContent>
<div className="text-center">
<div className="text-3xl font-bold text-purple-600">{activeMembers}</div>
<div className="text-3xl font-bold text-purple-600">
{activeMembers}
</div>
<div className="text-gray-600">Active Members</div>
</div>
</CardContent>
@@ -133,14 +98,14 @@ export function AnalyticsDashboard() {
</CardHeader>
<CardContent>
<RevenueChart
data={revenueData.map(item => ({
data={revenueData.map((item) => ({
category: item.label,
value: item.value,
color: item.color
color: item.color,
}))}
/>
</CardContent>
</Card>
</div>
)
);
}