98 lines
4.6 KiB
TypeScript
98 lines
4.6 KiB
TypeScript
|
|
|
||
|
|
import React from 'react';
|
||
|
|
import { GlassCard } from '@/components/ui/GlassCard';
|
||
|
|
import { formatAmount } from '@/lib/utils';
|
||
|
|
import { DirhamIcon } from '@/components/ui/custom-icons';
|
||
|
|
import {
|
||
|
|
TrendingUp,
|
||
|
|
BarChart3,
|
||
|
|
ArrowUpRight,
|
||
|
|
Coins,
|
||
|
|
Library
|
||
|
|
} from 'lucide-react';
|
||
|
|
|
||
|
|
interface PortfolioSummaryCardsProps {
|
||
|
|
overview: {
|
||
|
|
totalValue: number;
|
||
|
|
totalInvested: number;
|
||
|
|
totalGains: number;
|
||
|
|
gainPercentage: number;
|
||
|
|
dayChange: number;
|
||
|
|
dayChangePercent: number;
|
||
|
|
};
|
||
|
|
holdingsCount: number;
|
||
|
|
}
|
||
|
|
|
||
|
|
const PortfolioSummaryCards: React.FC<PortfolioSummaryCardsProps> = ({ overview, holdingsCount }) => {
|
||
|
|
return (
|
||
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
||
|
|
{/* Total Value */}
|
||
|
|
<GlassCard className="p-6">
|
||
|
|
<div className="flex items-center justify-between mb-4">
|
||
|
|
<p className="text-sm font-medium text-slate-500">Total Value</p>
|
||
|
|
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-green-400 to-green-600 flex items-center justify-center shadow-lg shadow-green-200">
|
||
|
|
<BarChart3 className="w-5 h-5 text-white" />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center gap-1">
|
||
|
|
<DirhamIcon className="w-6 h-6 text-slate-900" />
|
||
|
|
<p className="text-2xl font-bold text-slate-900">{formatAmount(overview.totalValue)}</p>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center mt-2">
|
||
|
|
<TrendingUp className="w-4 h-4 text-green-500 mr-1" />
|
||
|
|
<span className="text-sm text-green-600 font-medium">+{overview.gainPercentage}%</span>
|
||
|
|
</div>
|
||
|
|
</GlassCard>
|
||
|
|
|
||
|
|
{/* Today's Change */}
|
||
|
|
<GlassCard className="p-6">
|
||
|
|
<div className="flex items-center justify-between mb-4">
|
||
|
|
<p className="text-sm font-medium text-slate-500">Today's Change</p>
|
||
|
|
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-cyan-400 to-cyan-600 flex items-center justify-center shadow-lg shadow-cyan-200">
|
||
|
|
<Coins className="w-5 h-5 text-white" />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center gap-1">
|
||
|
|
<DirhamIcon className="w-6 h-6 text-slate-900" />
|
||
|
|
<p className="text-2xl font-bold text-slate-900">{formatAmount(overview.dayChange)}</p>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center mt-2">
|
||
|
|
<ArrowUpRight className="w-4 h-4 text-green-500 mr-1" />
|
||
|
|
<span className="text-sm text-green-600 font-medium">+{overview.dayChangePercent}%</span>
|
||
|
|
</div>
|
||
|
|
</GlassCard>
|
||
|
|
|
||
|
|
{/* Holdings Count */}
|
||
|
|
<GlassCard className="p-6">
|
||
|
|
<div className="flex items-center justify-between mb-4">
|
||
|
|
<p className="text-sm font-medium text-slate-500">Holdings</p>
|
||
|
|
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-purple-400 to-purple-600 flex items-center justify-center shadow-lg shadow-purple-200">
|
||
|
|
<Library className="w-5 h-5 text-white" />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<p className="text-2xl font-bold text-slate-900">{holdingsCount}</p>
|
||
|
|
<p className="text-sm text-slate-500 mt-2">Active Positions</p>
|
||
|
|
</GlassCard>
|
||
|
|
|
||
|
|
{/* Performance / Total Gains */}
|
||
|
|
<GlassCard className="p-6">
|
||
|
|
<div className="flex items-center justify-between mb-4">
|
||
|
|
<p className="text-sm font-medium text-slate-500">Total Gains</p>
|
||
|
|
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-blue-400 to-blue-600 flex items-center justify-center shadow-lg shadow-blue-200">
|
||
|
|
<TrendingUp className="w-5 h-5 text-white" />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center gap-1">
|
||
|
|
<DirhamIcon className="w-6 h-6 text-slate-900" />
|
||
|
|
<p className="text-2xl font-bold text-slate-900">{formatAmount(overview.totalGains)}</p>
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center gap-1 text-xs text-slate-400 mt-2">
|
||
|
|
vs <DirhamIcon className="w-3 h-3" /> {formatAmount(overview.totalInvested)} invested
|
||
|
|
</div>
|
||
|
|
</GlassCard>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
export default PortfolioSummaryCards;
|