/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { Activity, BarChart3, WalletCards } from 'lucide-react' import { useTranslation } from 'react-i18next' import { StatusBadge } from '@/components/status-badge' import { Avatar, AvatarFallback } from '@/components/ui/avatar' import { Card, CardContent } from '@/components/ui/card' import { IconBadge, type IconBadgeTone } from '@/components/ui/icon-badge' import { Skeleton } from '@/components/ui/skeleton' import { getUserAvatarFallback, getUserAvatarStyle } from '@/lib/avatar' import { formatCompactNumber, formatQuota } from '@/lib/format' import { getRoleLabel } from '@/lib/roles' import { getDisplayName } from '../lib' import type { UserProfile } from '../types' // ============================================================================ // Profile Header Component // ============================================================================ interface ProfileHeaderProps { profile: UserProfile | null loading: boolean } export function ProfileHeader({ profile, loading }: ProfileHeaderProps) { const { t } = useTranslation() if (loading) { return (
{['balance', 'usage', 'requests'].map((key) => (
))}
) } if (!profile) return null const displayName = getDisplayName(profile) const avatarName = profile.username || displayName const avatarFallback = getUserAvatarFallback(avatarName) const avatarFallbackStyle = getUserAvatarStyle(avatarName) const roleLabel = getRoleLabel(profile.role) const stats: { label: string value: string description: string icon: typeof WalletCards tone: IconBadgeTone }[] = [ { label: t('Current Balance'), value: formatQuota(profile.quota), description: t('Remaining quota'), icon: WalletCards, tone: 'success', }, { label: t('Total Usage'), value: formatQuota(profile.used_quota), description: t('Total consumed quota'), icon: BarChart3, tone: 'info', }, { label: t('API Requests'), value: formatCompactNumber(profile.request_count), description: t('Total requests made'), icon: Activity, tone: 'chart-4', }, ] return (
{avatarFallback}

{displayName}

@{profile.username} {profile.email && ( <> {profile.email} )} {profile.group && ( <> {profile.group} )}
{stats.map((item) => (
{item.label}
{item.value}
{item.description}
))}
) }