SettingsPage.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import React, { useState, useEffect, useCallback } from 'react';
  2. import { useAuth } from '../../contexts/AuthContext';
  3. import { SettingsView } from '../../../components/views/SettingsView';
  4. import { ModelConfig, DEFAULT_MODELS } from '../../../types';
  5. import { modelConfigService } from '../../../services/modelConfigService';
  6. interface SettingsPageProps {
  7. initialTab?: 'general' | 'user' | 'model' | 'tenants' | 'knowledge_base';
  8. }
  9. export default function SettingsPage({ initialTab }: SettingsPageProps) {
  10. const { apiKey, user } = useAuth();
  11. const [modelConfigs, setModelConfigs] = useState<ModelConfig[]>(DEFAULT_MODELS);
  12. const fetchModels = useCallback(async () => {
  13. if (!apiKey) return;
  14. try {
  15. const backendModels = await modelConfigService.getAll(apiKey);
  16. const map = new Map<string, ModelConfig>();
  17. DEFAULT_MODELS.forEach(m => map.set(m.id, m));
  18. backendModels.forEach(m => map.set(m.id, m));
  19. setModelConfigs(Array.from(map.values()));
  20. } catch {
  21. setModelConfigs(DEFAULT_MODELS);
  22. }
  23. }, [apiKey]);
  24. useEffect(() => { fetchModels(); }, [fetchModels]);
  25. const handleUpdateModels = useCallback(async (action: 'create' | 'update' | 'delete', model: ModelConfig) => {
  26. if (!apiKey) return;
  27. if (action === 'create') await modelConfigService.create(apiKey, model);
  28. else if (action === 'update') await modelConfigService.update(apiKey, model.id, model);
  29. else if (action === 'delete') await modelConfigService.remove(apiKey, model.id);
  30. await fetchModels();
  31. }, [apiKey, fetchModels]);
  32. return (
  33. <SettingsView
  34. models={modelConfigs}
  35. onUpdateModels={handleUpdateModels}
  36. authToken={apiKey}
  37. isAdmin={user?.role === 'TENANT_ADMIN' || user?.role === 'SUPER_ADMIN'}
  38. currentUser={user}
  39. initialTab={initialTab}
  40. />
  41. );
  42. }