diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx index 92d10d2a2..b4acba71b 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/ConversationModelSelect.tsx @@ -1,5 +1,5 @@ import { Check, ChevronDown, RefreshCcw } from 'lucide-react'; -import { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { resolveTauriInvoke } from '../../app/tauri'; import type { GameCreatorAppConfigView } from '../../app/types'; @@ -9,21 +9,26 @@ import { } from '../../services/clientApi'; export function ConversationModelSelect({ + className, disabled, + lazy = false, onReady, }: { + className?: string; disabled: boolean; - onReady: (ready: boolean) => void; + lazy?: boolean; + onReady?: (ready: boolean) => void; }) { const [models, setModels] = useState([]); const [selected, setSelected] = useState(''); - const [busy, setBusy] = useState(true); + const [busy, setBusy] = useState(!lazy); const [error, setError] = useState(''); const [open, setOpen] = useState(false); + const initializedRef = useRef(false); const refresh = useCallback(async () => { setBusy(true); setError(''); - onReady(false); + onReady?.(false); try { const invoke = resolveTauriInvoke(); if (!invoke) throw new Error('Native host unavailable'); @@ -43,7 +48,7 @@ export function ConversationModelSelect({ if (saved.config.selectedModelId !== id) throw new Error('Default selection was not saved'); } - onReady(available); + onReady?.(available); if (!available) setError('请选择可用模型'); } catch { setModels([]); @@ -54,11 +59,12 @@ export function ConversationModelSelect({ }, [onReady]); useEffect(() => { + if (lazy) return; void refresh(); - }, [refresh]); + }, [refresh, lazy]); async function select(id: string) { - onReady(false); + onReady?.(false); setBusy(true); setError(''); try { @@ -71,7 +77,7 @@ export function ConversationModelSelect({ if (result.config.selectedModelId !== id) throw new Error('Selection was not saved'); setSelected(id); - onReady(true); + onReady?.(true); } catch { setError('模型选择保存失败'); } finally { @@ -80,7 +86,13 @@ export function ConversationModelSelect({ } return ( -
+
{error ? {error} : null}