From 4f9afd798c6b7f13617867d90930d5e7f59cf1fa Mon Sep 17 00:00:00 2001 From: shrimbly Date: Tue, 3 Mar 2026 23:14:33 +1300 Subject: [PATCH] refactor: match GenerateVideoControls to GenerateImageControls pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove provider and model dropdowns from the video control panel, replacing them with the cleaner model name + provider display block with Browse button — matching the image node's updated layout. Co-Authored-By: Claude Opus 4.6 --- src/components/nodes/ControlPanel.tsx | 142 ++++++-------------------- 1 file changed, 32 insertions(+), 110 deletions(-) diff --git a/src/components/nodes/ControlPanel.tsx b/src/components/nodes/ControlPanel.tsx index 99540203..93d795a0 100644 --- a/src/components/nodes/ControlPanel.tsx +++ b/src/components/nodes/ControlPanel.tsx @@ -496,89 +496,10 @@ function GenerateImageControls({ node }: { node: Node }) { function GenerateVideoControls({ node }: { node: Node }) { const nodeData = node.data as GenerateVideoNodeData; const updateNodeData = useWorkflowStore((state) => state.updateNodeData); - const { replicateApiKey, falApiKey, kieApiKey, replicateEnabled, kieEnabled } = useProviderApiKeys(); - const [externalModels, setExternalModels] = useState([]); - const [isLoadingModels, setIsLoadingModels] = useState(false); - const [modelsFetchError, setModelsFetchError] = useState(null); const [isBrowseDialogOpen, setIsBrowseDialogOpen] = useState(false); const currentProvider: ProviderType = nodeData.selectedModel?.provider || "fal"; - const enabledProviders = useMemo(() => { - const providers: { id: ProviderType; name: string }[] = []; - providers.push({ id: "fal", name: "fal.ai" }); - if (replicateEnabled && replicateApiKey) { - providers.push({ id: "replicate", name: "Replicate" }); - } - if (kieEnabled && kieApiKey) { - providers.push({ id: "kie", name: "Kie.ai" }); - } - return providers; - }, [replicateEnabled, replicateApiKey, kieEnabled, kieApiKey]); - - const fetchModels = useCallback(async () => { - setIsLoadingModels(true); - setModelsFetchError(null); - try { - const capabilities = VIDEO_CAPABILITIES.join(","); - const headers: HeadersInit = {}; - if (replicateApiKey) headers["X-Replicate-Key"] = replicateApiKey; - if (falApiKey) headers["X-Fal-Key"] = falApiKey; - if (kieApiKey) headers["X-Kie-Key"] = kieApiKey; - - const response = await deduplicatedFetch(`/api/models?provider=${currentProvider}&capabilities=${capabilities}`, { headers }); - if (response.ok) { - const data = await response.json(); - setExternalModels(data.models || []); - setModelsFetchError(null); - } else { - const errorData = await response.json().catch(() => ({})); - setExternalModels([]); - setModelsFetchError(errorData.error || `Failed to load models`); - } - } catch (error) { - console.error("Failed to fetch models:", error); - setExternalModels([]); - setModelsFetchError("Failed to load models"); - } finally { - setIsLoadingModels(false); - } - }, [currentProvider, replicateApiKey, falApiKey, kieApiKey]); - - useEffect(() => { - fetchModels(); - }, [fetchModels]); - - const handleProviderChange = useCallback( - (e: React.ChangeEvent) => { - const provider = e.target.value as ProviderType; - const newSelectedModel: SelectedModel = { - provider, - modelId: "", - displayName: "Select model...", - }; - updateNodeData(node.id, { selectedModel: newSelectedModel, parameters: {} }); - }, - [node.id, updateNodeData] - ); - - const handleModelChange = useCallback( - (e: React.ChangeEvent) => { - const modelId = e.target.value; - const model = externalModels.find(m => m.id === modelId); - if (model) { - const newSelectedModel: SelectedModel = { - provider: currentProvider, - modelId: model.id, - displayName: model.name, - capabilities: model.capabilities, - }; - updateNodeData(node.id, { selectedModel: newSelectedModel, parameters: {} }); - } - }, - [node.id, currentProvider, externalModels, updateNodeData] - ); - const handleParametersChange = useCallback( (parameters: Record) => { updateNodeData(node.id, { parameters }); @@ -600,43 +521,44 @@ function GenerateVideoControls({ node }: { node: Node }) { return ( <>
-
- - -
- -
- -
- + {/* Model name + provider with link */} +
+
+
+
+ {nodeData.selectedModel?.displayName || "Select model..."} +
+
+ + {getProviderDisplayName(currentProvider)} + + {nodeData.selectedModel?.modelId && ( + { + if (!getModelPageUrl(currentProvider, nodeData.selectedModel?.modelId || "")) { + e.preventDefault(); + } + }} + > + + + + + )} +
+
- {modelsFetchError && ( -

{modelsFetchError}

- )}
{nodeData.selectedModel?.modelId && (