Browse Source

feat(15-01): filter provider icons in ModelSearchDialog to available providers

- Gemini and fal.ai always shown (always-available providers)
- Replicate, Kie.ai, WaveSpeed icons only shown when API key is configured
- Reset provider filter to "all" if selected provider becomes unavailable
- Fix WaveSpeed active color from orange to purple (matching its badge color)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 4 months ago
parent
commit
7ba6b91db4
  1. 138
      src/components/modals/ModelSearchDialog.tsx

138
src/components/modals/ModelSearchDialog.tsx

@ -405,6 +405,22 @@ export function ModelSearchDialog({
} }
}; };
// Compute which providers are available based on API keys
const availableProviders = useMemo(() => {
const providers = new Set<ProviderType>(["gemini", "fal"]); // Always available
if (replicateApiKey) providers.add("replicate");
if (kieApiKey) providers.add("kie");
if (wavespeedApiKey) providers.add("wavespeed");
return providers;
}, [replicateApiKey, kieApiKey, wavespeedApiKey]);
// Reset provider filter if current selection becomes unavailable
useEffect(() => {
if (providerFilter !== "all" && !availableProviders.has(providerFilter as ProviderType)) {
setProviderFilter("all");
}
}, [providerFilter, availableProviders]);
// Filter recent models by capability // Filter recent models by capability
const filteredRecentModels = useMemo(() => { const filteredRecentModels = useMemo(() => {
return recentModels return recentModels
@ -585,7 +601,7 @@ export function ModelSearchDialog({
/> />
</div> </div>
{/* Provider Filter - Icon Buttons */} {/* Provider Filter - Icon Buttons (only show available providers) */}
<div className="flex items-center gap-0.5 bg-neutral-700/50 rounded p-0.5"> <div className="flex items-center gap-0.5 bg-neutral-700/50 rounded p-0.5">
<button <button
onClick={() => setProviderFilter("all")} onClick={() => setProviderFilter("all")}
@ -598,61 +614,71 @@ export function ModelSearchDialog({
> >
All All
</button> </button>
<button {availableProviders.has("gemini") && (
onClick={() => setProviderFilter("gemini")} <button
title="Gemini" onClick={() => setProviderFilter("gemini")}
className={`p-2 rounded transition-colors ${ title="Gemini"
providerFilter === "gemini" className={`p-2 rounded transition-colors ${
? "bg-green-500/20 text-green-300" providerFilter === "gemini"
: "text-neutral-400 hover:text-green-300 hover:bg-neutral-700" ? "bg-green-500/20 text-green-300"
}`} : "text-neutral-400 hover:text-green-300 hover:bg-neutral-700"
> }`}
<GeminiIcon /> >
</button> <GeminiIcon />
<button </button>
onClick={() => setProviderFilter("replicate")} )}
title="Replicate" {availableProviders.has("replicate") && (
className={`p-2 rounded transition-colors ${ <button
providerFilter === "replicate" onClick={() => setProviderFilter("replicate")}
? "bg-blue-500/20 text-blue-300" title="Replicate"
: "text-neutral-400 hover:text-blue-300 hover:bg-neutral-700" className={`p-2 rounded transition-colors ${
}`} providerFilter === "replicate"
> ? "bg-blue-500/20 text-blue-300"
<ReplicateIcon /> : "text-neutral-400 hover:text-blue-300 hover:bg-neutral-700"
</button> }`}
<button >
onClick={() => setProviderFilter("fal")} <ReplicateIcon />
title="fal.ai" </button>
className={`p-2 rounded transition-colors ${ )}
providerFilter === "fal" {availableProviders.has("fal") && (
? "bg-yellow-500/20 text-yellow-300" <button
: "text-neutral-400 hover:text-yellow-300 hover:bg-neutral-700" onClick={() => setProviderFilter("fal")}
}`} title="fal.ai"
> className={`p-2 rounded transition-colors ${
<FalIcon /> providerFilter === "fal"
</button> ? "bg-yellow-500/20 text-yellow-300"
<button : "text-neutral-400 hover:text-yellow-300 hover:bg-neutral-700"
onClick={() => setProviderFilter("kie")} }`}
title="Kie.ai" >
className={`p-2 rounded transition-colors ${ <FalIcon />
providerFilter === "kie" </button>
? "bg-orange-500/20 text-orange-300" )}
: "text-neutral-400 hover:text-orange-300 hover:bg-neutral-700" {availableProviders.has("kie") && (
}`} <button
> onClick={() => setProviderFilter("kie")}
<KieIcon /> title="Kie.ai"
</button> className={`p-2 rounded transition-colors ${
<button providerFilter === "kie"
onClick={() => setProviderFilter("wavespeed")} ? "bg-orange-500/20 text-orange-300"
title="WaveSpeed" : "text-neutral-400 hover:text-orange-300 hover:bg-neutral-700"
className={`p-2 rounded transition-colors ${ }`}
providerFilter === "wavespeed" >
? "bg-orange-500/20 text-orange-300" <KieIcon />
: "text-neutral-400 hover:text-orange-300 hover:bg-neutral-700" </button>
}`} )}
> {availableProviders.has("wavespeed") && (
<WaveSpeedIcon /> <button
</button> onClick={() => setProviderFilter("wavespeed")}
title="WaveSpeed"
className={`p-2 rounded transition-colors ${
providerFilter === "wavespeed"
? "bg-purple-500/20 text-purple-300"
: "text-neutral-400 hover:text-purple-300 hover:bg-neutral-700"
}`}
>
<WaveSpeedIcon />
</button>
)}
</div> </div>
{/* Capability Filter */} {/* Capability Filter */}

Loading…
Cancel
Save