# Dashboard Component Code Implementation
This file contains the complete code implementation for the dashboard component example.
## Initial Implementation
```tsx
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Users, Activity, DollarSign, BarChart, ArrowUp, ArrowDown, Bell, Settings } from 'lucide-react';
interface DashboardProps {
metrics: {
totalUsers: number;
activeUsers: number;
revenue: number;
conversionRate: number;
};
recentActivity: Array<{
id: string;
user: {
name: string;
avatar?: string;
};
action: string;
timestamp: string;
}>;
userData: {
name: string;
email: string;
avatar?: string;
role: string;
};
}
export function Dashboard({ metrics, recentActivity, userData }: DashboardProps) {
return (
{/* Header */}
Dashboard
Welcome back, {userData.name}
{userData.name.split(' ').map(n => n[0]).join('')}
{/* Metrics */}
}
trend={5.2}
color="blue"
/>
}
trend={2.4}
color="emerald"
/>
}
trend={8.7}
color="blue"
/>
}
trend={-1.5}
color="slate"
/>
{/* Content Area */}
{/* Recent Activity */}
Recent Activity
{recentActivity.map((activity) => (
{activity.user.name.split(' ').map(n => n[0]).join('')}
{activity.user.name}
{activity.action}
{activity.timestamp}
))}
{/* User Profile */}
Your Profile
{userData.name.split(' ').map(n => n[0]).join('')}
{userData.name}
{userData.email}
{userData.role}
);
}
interface MetricCardProps {
title: string;
value: string;
icon: React.ReactNode;
trend: number;
color: 'blue' | 'emerald' | 'slate';
}
function MetricCard({ title, value, icon, trend, color }: MetricCardProps) {
const colorClasses = {
blue: {
bg: 'bg-blue-50',
text: 'text-blue-600',
icon: 'bg-blue-100 text-blue-600',
},
emerald: {
bg: 'bg-emerald-50',
text: 'text-emerald-600',
icon: 'bg-emerald-100 text-emerald-600',
},
slate: {
bg: 'bg-slate-50',
text: 'text-slate-600',
icon: 'bg-slate-100 text-slate-600',
},
};
return (
{trend >= 0 ? (
) : (
)}
= 0 ? 'text-emerald-500' : 'text-red-500'}>
{Math.abs(trend)}%
vs last month
);
}
```
## Final Refined Implementation
```tsx
import React, { useState } from 'react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Users, Activity, DollarSign, BarChart, ArrowUp, ArrowDown, Bell, Settings, Calendar } from 'lucide-react';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { Skeleton } from '@/components/ui/skeleton';
interface DashboardProps {
metrics: {
totalUsers: number;
activeUsers: number;
revenue: number;
conversionRate: number;
};
recentActivity: Array<{
id: string;
user: {
name: string;
avatar?: string;
};
action: string;
timestamp: string;
}>;
userData: {
name: string;
email: string;
avatar?: string;
role: string;
};
isLoading?: boolean;
}
export function Dashboard({
metrics,
recentActivity,
userData,
isLoading = false
}: DashboardProps) {
const [dateRange, setDateRange] = useState('last-30-days');
if (isLoading) {
return ;
}
return (
{/* Header */}
Dashboard
Welcome back, {userData.name}
{userData.name.split(' ').map(n => n[0]).join('')}
{/* Metrics */}
}
trend={5.2}
color="blue"
ariaLabel="Total users metric"
/>
}
trend={2.4}
color="emerald"
ariaLabel="Active users metric"
/>
}
trend={8.7}
color="blue"
ariaLabel="Revenue metric"
/>
}
trend={-1.5}
color="slate"
ariaLabel="Conversion rate metric"
/>
{/* Content Area */}
{/* Recent Activity */}
Recent Activity
{recentActivity.length > 0 ? (
recentActivity.map((activity) => (
{activity.user.name.split(' ').map(n => n[0]).join('')}
{activity.user.name}
{activity.action}
{activity.timestamp}
))
) : (
No recent activity
)}
{/* User Profile */}
Your Profile
{userData.name.split(' ').map(n => n[0]).join('')}
{userData.name}
{userData.email}
{userData.role}
);
}
interface MetricCardProps {
title: string;
value: string;
icon: React.ReactNode;
trend: number;
color: 'blue' | 'emerald' | 'slate';
ariaLabel: string;
}
function MetricCard({ title, value, icon, trend, color, ariaLabel }: MetricCardProps) {
const colorClasses = {
blue: {
bg: 'bg-blue-50',
text: 'text-blue-600',
icon: 'bg-blue-100 text-blue-600',
},
emerald: {
bg: 'bg-emerald-50',
text: 'text-emerald-600',
icon: 'bg-emerald-100 text-emerald-600',
},
slate: {
bg: 'bg-slate-50',
text: 'text-slate-600',
icon: 'bg-slate-100 text-slate-600',
},
};
const trendText = `${Math.abs(trend)}% ${trend >= 0 ? 'increase' : 'decrease'} compared to last month`;
return (
{trend >= 0 ? (
) : (
)}
= 0 ? 'text-emerald-500' : 'text-red-500'}>
{Math.abs(trend)}%
vs last month
);
}
function DashboardSkeleton() {
return (
{/* Header Skeleton */}
{/* Metrics Skeleton */}
{[1, 2, 3, 4].map((i) => (
))}
{/* Content Area Skeleton */}
{[1, 2, 3, 4].map((i) => (
))}
);
}
```
## Example Usage
```tsx
// Example usage
import { Dashboard } from './components/Dashboard';
export default function DashboardPage() {
const [isLoading, setIsLoading] = useState(true);
const [dashboardData, setDashboardData] = useState({
metrics: {
totalUsers: 0,
activeUsers: 0,
revenue: 0,
conversionRate: 0
},
recentActivity: [],
userData: {
name: '',
email: '',
role: ''
}
});
useEffect(() => {
// Simulate API call
setTimeout(() => {
setDashboardData({
metrics: {
totalUsers: 12487,
activeUsers: 8761,
revenue: 48395,
conversionRate: 12.8
},
recentActivity: [
{
id: '1',
user: {
name: 'John Smith',
avatar: '/avatars/john.jpg'
},
action: 'Created a new project "Q4 Marketing Campaign"',
timestamp: '2 minutes ago'
},
{
id: '2',
user: {
name: 'Sarah Johnson',
avatar: '/avatars/sarah.jpg'
},
action: 'Updated the analytics dashboard settings',
timestamp: '1 hour ago'
},
{
id: '3',
user: {
name: 'Michael Brown',
avatar: '/avatars/michael.jpg'
},
action: 'Invited 3 new team members',
timestamp: '3 hours ago'
},
{
id: '4',
user: {
name: 'Emily Davis',
avatar: '/avatars/emily.jpg'
},
action: 'Completed the quarterly report',
timestamp: 'Yesterday'
}
],
userData: {
name: 'Alex Morgan',
email: 'alex.morgan@example.com',
avatar: '/avatars/alex.jpg',
role: 'Admin'
}
});
setIsLoading(false);
}, 1500);
}, []);
return (
);
}