import React from 'react'; import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay'; import { ProviderLogo } from '@/components/ui/ProviderLogo'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Icon } from "@/components/icon/Icon"; import { cn } from '@/lib/utils'; import { QUOTA_PROVIDERS, resolveUsageTone } from '@/lib/quota'; import { useQuotaStore } from '@/stores/useQuotaStore'; import { updateDesktopSettings } from '@/lib/persistence'; import { useI18n } from '@/lib/i18n'; import { SETTINGS_PANEL_TITLE_CLASS } from '@/components/sections/shared/SettingsSection'; interface UsageSidebarProps { onItemSelect?: () => void; } const getUsagePercent = (usage: { windows?: Record } | null | undefined) => { const windows = usage?.windows ?? {}; const values = Object.values(windows) .map((window) => window.usedPercent) .filter((value): value is number => typeof value === 'number'); if (values.length === 0) { return null; } return Math.max(...values); }; export const UsageSidebar: React.FC = ({ onItemSelect }) => { const { t } = useI18n(); const results = useQuotaStore((state) => state.results); const selectedProviderId = useQuotaStore((state) => state.selectedProviderId); const setSelectedProvider = useQuotaStore((state) => state.setSelectedProvider); const fetchAllQuotas = useQuotaStore((state) => state.fetchAllQuotas); const isLoading = useQuotaStore((state) => state.isLoading); const usageDisplayMode = useQuotaStore((state) => state.displayMode); const setUsageDisplayMode = useQuotaStore((state) => state.setDisplayMode); const loadUsageSettings = useQuotaStore((state) => state.loadSettings); React.useEffect(() => { void loadUsageSettings(); }, [loadUsageSettings]); const persistUsageSettings = React.useCallback(async (changes: { usageDisplayMode?: 'usage' | 'remaining'; usageDropdownProviders?: string[] }) => { try { await updateDesktopSettings(changes); } catch (error) { console.warn('Failed to save usage settings:', error); } }, []); const handleUsageDisplayModeChange = React.useCallback((value: string) => { if (value !== 'usage' && value !== 'remaining') { return; } setUsageDisplayMode(value); void persistUsageSettings({ usageDisplayMode: value }); }, [persistUsageSettings, setUsageDisplayMode]); const bgClass = 'bg-background'; return (

{t('settings.usage.sidebar.title')}

{t('settings.usage.sidebar.total', { count: QUOTA_PROVIDERS.length })}
{t('settings.usage.sidebar.field.display')}
{QUOTA_PROVIDERS.map((provider) => { const result = results.find((entry) => entry.providerId === provider.id); const percent = getUsagePercent(result?.usage); const tone = resolveUsageTone(percent); const isSelected = provider.id === selectedProviderId; const configured = result?.configured; const statusStyle = !configured ? { backgroundColor: 'var(--surface-muted-foreground)', opacity: 0.4 } : tone === 'critical' ? { backgroundColor: 'var(--status-error)' } : tone === 'warn' ? { backgroundColor: 'var(--status-warning)' } : { backgroundColor: 'var(--status-success)' }; return (
); })}
); };