diff --git a/ccw/frontend/src/components/api-settings/CacheSettings.tsx b/ccw/frontend/src/components/api-settings/CacheSettings.tsx new file mode 100644 index 00000000..ce1cf6fa --- /dev/null +++ b/ccw/frontend/src/components/api-settings/CacheSettings.tsx @@ -0,0 +1,301 @@ +// ======================================== +// Cache Settings Component +// ======================================== +// Global cache configuration form with statistics display + +import { useState, useEffect } from 'react'; +import { useIntl } from 'react-intl'; +import { + Database, + Trash2, + Save, + HardDrive, + FileText, +} from 'lucide-react'; +import { Card } from '@/components/ui/Card'; +import { Button } from '@/components/ui/Button'; +import { Input } from '@/components/ui/Input'; +import { Label } from '@/components/ui/Label'; +import { Switch } from '@/components/ui/Switch'; +import { Progress } from '@/components/ui/Progress'; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from '@/components/ui/AlertDialog'; +import { + useCacheStats, + useUpdateCacheSettings, + useClearCache, +} from '@/hooks/useApiSettings'; +import { useNotifications } from '@/hooks/useNotifications'; +import type { GlobalCacheSettings } from '@/lib/api'; +import { cn } from '@/lib/utils'; + +// ========== Types ========== + +export interface CacheSettingsProps { + className?: string; +} + +// ========== Helper Components ========== + +interface CacheUsageIndicatorProps { + used: number; + total: number; +} + +function CacheUsageIndicator({ used, total }: CacheUsageIndicatorProps) { + const { formatMessage } = useIntl(); + const percentage = total > 0 ? Math.round((used / total) * 100) : 0; + + return ( +
{label}
+{value}
+{cliSettings.description}
+ )} ++ {formatMessage({ id: 'apiSettings.cliSettings.stats.total' })} +
++ {formatMessage({ id: 'apiSettings.cliSettings.stats.enabled' })} +
++ {formatMessage({ id: 'apiSettings.cliSettings.providerBased' })} +
++ {formatMessage({ id: 'apiSettings.cliSettings.direct' })} +
++ {formatMessage({ id: 'apiSettings.cliSettings.emptyState.message' })} +
+{endpoint.name}
+{endpoint.description}
+ )} + {endpoint.cacheStrategy.enabled && ( ++ {formatMessage({ id: 'apiSettings.endpoints.description' })} +
++ {formatMessage({ id: 'apiSettings.endpoints.stats.totalEndpoints' })} +
++ {formatMessage({ id: 'apiSettings.endpoints.stats.cachedEndpoints' })} +
++ {formatMessage({ id: 'apiSettings.endpoints.emptyState.message' })} +
+ ++ {formatMessage({ id: 'apiSettings.modelPools.targetModel' })}: {pool.targetModel} +
+{pool.description}
+ )} + +{label}
+{value}
++ {formatMessage({ id: 'apiSettings.modelPools.emptyState.message' })} +
+ +{provider.apiBase}
+ )} ++ {formatMessage({ id: 'apiSettings.providers.description' })} +
++ {formatMessage({ id: 'apiSettings.providers.stats.total' })} +
++ {formatMessage({ id: 'apiSettings.providers.stats.enabled' })} +
++ {formatMessage({ id: 'apiSettings.providers.emptyState.message' })} +
+ ++ {formatMessage({ id: 'apiSettings.description' })} +
+