import React, { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useAppConfig } from '@/hooks/useAppConfig'; import { useCloudAccounts } from '@/hooks/useCloudAccounts'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Checkbox } from '@/components/ui/checkbox'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; import { Label } from '@/components/ui/label'; import { Loader2, Search, RotateCcw, Save } from 'lucide-react'; interface ModelVisibilitySettingsProps {} export const ModelVisibilitySettings: React.FC = () => { const { t } = useTranslation(); const { config, saveConfig } = useAppConfig(); const { data: accounts, isLoading: accountsLoading } = useCloudAccounts(); const [searchTerm, setSearchTerm] = useState(''); const [modelVisibility, setModelVisibility] = useState>({}); const [providerGroupingsEnabled, setProviderGroupingsEnabled] = useState(false); const [isSaving, setIsSaving] = useState(false); // Initialize model visibility and provider groupings from config React.useEffect(() => { if (config?.model_visibility) { setModelVisibility(config.model_visibility); } if (config?.provider_groupings_enabled !== undefined) { setProviderGroupingsEnabled(config.provider_groupings_enabled); } }, [config?.model_visibility, config?.provider_groupings_enabled]); // Get all unique models from all accounts const allModels = useMemo(() => { if (!accounts) return []; const modelSet = new Set(); accounts.forEach((account) => { if (account.quota?.models) { Object.keys(account.quota.models).forEach((model) => { modelSet.add(model); }); } }); return Array.from(modelSet).sort(); }, [accounts]); // Filter models based on search term const filteredModels = useMemo(() => { return allModels.filter((model) => model.toLowerCase().includes(searchTerm.toLowerCase())); }, [allModels, searchTerm]); // Handle model visibility toggle const handleModelToggle = (modelName: string, checked: boolean) => { setModelVisibility((prev) => ({ ...prev, [modelName]: checked, })); }; // Reset to defaults (all models visible) const handleReset = () => { setModelVisibility({}); }; // Save configuration const handleSave = async () => { if (!config) return; setIsSaving(true); try { await saveConfig({ ...config, model_visibility: modelVisibility, provider_groupings_enabled: providerGroupingsEnabled, }); } catch (error) { console.error('Failed to save model visibility settings:', error); } finally { setIsSaving(false); } }; if (accountsLoading) { return ( {t('common.loading')} ); } return ( {t('settings.modelVisibility.title')} {filteredModels.length} models {t('settings.modelVisibility.description')} {/* Search */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* Provider Groupings Toggle */}

{t('settings.providerGroupings.description')}

{/* Model List */}
{filteredModels.length === 0 ? (
{searchTerm ? t('settings.modelVisibility.noModelsFound') : t('settings.modelVisibility.noModels')}
) : ( filteredModels.map((modelName) => { const isVisible = modelVisibility[modelName] !== false; // Default to true return (
handleModelToggle(modelName, checked as boolean)} /> {!isVisible && ( {t('settings.modelVisibility.hidden')} )}
); }) )}
{/* Action Buttons */}
{/* Statistics */}
{t('settings.modelVisibility.totalModels')}: {allModels.length} {t('settings.modelVisibility.visibleModels')}:{' '} {allModels.length - Object.values(modelVisibility).filter((v) => !v).length} {t('settings.modelVisibility.hiddenModels')}:{' '} {Object.values(modelVisibility).filter((v) => !v).length}
); };