feat: i18n 翻译覆盖 + DB 动态数据 + 模型选择器 API
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
'use client';
|
||||
|
||||
import { useState } from 'react';
|
||||
import { AVAILABLE_MODELS, type ModelOption } from '@/lib/models';
|
||||
import { useState, useEffect } from 'react';
|
||||
import { AVAILABLE_MODELS as FALLBACK_MODELS, type ModelOption } from '@/lib/models';
|
||||
import { API_BASE } from '@/lib/config';
|
||||
|
||||
interface ModelSelectorProps {
|
||||
value: string;
|
||||
@@ -11,7 +12,25 @@ interface ModelSelectorProps {
|
||||
|
||||
export function ModelSelector({ value, onChange, className = '' }: ModelSelectorProps) {
|
||||
const [open, setOpen] = useState(false);
|
||||
const selected = AVAILABLE_MODELS.find(m => m.id === value) || AVAILABLE_MODELS[0];
|
||||
const [models, setModels] = useState<ModelOption[]>(FALLBACK_MODELS);
|
||||
|
||||
useEffect(() => {
|
||||
fetch(`${API_BASE}/public/models`)
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.items?.length) {
|
||||
setModels(data.items.map((m: any) => ({
|
||||
id: m.id,
|
||||
label: m.name,
|
||||
provider: m.provider,
|
||||
desc: m.description || '',
|
||||
})));
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
}, []);
|
||||
|
||||
const selected = models.find(m => m.id === value) || models[0];
|
||||
|
||||
return (
|
||||
<div className={`relative ${className}`}>
|
||||
@@ -27,7 +46,7 @@ export function ModelSelector({ value, onChange, className = '' }: ModelSelector
|
||||
<>
|
||||
<div className="fixed inset-0 z-10" onClick={() => setOpen(false)} />
|
||||
<div className="absolute right-0 top-full mt-1 z-20 w-64 bg-card border border-border rounded-xl shadow-lg overflow-hidden">
|
||||
{AVAILABLE_MODELS.map(m => (
|
||||
{models.map(m => (
|
||||
<button key={m.id} onClick={() => { onChange(m.id); setOpen(false); }}
|
||||
className={`w-full text-left px-4 py-3 hover:bg-accent transition-colors flex items-center gap-3 ${m.id === value ? 'bg-accent' : ''}`}>
|
||||
<span className={`w-2 h-2 rounded-full shrink-0 ${m.id === value ? 'bg-brand-600' : 'bg-muted-foreground/30'}`} />
|
||||
|
||||
Reference in New Issue
Block a user