"use client"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent } from "@/app/_components/ui/card"; import { Users, UserCheck, UserX } from "lucide-react"; import { fetchUsers } from "@/app/(protected)/(admin)/dashboard/user-management/action"; import { User } from "@/src/models/users/users.model"; function calculateUserStats(users: User[]) { const totalUsers = users.length; const activeUsers = users.filter( (user) => !user.banned_until && user.email_confirmed_at ).length; const inactiveUsers = totalUsers - activeUsers; return { totalUsers, activeUsers, inactiveUsers, activePercentage: totalUsers > 0 ? ((activeUsers / totalUsers) * 100).toFixed(1) : "0.0", inactivePercentage: totalUsers > 0 ? ((inactiveUsers / totalUsers) * 100).toFixed(1) : "0.0", }; } export function UserStats() { const { data: users = [], isLoading } = useQuery({ queryKey: ["users"], queryFn: fetchUsers, }); const stats = calculateUserStats(users); if (isLoading) { return ( <> {[...Array(3)].map((_, i) => (
))} ); } const cards = [ { title: "Total Users", value: stats.totalUsers, subtitle: "Updated just now", icon: Users, }, { title: "Active Users", value: stats.activeUsers, subtitle: `${stats.activePercentage}% of total users`, icon: UserCheck, }, { title: "Inactive Users", value: stats.inactiveUsers, subtitle: `${stats.inactivePercentage}% of total users`, icon: UserX, }, ]; return ( <> {cards.map((card, index) => (
{card.title}
{card.value}
{card.subtitle}
))} ); }