/* 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 { formatCompactNumber, formatQuota } from '@/lib/format' import { getRoleLabel } from '@/lib/roles' import { Avatar, AvatarFallback } from '@/components/ui/avatar' import { Skeleton } from '@/components/ui/skeleton' import { StatusBadge } from '@/components/status-badge' import { getUserInitials, 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 (
{Array.from({ length: 3 }).map((_, i) => (
))}
) } if (!profile) return null const displayName = getDisplayName(profile) const initials = getUserInitials(profile) const roleLabel = getRoleLabel(profile.role) const stats = [ { label: t('Current Balance'), value: formatQuota(profile.quota), description: t('Remaining quota'), icon: WalletCards, }, { label: t('Total Usage'), value: formatQuota(profile.used_quota), description: t('Total consumed quota'), icon: BarChart3, }, { label: t('API Requests'), value: formatCompactNumber(profile.request_count), description: t('Total requests made'), icon: Activity, }, ] return (
{initials}

{displayName}

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