diff --git a/src/components/chat/view/subcomponents/ModelSelectorBar.tsx b/src/components/chat/view/subcomponents/ModelSelectorBar.tsx index 602fc36..a4bd938 100644 --- a/src/components/chat/view/subcomponents/ModelSelectorBar.tsx +++ b/src/components/chat/view/subcomponents/ModelSelectorBar.tsx @@ -1,5 +1,5 @@ import { useState, useRef, useEffect } from 'react'; -import { ChevronDown, Globe } from 'lucide-react'; +import { ChevronDown, Globe, RefreshCw } from 'lucide-react'; import type { LLMProvider } from '../../../../types/app'; import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo'; @@ -19,6 +19,7 @@ interface ModelSelectorBarProps { codexModelOptions: ModelOption[]; geminiModelOptions: ModelOption[]; cursorModelOptions: ModelOption[]; + onRefreshModels?: () => Promise; } function useCurrentModel( @@ -57,9 +58,11 @@ export default function ModelSelectorBar({ codexModelOptions, geminiModelOptions, cursorModelOptions, + onRefreshModels, }: ModelSelectorBarProps) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(''); + const [isRefreshing, setIsRefreshing] = useState(false); const dropdownRef = useRef(null); const searchRef = useRef(null); @@ -101,6 +104,16 @@ export default function ModelSelectorBar({ setSearch(''); }; + const handleRefresh = async () => { + if (!onRefreshModels || isRefreshing) return; + setIsRefreshing(true); + try { + await onRefreshModels(); + } finally { + setIsRefreshing(false); + } + }; + return (
{/* Left: provider label */} @@ -109,59 +122,73 @@ export default function ModelSelectorBar({ {provider}
- {/* Right: model picker */} -
- - - {open && ( -
-
- setSearch(e.target.value)} - onClick={(e) => e.stopPropagation()} - placeholder="Search models..." - className="w-full rounded-lg bg-muted/50 px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground/50 outline-none border border-border/40 focus:border-border" - /> -
-
- {filtered.length === 0 ? ( -

No models found

- ) : ( - filtered.map((opt) => ( - - )) - )} -
-
+ {/* Right: model picker + refresh */} +
+ {provider === 'claude' && onRefreshModels && ( + )} + +
+ + + {open && ( +
+
+ setSearch(e.target.value)} + onClick={(e) => e.stopPropagation()} + placeholder="Search models..." + className="w-full rounded-lg bg-muted/50 px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground/50 outline-none border border-border/40 focus:border-border" + /> +
+
+ {filtered.length === 0 ? ( +

No models found

+ ) : ( + filtered.map((opt) => ( + + )) + )} +
+
+ )} +
);