import { prisma } from "@/lib/prisma"; import { Users, Eye, MousePointer2, TrendingUp, Clock, ArrowUpRight, ArrowDownRight, Monitor, Calendar, } from "lucide-react"; import { cn } from "@/lib/utils"; export const dynamic = "force-dynamic"; async function getStats() { const [totalVisitors, totalPageViews, recentSessions] = await Promise.all([ prisma.session.count(), prisma.pageView.count(), prisma.session.findMany({ take: 5, orderBy: { lastSeenAt: "desc" }, include: { _count: { select: { pageViews: true }, }, }, }), ]); return { totalVisitors, totalPageViews, recentSessions, }; } export default async function DashboardPage() { const stats = await getStats(); return (

Dashboard Overview

Monitor your portfolio performance and user engagement.

{/* Stats Grid */}
{/* Recent Activity */}

Recent Visitor Activity

{stats.recentSessions.map((session) => ( ))} {stats.recentSessions.length === 0 && ( )}
Visitor ID Page Views Last Active Status
{session.visitorId.slice(0, 8)}...
ID: {session.id.slice(0, 6)}
{session._count.pageViews} pages
{new Date(session.lastSeenAt).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", })}
{new Date(session.lastSeenAt).toLocaleDateString()}
Active
No recent activity found.
{/* Quick Stats / Info */}

Total Period

Period Started Jan 01, 2024
Today's Visits 84
Growth is up 12% this week

Pro Tip

Updating your project descriptions with relevant keywords can help improve your portfolio's search engine visibility and attract more visitors.

); } function StatCard({ label, value, icon: Icon, trend, description, }: { label: string; value: string; icon: any; trend: number; description: string; }) { const isPositive = trend > 0; return (
{isPositive ? ( ) : ( )} {Math.abs(trend)}%

{label}

{value}

{description}

); }