/** * Gemini CLI quota section component. */ import { useCallback, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { EmptyState } from '@/components/ui/EmptyState'; import { useQuotaStore, useThemeStore } from '@/stores'; import type { GeminiCliQuotaState, AuthFileItem, ResolvedTheme } from '@/types'; import { isGeminiCliFile, isRuntimeOnlyAuthFile } from '@/utils/quota'; import { useQuotaSection } from '../hooks/useQuotaSection'; import { useGeminiCliQuota } from './useGeminiCliQuota'; import { GeminiCliCard } from './GeminiCliCard'; import styles from '@/pages/QuotaPage.module.scss'; interface GeminiCliSectionProps { files: AuthFileItem[]; loading: boolean; disabled: boolean; } export function GeminiCliSection({ files, loading, disabled }: GeminiCliSectionProps) { const { t } = useTranslation(); const resolvedTheme: ResolvedTheme = useThemeStore((state) => state.resolvedTheme); const setGeminiCliQuota = useQuotaStore((state) => state.setGeminiCliQuota); const geminiCliFiles = useMemo( () => files.filter((file) => isGeminiCliFile(file) && !isRuntimeOnlyAuthFile(file)), [files] ); const { pageSize, totalPages, currentPage, pageItems, setPageSize, goToPrev, goToNext, loading: sectionLoading, loadingScope, setLoading } = useQuotaSection({ items: geminiCliFiles }); const { quota, loadQuota } = useGeminiCliQuota(); const handleRefreshPage = useCallback(() => { loadQuota(pageItems, 'page', setLoading); }, [loadQuota, pageItems, setLoading]); const handleRefreshAll = useCallback(() => { loadQuota(geminiCliFiles, 'all', setLoading); }, [loadQuota, geminiCliFiles, setLoading]); const getQuotaErrorMessage = useCallback( (status: number | undefined, fallback: string) => { if (status === 404) return t('common.quota_update_required'); if (status === 403) return t('common.quota_check_credential'); return fallback; }, [t] ); // Sync quota state when files change useEffect(() => { if (loading) return; if (geminiCliFiles.length === 0) { setGeminiCliQuota({}); return; } setGeminiCliQuota((prev) => { const nextState: Record = {}; geminiCliFiles.forEach((file) => { const cached = prev[file.name]; if (cached) { nextState[file.name] = cached; } }); return nextState; }); }, [geminiCliFiles, loading, setGeminiCliQuota]); return ( } > {geminiCliFiles.length === 0 ? ( ) : ( <>
{geminiCliFiles.length} {t('auth_files.files_count')}
{pageItems.map((item) => ( ))}
{geminiCliFiles.length > pageSize && (
{t('auth_files.pagination_info', { current: currentPage, total: totalPages, count: geminiCliFiles.length })}
)} )}
); }